From fe70aa540450b25a1adf501cd26a87f54304b82d Mon Sep 17 00:00:00 2001 From: edmand46 Date: Mon, 23 Mar 2026 12:52:30 +0300 Subject: [PATCH] feat: added benchmarks --- .gitignore | 6 + Dockerfile.bench | 10 + Makefile | 35 + README.md | 40 +- benchmarks/arpackmsg/messages.go | 39 + benchmarks/arpackmsg/messages_gen.go | 221 ++++ benchmarks/bench_test.go | 217 ++++ benchmarks/flatbuffers/move_fb.go | 174 +++ benchmarks/proto/move.pb.go | 253 ++++ benchmarks/proto/move.proto | 20 + benchmarks/unity/Assets/Benchmarks.meta | 8 + .../Assets/Benchmarks/BenchmarkRunner.cs | 141 +++ .../Assets/Benchmarks/BenchmarkRunner.cs.meta | 2 + .../unity/Assets/Benchmarks/Benchmarks.asmdef | 16 + .../Assets/Benchmarks/Benchmarks.asmdef.meta | 7 + .../unity/Assets/Benchmarks/Messages.gen.cs | 206 ++++ .../Assets/Benchmarks/Messages.gen.cs.meta | 2 + benchmarks/unity/Assets/Benchmarks/Move.cs | 768 ++++++++++++ .../unity/Assets/Benchmarks/Move.cs.meta | 2 + .../Assets/InputSystem_Actions.inputactions | 1057 +++++++++++++++++ .../InputSystem_Actions.inputactions.meta | 14 + benchmarks/unity/Assets/Plugins.meta | 8 + .../unity/Assets/Plugins/Google.Protobuf.dll | Bin 0 -> 485472 bytes .../Assets/Plugins/Google.Protobuf.dll.meta | 2 + benchmarks/unity/Assets/Scenes.meta | 8 + .../unity/Assets/Scenes/SampleScene.unity | 231 ++++ .../Assets/Scenes/SampleScene.unity.meta | 7 + benchmarks/unity/Benchmarks.csproj | 887 ++++++++++++++ .../unity/ProjectSettings/AudioManager.asset | 19 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../ProjectSettings/DynamicsManager.asset | 37 + .../ProjectSettings/EditorBuildSettings.asset | 13 + .../ProjectSettings/EditorSettings.asset | 50 + .../ProjectSettings/GraphicsSettings.asset | 64 + .../unity/ProjectSettings/InputManager.asset | 487 ++++++++ .../ProjectSettings/MemorySettings.asset | 35 + .../ProjectSettings/MultiplayerManager.asset | 7 + .../unity/ProjectSettings/NavMeshAreas.asset | 93 ++ .../ProjectSettings/NetworkManager.asset | 8 + .../PackageManagerSettings.asset | 44 + .../ProjectSettings/Physics2DSettings.asset | 56 + .../unity/ProjectSettings/PresetManager.asset | 7 + .../ProjectSettings/ProjectSettings.asset | 736 ++++++++++++ .../unity/ProjectSettings/ProjectVersion.txt | 2 + .../ProjectSettings/QualitySettings.asset | 239 ++++ .../SceneTemplateSettings.json | 121 ++ .../unity/ProjectSettings/TagManager.asset | 43 + .../unity/ProjectSettings/TimeManager.asset | 9 + .../UnityConnectSettings.asset | 40 + .../unity/ProjectSettings/VFXManager.asset | 14 + .../VersionControlSettings.asset | 8 + .../unity/ProjectSettings/XRSettings.asset | 10 + benchmarks/unity/unity.sln | 17 + go.mod | 7 + go.sum | 6 + 55 files changed, 6558 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.bench create mode 100644 Makefile create mode 100644 benchmarks/arpackmsg/messages.go create mode 100644 benchmarks/arpackmsg/messages_gen.go create mode 100644 benchmarks/bench_test.go create mode 100644 benchmarks/flatbuffers/move_fb.go create mode 100644 benchmarks/proto/move.pb.go create mode 100644 benchmarks/proto/move.proto create mode 100644 benchmarks/unity/Assets/Benchmarks.meta create mode 100644 benchmarks/unity/Assets/Benchmarks/BenchmarkRunner.cs create mode 100644 benchmarks/unity/Assets/Benchmarks/BenchmarkRunner.cs.meta create mode 100644 benchmarks/unity/Assets/Benchmarks/Benchmarks.asmdef create mode 100644 benchmarks/unity/Assets/Benchmarks/Benchmarks.asmdef.meta create mode 100644 benchmarks/unity/Assets/Benchmarks/Messages.gen.cs create mode 100644 benchmarks/unity/Assets/Benchmarks/Messages.gen.cs.meta create mode 100644 benchmarks/unity/Assets/Benchmarks/Move.cs create mode 100644 benchmarks/unity/Assets/Benchmarks/Move.cs.meta create mode 100644 benchmarks/unity/Assets/InputSystem_Actions.inputactions create mode 100644 benchmarks/unity/Assets/InputSystem_Actions.inputactions.meta create mode 100644 benchmarks/unity/Assets/Plugins.meta create mode 100755 benchmarks/unity/Assets/Plugins/Google.Protobuf.dll create mode 100644 benchmarks/unity/Assets/Plugins/Google.Protobuf.dll.meta create mode 100644 benchmarks/unity/Assets/Scenes.meta create mode 100644 benchmarks/unity/Assets/Scenes/SampleScene.unity create mode 100644 benchmarks/unity/Assets/Scenes/SampleScene.unity.meta create mode 100644 benchmarks/unity/Benchmarks.csproj create mode 100644 benchmarks/unity/ProjectSettings/AudioManager.asset create mode 100644 benchmarks/unity/ProjectSettings/ClusterInputManager.asset create mode 100644 benchmarks/unity/ProjectSettings/DynamicsManager.asset create mode 100644 benchmarks/unity/ProjectSettings/EditorBuildSettings.asset create mode 100644 benchmarks/unity/ProjectSettings/EditorSettings.asset create mode 100644 benchmarks/unity/ProjectSettings/GraphicsSettings.asset create mode 100644 benchmarks/unity/ProjectSettings/InputManager.asset create mode 100644 benchmarks/unity/ProjectSettings/MemorySettings.asset create mode 100644 benchmarks/unity/ProjectSettings/MultiplayerManager.asset create mode 100644 benchmarks/unity/ProjectSettings/NavMeshAreas.asset create mode 100644 benchmarks/unity/ProjectSettings/NetworkManager.asset create mode 100644 benchmarks/unity/ProjectSettings/PackageManagerSettings.asset create mode 100644 benchmarks/unity/ProjectSettings/Physics2DSettings.asset create mode 100644 benchmarks/unity/ProjectSettings/PresetManager.asset create mode 100644 benchmarks/unity/ProjectSettings/ProjectSettings.asset create mode 100644 benchmarks/unity/ProjectSettings/ProjectVersion.txt create mode 100644 benchmarks/unity/ProjectSettings/QualitySettings.asset create mode 100644 benchmarks/unity/ProjectSettings/SceneTemplateSettings.json create mode 100644 benchmarks/unity/ProjectSettings/TagManager.asset create mode 100644 benchmarks/unity/ProjectSettings/TimeManager.asset create mode 100644 benchmarks/unity/ProjectSettings/UnityConnectSettings.asset create mode 100644 benchmarks/unity/ProjectSettings/VFXManager.asset create mode 100644 benchmarks/unity/ProjectSettings/VersionControlSettings.asset create mode 100644 benchmarks/unity/ProjectSettings/XRSettings.asset create mode 100644 benchmarks/unity/unity.sln create mode 100644 go.sum diff --git a/.gitignore b/.gitignore index ced27ed..a00e1d2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,12 @@ .codex .DS_Store +Library +Logs +Packages +Temp +UserSettings + .idea bin obj diff --git a/Dockerfile.bench b/Dockerfile.bench new file mode 100644 index 0000000..61836d7 --- /dev/null +++ b/Dockerfile.bench @@ -0,0 +1,10 @@ +FROM golang:1.21-bookworm + +RUN apt-get update && apt-get install -y --no-install-recommends \ + protobuf-compiler \ + flatbuffers-compiler \ + && rm -rf /var/lib/apt/lists/* + +RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.36.11 + +WORKDIR /workspace diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..01f4f2e --- /dev/null +++ b/Makefile @@ -0,0 +1,35 @@ +UNITY_ASSETS := benchmarks/unity/Assets + +.PHONY: bench-image generate bench size gen-unity + +IMAGE := arpack-bench + +bench-image: + docker build -f Dockerfile.bench -t $(IMAGE) . + +generate: + go run ./cmd/arpack -in benchmarks/arpackmsg/messages.go -out-go benchmarks/arpackmsg + protoc --go_out=. --go_opt=paths=source_relative benchmarks/proto/move.proto + +generate-docker: bench-image + docker run --rm -v "$(PWD):/workspace" -w /workspace $(IMAGE) make generate + +bench: + go test ./benchmarks/... -bench=. -benchmem -count=1 -run=^$$ + +size: + go test ./benchmarks/... -run=TestMessageSize -v + +bench-docker: bench-image + docker run --rm -v "$(PWD):/workspace" -w /workspace $(IMAGE) make bench + +gen-unity: + mkdir -p "$(UNITY_ASSETS)/Benchmarks" + go run ./cmd/arpack \ + -in benchmarks/arpackmsg/messages.go \ + -out-cs "$(UNITY_ASSETS)/Benchmarks/" \ + -cs-namespace Arpack.Messages + protoc -I benchmarks/proto \ + --csharp_out="$(UNITY_ASSETS)/Benchmarks/" \ + benchmarks/proto/move.proto + @echo "Done. Attach BenchmarkRunner to a GameObject in SampleScene and press Play." diff --git a/README.md b/README.md index 0f9276f..f3f8a8f 100644 --- a/README.md +++ b/README.md @@ -143,10 +143,48 @@ Uses unsafe pointers for zero-copy serialization. Returns bytes written/consumed - Booleans packed as bitfields (LSB first, up to 8 per byte) - Quantized floats stored as `uint8` or `uint16` +## Benchmarks Go Results (M3 Max) + +``` +BenchmarkArPack_Marshal-16 382568360 9.5 ns/op 5065 MB/s 0 B/op 0 allocs/op +BenchmarkArPack_Unmarshal-16 98895892 34.6 ns/op 1388 MB/s 40 B/op 2 allocs/op +BenchmarkProto_Marshal-16 21989466 163.6 ns/op 416 MB/s 0 B/op 0 allocs/op +BenchmarkProto_Unmarshal-16 13950333 256.9 ns/op 265 MB/s 248 B/op 7 allocs/op +BenchmarkFlatBuffers_Marshal-16 16297458 221.4 ns/op 687 MB/s 0 B/op 0 allocs/op +BenchmarkFlatBuffers_Unmarshal-16 56095480 64.8 ns/op 2345 MB/s 24 B/op 1 allocs/op +``` + +| Format | Size | +|---|---| +| ArPack | 48 bytes | +| Protobuf | 68 bytes | +| FlatBuffers | 152 bytes | + +```bash +go test ./benchmarks/... -bench=. -benchmem +``` + +### Benchmarks Unity Mono (M3 Max) + +``` +ArPack Serialize: 96.7 ns/op | 0 B/op +ArPack Deserialize: 205.4 ns/op | 0 B/op +Proto Serialize (alloc): 930.2 ns/op | 0 B/op +Proto Deserialize (alloc): 1621.2 ns/op | 29 B/op +Proto Serialize (reuse): 652.7 ns/op | 0 B/op +``` + +ArPack serialize is ~10× faster than Protobuf in Unity. Protobuf deserialize allocates on every call — a GC pressure source in hot game loops. ArPack deserialize is zero-alloc. + +```bash +make gen-unity +# then attach BenchmarkRunner to any GameObject in SampleScene and press Play +``` + ## Running Tests ```bash -# Unit tests +# Unit tests go test ./parser/... ./generator/... # End-to-end cross-language tests diff --git a/benchmarks/arpackmsg/messages.go b/benchmarks/arpackmsg/messages.go new file mode 100644 index 0000000..8099f4a --- /dev/null +++ b/benchmarks/arpackmsg/messages.go @@ -0,0 +1,39 @@ +package arpackmsg + +type Vector3 struct { + X float32 `pack:"min=-500,max=500,bits=16"` + Y float32 `pack:"min=-500,max=500,bits=16"` + Z float32 `pack:"min=-500,max=500,bits=16"` +} + +type Opcode uint16 + +const ( + OpcodeUnknown Opcode = iota + OpcodeAuthorize + OpcodeJoinRoom +) + +type MoveMessage struct { + Position Vector3 + Velocity [3]float32 + Waypoints []Vector3 + PlayerID uint32 + Active bool + Visible bool + Ghost bool + Name string +} + +type SpawnMessage struct { + EntityID uint64 + Position Vector3 + Health int16 + Tags []string + Data []uint8 +} + +type EnvelopeMessage struct { + Code Opcode + Counter uint8 +} diff --git a/benchmarks/arpackmsg/messages_gen.go b/benchmarks/arpackmsg/messages_gen.go new file mode 100644 index 0000000..bf19f82 --- /dev/null +++ b/benchmarks/arpackmsg/messages_gen.go @@ -0,0 +1,221 @@ +// Code generated by arpack. DO NOT EDIT. + +package arpackmsg + +import ( + "encoding/binary" + "errors" + "math" +) + +func (m *Vector3) Marshal(buf []byte) []byte { + _qm_X := uint16((m.X - (-500)) / (500 - (-500)) * 65535) + buf = binary.LittleEndian.AppendUint16(buf, _qm_X) + _qm_Y := uint16((m.Y - (-500)) / (500 - (-500)) * 65535) + buf = binary.LittleEndian.AppendUint16(buf, _qm_Y) + _qm_Z := uint16((m.Z - (-500)) / (500 - (-500)) * 65535) + buf = binary.LittleEndian.AppendUint16(buf, _qm_Z) + return buf +} + +func (m *Vector3) Unmarshal(data []byte) (int, error) { + if len(data) < 6 { + return 0, errors.New("arpack: buffer too short for Vector3") + } + offset := 0 + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + _qm_X := binary.LittleEndian.Uint16(data[offset:]) + offset += 2 + m.X = float32(_qm_X)/65535*(500-(-500)) + (-500) + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + _qm_Y := binary.LittleEndian.Uint16(data[offset:]) + offset += 2 + m.Y = float32(_qm_Y)/65535*(500-(-500)) + (-500) + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + _qm_Z := binary.LittleEndian.Uint16(data[offset:]) + offset += 2 + m.Z = float32(_qm_Z)/65535*(500-(-500)) + (-500) + return offset, nil +} + +func (m *MoveMessage) Marshal(buf []byte) []byte { + buf = m.Position.Marshal(buf) + for _iVelocity := 0; _iVelocity < 3; _iVelocity++ { + buf = binary.LittleEndian.AppendUint32(buf, math.Float32bits(m.Velocity[_iVelocity])) + } + buf = binary.LittleEndian.AppendUint16(buf, uint16(len(m.Waypoints))) + for _iWaypoints := range m.Waypoints { + buf = m.Waypoints[_iWaypoints].Marshal(buf) + } + buf = binary.LittleEndian.AppendUint32(buf, m.PlayerID) + var _boolByte4 uint8 + if m.Active { + _boolByte4 |= 1 << 0 + } + if m.Visible { + _boolByte4 |= 1 << 1 + } + if m.Ghost { + _boolByte4 |= 1 << 2 + } + buf = append(buf, _boolByte4) + buf = binary.LittleEndian.AppendUint16(buf, uint16(len(m.Name))) + buf = append(buf, m.Name...) + return buf +} + +func (m *MoveMessage) Unmarshal(data []byte) (int, error) { + if len(data) < 23 { + return 0, errors.New("arpack: buffer too short for MoveMessage") + } + offset := 0 + _nPosition, _err := m.Position.Unmarshal(data[offset:]) + if _err != nil { + return 0, _err + } + offset += _nPosition + for _iVelocity := 0; _iVelocity < 3; _iVelocity++ { + if len(data) < offset+4 { + return 0, errors.New("arpack: buffer too short") + } + m.Velocity[_iVelocity] = math.Float32frombits(binary.LittleEndian.Uint32(data[offset:])) + offset += 4 + } + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + _lenWaypoints := int(binary.LittleEndian.Uint16(data[offset:])) + offset += 2 + m.Waypoints = make([]Vector3, _lenWaypoints) + for _iWaypoints := 0; _iWaypoints < _lenWaypoints; _iWaypoints++ { + _nWaypoints__iWaypoints_, _err := m.Waypoints[_iWaypoints].Unmarshal(data[offset:]) + if _err != nil { + return 0, _err + } + offset += _nWaypoints__iWaypoints_ + } + if len(data) < offset+4 { + return 0, errors.New("arpack: buffer too short") + } + m.PlayerID = binary.LittleEndian.Uint32(data[offset:]) + offset += 4 + if len(data) < offset+1 { + return 0, errors.New("arpack: buffer too short") + } + _boolByte4 := data[offset] + offset++ + m.Active = _boolByte4&(1<<0) != 0 + m.Visible = _boolByte4&(1<<1) != 0 + m.Ghost = _boolByte4&(1<<2) != 0 + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + _slenm_Name := int(binary.LittleEndian.Uint16(data[offset:])) + offset += 2 + if len(data) < offset+_slenm_Name { + return 0, errors.New("arpack: buffer too short") + } + m.Name = string(data[offset : offset+_slenm_Name]) + offset += _slenm_Name + return offset, nil +} + +func (m *SpawnMessage) Marshal(buf []byte) []byte { + buf = binary.LittleEndian.AppendUint64(buf, m.EntityID) + buf = m.Position.Marshal(buf) + buf = binary.LittleEndian.AppendUint16(buf, uint16(m.Health)) + buf = binary.LittleEndian.AppendUint16(buf, uint16(len(m.Tags))) + for _iTags := range m.Tags { + buf = binary.LittleEndian.AppendUint16(buf, uint16(len(m.Tags[_iTags]))) + buf = append(buf, m.Tags[_iTags]...) + } + buf = binary.LittleEndian.AppendUint16(buf, uint16(len(m.Data))) + for _iData := range m.Data { + buf = append(buf, m.Data[_iData]) + } + return buf +} + +func (m *SpawnMessage) Unmarshal(data []byte) (int, error) { + if len(data) < 16 { + return 0, errors.New("arpack: buffer too short for SpawnMessage") + } + offset := 0 + if len(data) < offset+8 { + return 0, errors.New("arpack: buffer too short") + } + m.EntityID = binary.LittleEndian.Uint64(data[offset:]) + offset += 8 + _nPosition, _err := m.Position.Unmarshal(data[offset:]) + if _err != nil { + return 0, _err + } + offset += _nPosition + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + m.Health = int16(binary.LittleEndian.Uint16(data[offset:])) + offset += 2 + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + _lenTags := int(binary.LittleEndian.Uint16(data[offset:])) + offset += 2 + m.Tags = make([]string, _lenTags) + for _iTags := 0; _iTags < _lenTags; _iTags++ { + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + _slenm_Tags__iTags_ := int(binary.LittleEndian.Uint16(data[offset:])) + offset += 2 + if len(data) < offset+_slenm_Tags__iTags_ { + return 0, errors.New("arpack: buffer too short") + } + m.Tags[_iTags] = string(data[offset : offset+_slenm_Tags__iTags_]) + offset += _slenm_Tags__iTags_ + } + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + _lenData := int(binary.LittleEndian.Uint16(data[offset:])) + offset += 2 + m.Data = make([]uint8, _lenData) + for _iData := 0; _iData < _lenData; _iData++ { + if len(data) < offset+1 { + return 0, errors.New("arpack: buffer too short") + } + m.Data[_iData] = data[offset] + offset += 1 + } + return offset, nil +} + +func (m *EnvelopeMessage) Marshal(buf []byte) []byte { + buf = binary.LittleEndian.AppendUint16(buf, uint16(m.Code)) + buf = append(buf, m.Counter) + return buf +} + +func (m *EnvelopeMessage) Unmarshal(data []byte) (int, error) { + if len(data) < 3 { + return 0, errors.New("arpack: buffer too short for EnvelopeMessage") + } + offset := 0 + if len(data) < offset+2 { + return 0, errors.New("arpack: buffer too short") + } + m.Code = Opcode(binary.LittleEndian.Uint16(data[offset:])) + offset += 2 + if len(data) < offset+1 { + return 0, errors.New("arpack: buffer too short") + } + m.Counter = data[offset] + offset += 1 + return offset, nil +} diff --git a/benchmarks/bench_test.go b/benchmarks/bench_test.go new file mode 100644 index 0000000..8ef2438 --- /dev/null +++ b/benchmarks/bench_test.go @@ -0,0 +1,217 @@ +package bench_test + +import ( + "fmt" + "testing" + + "github.com/edmand46/arpack/benchmarks/arpackmsg" + benchfbs "github.com/edmand46/arpack/benchmarks/flatbuffers" + benchpb "github.com/edmand46/arpack/benchmarks/proto" + flatbuffers "github.com/google/flatbuffers/go" + "google.golang.org/protobuf/proto" +) + +// testMoveArpack returns a fully populated arpackmsg.MoveMessage for benchmarks. +func testMoveArpack() arpackmsg.MoveMessage { + return arpackmsg.MoveMessage{ + Position: arpackmsg.Vector3{X: 100, Y: -50, Z: 0}, + Velocity: [3]float32{1.5, -2.5, 0}, + Waypoints: []arpackmsg.Vector3{{X: 10, Y: 20, Z: 0}, {X: -10, Y: 0, Z: 100}}, + PlayerID: 999, + Active: true, + Visible: false, + Ghost: true, + Name: "PlayerOne", + } +} + +// testMoveProto returns a fully populated proto MoveMessage for benchmarks. +func testMoveProto() *benchpb.MoveMessage { + return &benchpb.MoveMessage{ + Position: &benchpb.Vector3{X: 100, Y: -50, Z: 0}, + Velocity: []float32{1.5, -2.5, 0}, + Waypoints: []*benchpb.Vector3{ + {X: 10, Y: 20, Z: 0}, + {X: -10, Y: 0, Z: 100}, + }, + PlayerId: 999, + Active: true, + Visible: false, + Ghost: true, + Name: "PlayerOne", + } +} + +// testMoveFbs returns a fully populated benchfbs.MoveMsg for benchmarks. +func testMoveFbs() *benchfbs.MoveMsg { + return &benchfbs.MoveMsg{ + Position: benchfbs.Vec3{X: 100, Y: -50, Z: 0}, + Velocity: [3]float32{1.5, -2.5, 0}, + Waypoints: []benchfbs.Vec3{{X: 10, Y: 20, Z: 0}, {X: -10, Y: 0, Z: 100}}, + PlayerID: 999, + Active: true, + Visible: false, + Ghost: true, + Name: "PlayerOne", + } +} + +// TestMessageSize prints the wire size for each serialization format. +func TestMessageSize(t *testing.T) { + // ArPack + apMsg := testMoveArpack() + apBuf := apMsg.Marshal(nil) + fmt.Printf("ArPack wire size: %d bytes\n", len(apBuf)) + + // Protobuf + pbMsg := testMoveProto() + pbBuf, err := proto.Marshal(pbMsg) + if err != nil { + t.Fatalf("proto.Marshal: %v", err) + } + fmt.Printf("Protobuf wire size: %d bytes\n", len(pbBuf)) + + // FlatBuffers + fbMsg := testMoveFbs() + b := flatbuffers.NewBuilder(256) + fbBuf := benchfbs.Marshal(b, fbMsg) + fmt.Printf("FlatBuf wire size: %d bytes\n", len(fbBuf)) + + // Sanity-check round-trips + var apOut arpackmsg.MoveMessage + if _, err := apOut.Unmarshal(apBuf); err != nil { + t.Fatalf("ArPack Unmarshal: %v", err) + } + if apOut.PlayerID != 999 || apOut.Name != "PlayerOne" { + t.Errorf("ArPack round-trip mismatch: %+v", apOut) + } + + var pbOut benchpb.MoveMessage + if err := proto.Unmarshal(pbBuf, &pbOut); err != nil { + t.Fatalf("proto.Unmarshal: %v", err) + } + if pbOut.PlayerId != 999 || pbOut.Name != "PlayerOne" { + t.Errorf("Proto round-trip mismatch: %+v", pbOut) + } + + var fbOut benchfbs.MoveMsg + benchfbs.Unmarshal(fbBuf, &fbOut) + if fbOut.PlayerID != 999 || fbOut.Name != "PlayerOne" { + t.Errorf("FlatBuffers round-trip mismatch: %+v", fbOut) + } +} + +// --- ArPack benchmarks --- + +func BenchmarkArPack_Marshal(b *testing.B) { + msg := testMoveArpack() + buf := msg.Marshal(nil) + wireSize := len(buf) + + b.ReportAllocs() + b.SetBytes(int64(wireSize)) + b.ResetTimer() + + var out []byte + for i := 0; i < b.N; i++ { + out = msg.Marshal(out[:0]) + } + _ = out +} + +func BenchmarkArPack_Unmarshal(b *testing.B) { + msg := testMoveArpack() + buf := msg.Marshal(nil) + wireSize := len(buf) + + b.ReportAllocs() + b.SetBytes(int64(wireSize)) + b.ResetTimer() + + var out arpackmsg.MoveMessage + for i := 0; i < b.N; i++ { + if _, err := out.Unmarshal(buf); err != nil { + b.Fatal(err) + } + } +} + +// --- Protobuf benchmarks --- + +func BenchmarkProto_Marshal(b *testing.B) { + msg := testMoveProto() + buf, err := proto.Marshal(msg) + if err != nil { + b.Fatal(err) + } + wireSize := len(buf) + + b.ReportAllocs() + b.SetBytes(int64(wireSize)) + b.ResetTimer() + + var out []byte + for i := 0; i < b.N; i++ { + out, err = proto.MarshalOptions{}.MarshalAppend(out[:0], msg) + if err != nil { + b.Fatal(err) + } + } + _ = out +} + +func BenchmarkProto_Unmarshal(b *testing.B) { + msg := testMoveProto() + buf, err := proto.Marshal(msg) + if err != nil { + b.Fatal(err) + } + wireSize := len(buf) + + b.ReportAllocs() + b.SetBytes(int64(wireSize)) + b.ResetTimer() + + var out benchpb.MoveMessage + for i := 0; i < b.N; i++ { + out.Reset() + if err := proto.Unmarshal(buf, &out); err != nil { + b.Fatal(err) + } + } +} + +// --- FlatBuffers benchmarks --- + +func BenchmarkFlatBuffers_Marshal(b *testing.B) { + msg := testMoveFbs() + builder := flatbuffers.NewBuilder(256) + buf := benchfbs.Marshal(builder, msg) + wireSize := len(buf) + + b.ReportAllocs() + b.SetBytes(int64(wireSize)) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + benchfbs.Marshal(builder, msg) + } +} + +func BenchmarkFlatBuffers_Unmarshal(b *testing.B) { + msg := testMoveFbs() + builder := flatbuffers.NewBuilder(256) + buf := benchfbs.Marshal(builder, msg) + wireSize := len(buf) + + b.ReportAllocs() + b.SetBytes(int64(wireSize)) + b.ResetTimer() + + var out benchfbs.MoveMsg + for i := 0; i < b.N; i++ { + out = benchfbs.MoveMsg{} + benchfbs.Unmarshal(buf, &out) + } + _ = out +} diff --git a/benchmarks/flatbuffers/move_fb.go b/benchmarks/flatbuffers/move_fb.go new file mode 100644 index 0000000..7ffba48 --- /dev/null +++ b/benchmarks/flatbuffers/move_fb.go @@ -0,0 +1,174 @@ +package benchfbs + +import ( + flatbuffers "github.com/google/flatbuffers/go" +) + +// Vec3 mirrors the MoveMessage's Vector3 fields for FlatBuffers encoding. +type Vec3 struct { + X, Y, Z float32 +} + +// MoveMsg is the Go struct used in the FlatBuffers benchmark. +type MoveMsg struct { + Position Vec3 + Velocity [3]float32 + Waypoints []Vec3 + PlayerID uint32 + Active, Visible, Ghost bool + Name string +} + +// vtable slot indices for MoveMessage fields (0-based slot -> vtable offset = 4 + 2*slot) +// slot 0 -> position (vtable offset 4) +// slot 1 -> velocity (vtable offset 6) +// slot 2 -> waypoints (vtable offset 8) +// slot 3 -> player_id (vtable offset 10) +// slot 4 -> active (vtable offset 12) +// slot 5 -> visible (vtable offset 14) +// slot 6 -> ghost (vtable offset 16) +// slot 7 -> name (vtable offset 18) +const ( + slotPosition = 0 + slotVelocity = 1 + slotWaypoints = 2 + slotPlayerID = 3 + slotActive = 4 + slotVisible = 5 + slotGhost = 6 + slotName = 7 +) + +// buildVec3 writes a Vec3 as a table with 3 float32 fields and returns its offset. +// Vec3 slots: x=0, y=1, z=2 +func buildVec3(b *flatbuffers.Builder, v Vec3) flatbuffers.UOffsetT { + b.StartObject(3) + b.PrependFloat32Slot(0, v.X, 0) + b.PrependFloat32Slot(1, v.Y, 0) + b.PrependFloat32Slot(2, v.Z, 0) + return b.EndObject() +} + +// Marshal serialises msg into a FlatBuffer using b and returns the finished bytes. +// The builder is reset before use, so callers can reuse it across calls. +func Marshal(b *flatbuffers.Builder, msg *MoveMsg) []byte { + b.Reset() + + // 1. Build all variable-length data first (must be done outside object construction). + + // name string + nameOff := b.CreateString(msg.Name) + + // velocity vector: 3 × float32 + b.StartVector(4, 3, 4) + for i := 2; i >= 0; i-- { + b.PrependFloat32(msg.Velocity[i]) + } + velOff := b.EndVector(3) + + // waypoints vector: repeated Vec3 tables (build each table first, collect offsets) + wpOffsets := make([]flatbuffers.UOffsetT, len(msg.Waypoints)) + for i, wp := range msg.Waypoints { + wpOffsets[i] = buildVec3(b, wp) + } + b.StartVector(4, len(wpOffsets), 4) + for i := len(wpOffsets) - 1; i >= 0; i-- { + b.PrependUOffsetT(wpOffsets[i]) + } + wpVecOff := b.EndVector(len(wpOffsets)) + + // position table + posOff := buildVec3(b, msg.Position) + + // 2. Build the MoveMessage table. + b.StartObject(8) + b.PrependUOffsetTSlot(slotPosition, posOff, 0) + b.PrependUOffsetTSlot(slotVelocity, velOff, 0) + b.PrependUOffsetTSlot(slotWaypoints, wpVecOff, 0) + b.PrependUint32Slot(slotPlayerID, msg.PlayerID, 0) + b.PrependBoolSlot(slotActive, msg.Active, false) + b.PrependBoolSlot(slotVisible, msg.Visible, false) + b.PrependBoolSlot(slotGhost, msg.Ghost, false) + b.PrependUOffsetTSlot(slotName, nameOff, 0) + root := b.EndObject() + + b.Finish(root) + return b.FinishedBytes() +} + +// readVec3 reads a Vec3 from a table at the given absolute position in buf. +func readVec3(buf []byte, tablePos flatbuffers.UOffsetT) Vec3 { + tab := flatbuffers.Table{Bytes: buf, Pos: tablePos} + var v Vec3 + if o := tab.Offset(4); o != 0 { // slot 0 -> vtable offset 4 + v.X = tab.GetFloat32(tab.Pos + flatbuffers.UOffsetT(o)) + } + if o := tab.Offset(6); o != 0 { // slot 1 -> vtable offset 6 + v.Y = tab.GetFloat32(tab.Pos + flatbuffers.UOffsetT(o)) + } + if o := tab.Offset(8); o != 0 { // slot 2 -> vtable offset 8 + v.Z = tab.GetFloat32(tab.Pos + flatbuffers.UOffsetT(o)) + } + return v +} + +// Unmarshal reads all fields from a finished FlatBuffer into out. +func Unmarshal(buf []byte, out *MoveMsg) { + // The root offset is stored at byte 0 of the finished buffer. + rootPos := flatbuffers.GetUOffsetT(buf) + tab := flatbuffers.Table{Bytes: buf, Pos: rootPos} + + // position (slot 0, vtable offset 4) + if o := tab.Offset(4); o != 0 { + absOff := tab.Pos + flatbuffers.UOffsetT(o) + posPos := tab.Indirect(absOff) + out.Position = readVec3(buf, posPos) + } + + // velocity vector (slot 1, vtable offset 6) + if o := tab.Offset(6); o != 0 { + vecStart := tab.Vector(flatbuffers.UOffsetT(o)) + for i := 0; i < 3; i++ { + out.Velocity[i] = flatbuffers.GetFloat32(buf[int(vecStart)+i*4:]) + } + } + + // waypoints vector (slot 2, vtable offset 8) + if o := tab.Offset(8); o != 0 { + n := tab.VectorLen(flatbuffers.UOffsetT(o)) + out.Waypoints = make([]Vec3, n) + vecStart := tab.Vector(flatbuffers.UOffsetT(o)) + for i := 0; i < n; i++ { + // Each element is an UOffsetT pointing to the table. + elemOff := vecStart + flatbuffers.UOffsetT(i*4) + tablePos := elemOff + flatbuffers.GetUOffsetT(buf[elemOff:]) + out.Waypoints[i] = readVec3(buf, tablePos) + } + } + + // player_id (slot 3, vtable offset 10) + if o := tab.Offset(10); o != 0 { + out.PlayerID = tab.GetUint32(tab.Pos + flatbuffers.UOffsetT(o)) + } + + // active (slot 4, vtable offset 12) + if o := tab.Offset(12); o != 0 { + out.Active = tab.GetBool(tab.Pos + flatbuffers.UOffsetT(o)) + } + + // visible (slot 5, vtable offset 14) + if o := tab.Offset(14); o != 0 { + out.Visible = tab.GetBool(tab.Pos + flatbuffers.UOffsetT(o)) + } + + // ghost (slot 6, vtable offset 16) + if o := tab.Offset(16); o != 0 { + out.Ghost = tab.GetBool(tab.Pos + flatbuffers.UOffsetT(o)) + } + + // name (slot 7, vtable offset 18) + if o := tab.Offset(18); o != 0 { + absOff := tab.Pos + flatbuffers.UOffsetT(o) + out.Name = tab.String(absOff) + } +} diff --git a/benchmarks/proto/move.pb.go b/benchmarks/proto/move.pb.go new file mode 100644 index 0000000..c4880ba --- /dev/null +++ b/benchmarks/proto/move.pb.go @@ -0,0 +1,253 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.10 +// protoc v6.33.0 +// source: benchmarks/proto/move.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Vector3 struct { + state protoimpl.MessageState `protogen:"open.v1"` + X float32 `protobuf:"fixed32,1,opt,name=x,proto3" json:"x,omitempty"` + Y float32 `protobuf:"fixed32,2,opt,name=y,proto3" json:"y,omitempty"` + Z float32 `protobuf:"fixed32,3,opt,name=z,proto3" json:"z,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Vector3) Reset() { + *x = Vector3{} + mi := &file_benchmarks_proto_move_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Vector3) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Vector3) ProtoMessage() {} + +func (x *Vector3) ProtoReflect() protoreflect.Message { + mi := &file_benchmarks_proto_move_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Vector3.ProtoReflect.Descriptor instead. +func (*Vector3) Descriptor() ([]byte, []int) { + return file_benchmarks_proto_move_proto_rawDescGZIP(), []int{0} +} + +func (x *Vector3) GetX() float32 { + if x != nil { + return x.X + } + return 0 +} + +func (x *Vector3) GetY() float32 { + if x != nil { + return x.Y + } + return 0 +} + +func (x *Vector3) GetZ() float32 { + if x != nil { + return x.Z + } + return 0 +} + +type MoveMessage struct { + state protoimpl.MessageState `protogen:"open.v1"` + Position *Vector3 `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + Velocity []float32 `protobuf:"fixed32,2,rep,packed,name=velocity,proto3" json:"velocity,omitempty"` + Waypoints []*Vector3 `protobuf:"bytes,3,rep,name=waypoints,proto3" json:"waypoints,omitempty"` + PlayerId uint32 `protobuf:"varint,4,opt,name=player_id,json=playerId,proto3" json:"player_id,omitempty"` + Active bool `protobuf:"varint,5,opt,name=active,proto3" json:"active,omitempty"` + Visible bool `protobuf:"varint,6,opt,name=visible,proto3" json:"visible,omitempty"` + Ghost bool `protobuf:"varint,7,opt,name=ghost,proto3" json:"ghost,omitempty"` + Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MoveMessage) Reset() { + *x = MoveMessage{} + mi := &file_benchmarks_proto_move_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MoveMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MoveMessage) ProtoMessage() {} + +func (x *MoveMessage) ProtoReflect() protoreflect.Message { + mi := &file_benchmarks_proto_move_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MoveMessage.ProtoReflect.Descriptor instead. +func (*MoveMessage) Descriptor() ([]byte, []int) { + return file_benchmarks_proto_move_proto_rawDescGZIP(), []int{1} +} + +func (x *MoveMessage) GetPosition() *Vector3 { + if x != nil { + return x.Position + } + return nil +} + +func (x *MoveMessage) GetVelocity() []float32 { + if x != nil { + return x.Velocity + } + return nil +} + +func (x *MoveMessage) GetWaypoints() []*Vector3 { + if x != nil { + return x.Waypoints + } + return nil +} + +func (x *MoveMessage) GetPlayerId() uint32 { + if x != nil { + return x.PlayerId + } + return 0 +} + +func (x *MoveMessage) GetActive() bool { + if x != nil { + return x.Active + } + return false +} + +func (x *MoveMessage) GetVisible() bool { + if x != nil { + return x.Visible + } + return false +} + +func (x *MoveMessage) GetGhost() bool { + if x != nil { + return x.Ghost + } + return false +} + +func (x *MoveMessage) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_benchmarks_proto_move_proto protoreflect.FileDescriptor + +const file_benchmarks_proto_move_proto_rawDesc = "" + + "\n" + + "\x1bbenchmarks/proto/move.proto\x12\n" + + "benchproto\"3\n" + + "\aVector3\x12\f\n" + + "\x01x\x18\x01 \x01(\x02R\x01x\x12\f\n" + + "\x01y\x18\x02 \x01(\x02R\x01y\x12\f\n" + + "\x01z\x18\x03 \x01(\x02R\x01z\"\x86\x02\n" + + "\vMoveMessage\x12/\n" + + "\bposition\x18\x01 \x01(\v2\x13.benchproto.Vector3R\bposition\x12\x1a\n" + + "\bvelocity\x18\x02 \x03(\x02R\bvelocity\x121\n" + + "\twaypoints\x18\x03 \x03(\v2\x13.benchproto.Vector3R\twaypoints\x12\x1b\n" + + "\tplayer_id\x18\x04 \x01(\rR\bplayerId\x12\x16\n" + + "\x06active\x18\x05 \x01(\bR\x06active\x12\x18\n" + + "\avisible\x18\x06 \x01(\bR\avisible\x12\x14\n" + + "\x05ghost\x18\a \x01(\bR\x05ghost\x12\x12\n" + + "\x04name\x18\b \x01(\tR\x04nameB-Z+github.com/edmand46/arpack/benchmarks/protob\x06proto3" + +var ( + file_benchmarks_proto_move_proto_rawDescOnce sync.Once + file_benchmarks_proto_move_proto_rawDescData []byte +) + +func file_benchmarks_proto_move_proto_rawDescGZIP() []byte { + file_benchmarks_proto_move_proto_rawDescOnce.Do(func() { + file_benchmarks_proto_move_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_benchmarks_proto_move_proto_rawDesc), len(file_benchmarks_proto_move_proto_rawDesc))) + }) + return file_benchmarks_proto_move_proto_rawDescData +} + +var file_benchmarks_proto_move_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_benchmarks_proto_move_proto_goTypes = []any{ + (*Vector3)(nil), // 0: benchproto.Vector3 + (*MoveMessage)(nil), // 1: benchproto.MoveMessage +} +var file_benchmarks_proto_move_proto_depIdxs = []int32{ + 0, // 0: benchproto.MoveMessage.position:type_name -> benchproto.Vector3 + 0, // 1: benchproto.MoveMessage.waypoints:type_name -> benchproto.Vector3 + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_benchmarks_proto_move_proto_init() } +func file_benchmarks_proto_move_proto_init() { + if File_benchmarks_proto_move_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_benchmarks_proto_move_proto_rawDesc), len(file_benchmarks_proto_move_proto_rawDesc)), + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_benchmarks_proto_move_proto_goTypes, + DependencyIndexes: file_benchmarks_proto_move_proto_depIdxs, + MessageInfos: file_benchmarks_proto_move_proto_msgTypes, + }.Build() + File_benchmarks_proto_move_proto = out.File + file_benchmarks_proto_move_proto_goTypes = nil + file_benchmarks_proto_move_proto_depIdxs = nil +} diff --git a/benchmarks/proto/move.proto b/benchmarks/proto/move.proto new file mode 100644 index 0000000..a459654 --- /dev/null +++ b/benchmarks/proto/move.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; +package benchproto; +option go_package = "github.com/edmand46/arpack/benchmarks/proto"; + +message Vector3 { + float x = 1; + float y = 2; + float z = 3; +} + +message MoveMessage { + Vector3 position = 1; + repeated float velocity = 2; + repeated Vector3 waypoints = 3; + uint32 player_id = 4; + bool active = 5; + bool visible = 6; + bool ghost = 7; + string name = 8; +} diff --git a/benchmarks/unity/Assets/Benchmarks.meta b/benchmarks/unity/Assets/Benchmarks.meta new file mode 100644 index 0000000..0eb4b13 --- /dev/null +++ b/benchmarks/unity/Assets/Benchmarks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7b9f947cf50f547f08cabcd88b87750e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/benchmarks/unity/Assets/Benchmarks/BenchmarkRunner.cs b/benchmarks/unity/Assets/Benchmarks/BenchmarkRunner.cs new file mode 100644 index 0000000..b0e52ad --- /dev/null +++ b/benchmarks/unity/Assets/Benchmarks/BenchmarkRunner.cs @@ -0,0 +1,141 @@ +using System; +using System.Diagnostics; +using Google.Protobuf; +using UnityEngine; + +public class BenchmarkRunner : MonoBehaviour +{ + private const int N = 10_000; + private const int Warmup = 1_000; + + private unsafe void Start() + { + var apMsg = new Arpack.Messages.MoveMessage + { + Position = new Arpack.Messages.Vector3 { X = 100, Y = -50, Z = 0 }, + Velocity = new float[] { 1.5f, -2.5f, 0f }, + Waypoints = new Arpack.Messages.Vector3[] + { + new Arpack.Messages.Vector3 { X = 10, Y = 20, Z = 0 }, + new Arpack.Messages.Vector3 { X = -10, Y = 0, Z = 100 }, + }, + PlayerID = 999, + Active = true, + Visible = false, + Ghost = true, + Name = "PlayerOne", + }; + + var pbMsg = new Benchproto.MoveMessage + { + Position = new Benchproto.Vector3 { X = 100, Y = -50, Z = 0 }, + PlayerId = 999, + Active = true, + Visible = false, + Ghost = true, + Name = "PlayerOne", + }; + pbMsg.Velocity.AddRange(new float[] { 1.5f, -2.5f, 0f }); + pbMsg.Waypoints.Add(new Benchproto.Vector3 { X = 10, Y = 20, Z = 0 }); + pbMsg.Waypoints.Add(new Benchproto.Vector3 { X = -10, Y = 0, Z = 100 }); + + byte[] apBuf = new byte[256]; + int apWireSize; + fixed (byte* ptr = apBuf) { apWireSize = apMsg.Serialize(ptr); } + + byte[] apBytes = new byte[apWireSize]; + Array.Copy(apBuf, apBytes, apWireSize); + + byte[] pbBytes = pbMsg.ToByteArray(); + int pbWireSize = pbBytes.Length; + byte[] protoOutputBuf = new byte[256]; + + // Warmup (JIT) + for (int i = 0; i < Warmup; i++) + { + fixed (byte* ptr = apBuf) { apMsg.Serialize(ptr); } + fixed (byte* ptr = apBytes) { Arpack.Messages.MoveMessage.Deserialize(ptr, out _); } + _ = pbMsg.ToByteArray(); + _ = Benchproto.MoveMessage.Parser.ParseFrom(pbBytes); + var cos = new CodedOutputStream(protoOutputBuf); + pbMsg.WriteTo(cos); + cos.Flush(); + } + + Stopwatch sw; + long gcBefore, gcAfter; + + // ArPack Serialize + GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); + gcBefore = GC.GetTotalMemory(false); + sw = Stopwatch.StartNew(); + for (int i = 0; i < N; i++) + { + fixed (byte* ptr = apBuf) { apMsg.Serialize(ptr); } + } + sw.Stop(); + gcAfter = GC.GetTotalMemory(false); + Log("ArPack Serialize ", sw, N, gcAfter - gcBefore); + + // ArPack Deserialize + GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); + gcBefore = GC.GetTotalMemory(false); + sw = Stopwatch.StartNew(); + for (int i = 0; i < N; i++) + { + fixed (byte* ptr = apBytes) { Arpack.Messages.MoveMessage.Deserialize(ptr, out _); } + } + sw.Stop(); + gcAfter = GC.GetTotalMemory(false); + Log("ArPack Deserialize ", sw, N, gcAfter - gcBefore); + + // Proto Serialize (alloc) + GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); + gcBefore = GC.GetTotalMemory(false); + sw = Stopwatch.StartNew(); + byte[] pbOut = null; + for (int i = 0; i < N; i++) + { + pbOut = pbMsg.ToByteArray(); + } + sw.Stop(); + gcAfter = GC.GetTotalMemory(false); + Log("Proto Serialize (alloc) ", sw, N, gcAfter - gcBefore); + _ = pbOut; + + // Proto Deserialize (alloc) + GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); + gcBefore = GC.GetTotalMemory(false); + sw = Stopwatch.StartNew(); + for (int i = 0; i < N; i++) + { + _ = Benchproto.MoveMessage.Parser.ParseFrom(pbBytes); + } + sw.Stop(); + gcAfter = GC.GetTotalMemory(false); + Log("Proto Deserialize (alloc)", sw, N, gcAfter - gcBefore); + + // Proto Serialize (reuse buffer) + GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); + gcBefore = GC.GetTotalMemory(false); + sw = Stopwatch.StartNew(); + for (int i = 0; i < N; i++) + { + var cos = new CodedOutputStream(protoOutputBuf); + pbMsg.WriteTo(cos); + cos.Flush(); + } + sw.Stop(); + gcAfter = GC.GetTotalMemory(false); + Log("Proto Serialize (reuse) ", sw, N, gcAfter - gcBefore); + + UnityEngine.Debug.Log($"[Bench] Wire sizes — ArPack: {apWireSize} bytes | Protobuf: {pbWireSize} bytes"); + } + + private static void Log(string label, Stopwatch sw, int n, long gcDelta) + { + double nsPerOp = sw.Elapsed.TotalMilliseconds * 1_000_000.0 / n; + long bPerOp = Math.Max(0, gcDelta) / n; + UnityEngine.Debug.Log($"[Bench] {label}: {nsPerOp,8:F1} ns/op | {bPerOp,6} B/op"); + } +} diff --git a/benchmarks/unity/Assets/Benchmarks/BenchmarkRunner.cs.meta b/benchmarks/unity/Assets/Benchmarks/BenchmarkRunner.cs.meta new file mode 100644 index 0000000..e0beb4d --- /dev/null +++ b/benchmarks/unity/Assets/Benchmarks/BenchmarkRunner.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ac4456ca45dd64092a7c26b7fc6cff0f \ No newline at end of file diff --git a/benchmarks/unity/Assets/Benchmarks/Benchmarks.asmdef b/benchmarks/unity/Assets/Benchmarks/Benchmarks.asmdef new file mode 100644 index 0000000..659c995 --- /dev/null +++ b/benchmarks/unity/Assets/Benchmarks/Benchmarks.asmdef @@ -0,0 +1,16 @@ +{ + "name": "Benchmarks", + "rootNamespace": "", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [ + "Google.Protobuf" + ], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/benchmarks/unity/Assets/Benchmarks/Benchmarks.asmdef.meta b/benchmarks/unity/Assets/Benchmarks/Benchmarks.asmdef.meta new file mode 100644 index 0000000..badb5af --- /dev/null +++ b/benchmarks/unity/Assets/Benchmarks/Benchmarks.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 20a66c82a93d34a489c40c5f81b4a203 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/benchmarks/unity/Assets/Benchmarks/Messages.gen.cs b/benchmarks/unity/Assets/Benchmarks/Messages.gen.cs new file mode 100644 index 0000000..7fbdfad --- /dev/null +++ b/benchmarks/unity/Assets/Benchmarks/Messages.gen.cs @@ -0,0 +1,206 @@ +// arpack +// Code generated by arpack. DO NOT EDIT. +#pragma warning disable CS8500 + +using System; +using System.Text; + +namespace Arpack.Messages +{ + public enum Opcode : ushort + { + Unknown = 0, + Authorize = 1, + JoinRoom = 2 + } + + public unsafe struct Vector3 + { + public float X; + public float Y; + public float Z; + + public int Serialize(byte* buffer) + { + byte* ptr = buffer; + *(ushort*)ptr = (ushort)((X - (-500f)) / (500f - (-500f)) * 65535f); ptr += 2; + *(ushort*)ptr = (ushort)((Y - (-500f)) / (500f - (-500f)) * 65535f); ptr += 2; + *(ushort*)ptr = (ushort)((Z - (-500f)) / (500f - (-500f)) * 65535f); ptr += 2; + return (int)(ptr - buffer); + } + + public static int Deserialize(byte* buffer, out Vector3 msg) + { + byte* ptr = buffer; + msg = default; + msg.X = (float)(*(ushort*)ptr) / 65535f * (500f - (-500f)) + (-500f); ptr += 2; + msg.Y = (float)(*(ushort*)ptr) / 65535f * (500f - (-500f)) + (-500f); ptr += 2; + msg.Z = (float)(*(ushort*)ptr) / 65535f * (500f - (-500f)) + (-500f); ptr += 2; + return (int)(ptr - buffer); + } + } + + public unsafe struct MoveMessage + { + public Vector3 Position; + public float[] Velocity; + public Vector3[] Waypoints; + public uint PlayerID; + public bool Active; + public bool Visible; + public bool Ghost; + public string Name; + + public int Serialize(byte* buffer) + { + byte* ptr = buffer; + ptr += Position.Serialize(ptr); + for (int _iVelocity = 0; _iVelocity < 3; _iVelocity++) + { + *(float*)ptr = Velocity[_iVelocity]; ptr += 4; + } + *(ushort*)ptr = (ushort)(Waypoints?.Length ?? 0); ptr += 2; + if (Waypoints != null) + { + for (int _iWaypoints = 0; _iWaypoints < Waypoints.Length; _iWaypoints++) + { + ptr += Waypoints[_iWaypoints].Serialize(ptr); + } + } + *(uint*)ptr = PlayerID; ptr += 4; + byte _boolByte4 = 0; + if (Active) _boolByte4 |= (byte)(1 << 0); + if (Visible) _boolByte4 |= (byte)(1 << 1); + if (Ghost) _boolByte4 |= (byte)(1 << 2); + *ptr = _boolByte4; ptr++; + int _slenName = Name != null ? Encoding.UTF8.GetByteCount(Name) : 0; + *(ushort*)ptr = (ushort)_slenName; ptr += 2; + if (Name != null && _slenName > 0) + { + fixed (char* _charsName = Name) + { + Encoding.UTF8.GetBytes(_charsName, Name.Length, ptr, _slenName); + } + } + ptr += _slenName; + return (int)(ptr - buffer); + } + + public static int Deserialize(byte* buffer, out MoveMessage msg) + { + byte* ptr = buffer; + msg = default; + ptr += Vector3.Deserialize(ptr, out msg.Position); + msg.Velocity = new float[3]; + for (int _iVelocity = 0; _iVelocity < 3; _iVelocity++) + { + msg.Velocity[_iVelocity] = *(float*)ptr; ptr += 4; + } + int _lenWaypoints = *(ushort*)ptr; ptr += 2; + msg.Waypoints = new Vector3[_lenWaypoints]; + for (int _iWaypoints = 0; _iWaypoints < _lenWaypoints; _iWaypoints++) + { + ptr += Vector3.Deserialize(ptr, out msg.Waypoints[_iWaypoints]); + } + msg.PlayerID = *(uint*)ptr; ptr += 4; + byte _boolByte4 = *ptr; ptr++; + msg.Active = (_boolByte4 & (1 << 0)) != 0; + msg.Visible = (_boolByte4 & (1 << 1)) != 0; + msg.Ghost = (_boolByte4 & (1 << 2)) != 0; + int _slenmsg_Name = *(ushort*)ptr; ptr += 2; + msg.Name = _slenmsg_Name > 0 ? Encoding.UTF8.GetString(ptr, _slenmsg_Name) : string.Empty; + ptr += _slenmsg_Name; + return (int)(ptr - buffer); + } + } + + public unsafe struct SpawnMessage + { + public ulong EntityID; + public Vector3 Position; + public short Health; + public string[] Tags; + public byte[] Data; + + public int Serialize(byte* buffer) + { + byte* ptr = buffer; + *(ulong*)ptr = EntityID; ptr += 8; + ptr += Position.Serialize(ptr); + *(short*)ptr = Health; ptr += 2; + *(ushort*)ptr = (ushort)(Tags?.Length ?? 0); ptr += 2; + if (Tags != null) + { + for (int _iTags = 0; _iTags < Tags.Length; _iTags++) + { + int _slenTags__iTags_ = Tags[_iTags] != null ? Encoding.UTF8.GetByteCount(Tags[_iTags]) : 0; + *(ushort*)ptr = (ushort)_slenTags__iTags_; ptr += 2; + if (Tags[_iTags] != null && _slenTags__iTags_ > 0) + { + fixed (char* _charsTags__iTags_ = Tags[_iTags]) + { + Encoding.UTF8.GetBytes(_charsTags__iTags_, Tags[_iTags].Length, ptr, _slenTags__iTags_); + } + } + ptr += _slenTags__iTags_; + } + } + *(ushort*)ptr = (ushort)(Data?.Length ?? 0); ptr += 2; + if (Data != null) + { + for (int _iData = 0; _iData < Data.Length; _iData++) + { + *ptr = Data[_iData]; ptr += 1; + } + } + return (int)(ptr - buffer); + } + + public static int Deserialize(byte* buffer, out SpawnMessage msg) + { + byte* ptr = buffer; + msg = default; + msg.EntityID = *(ulong*)ptr; ptr += 8; + ptr += Vector3.Deserialize(ptr, out msg.Position); + msg.Health = *(short*)ptr; ptr += 2; + int _lenTags = *(ushort*)ptr; ptr += 2; + msg.Tags = new string[_lenTags]; + for (int _iTags = 0; _iTags < _lenTags; _iTags++) + { + int _slenmsg_Tags__iTags_ = *(ushort*)ptr; ptr += 2; + msg.Tags[_iTags] = _slenmsg_Tags__iTags_ > 0 ? Encoding.UTF8.GetString(ptr, _slenmsg_Tags__iTags_) : string.Empty; + ptr += _slenmsg_Tags__iTags_; + } + int _lenData = *(ushort*)ptr; ptr += 2; + msg.Data = new byte[_lenData]; + for (int _iData = 0; _iData < _lenData; _iData++) + { + msg.Data[_iData] = *ptr; ptr += 1; + } + return (int)(ptr - buffer); + } + } + + public unsafe struct EnvelopeMessage + { + public Opcode Code; + public byte Counter; + + public int Serialize(byte* buffer) + { + byte* ptr = buffer; + *(ushort*)ptr = (ushort)Code; ptr += 2; + *ptr = Counter; ptr += 1; + return (int)(ptr - buffer); + } + + public static int Deserialize(byte* buffer, out EnvelopeMessage msg) + { + byte* ptr = buffer; + msg = default; + msg.Code = (Opcode)(*(ushort*)ptr); ptr += 2; + msg.Counter = *ptr; ptr += 1; + return (int)(ptr - buffer); + } + } +} diff --git a/benchmarks/unity/Assets/Benchmarks/Messages.gen.cs.meta b/benchmarks/unity/Assets/Benchmarks/Messages.gen.cs.meta new file mode 100644 index 0000000..f5dc08c --- /dev/null +++ b/benchmarks/unity/Assets/Benchmarks/Messages.gen.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9755692abdaf54daf912862821fb9fd6 \ No newline at end of file diff --git a/benchmarks/unity/Assets/Benchmarks/Move.cs b/benchmarks/unity/Assets/Benchmarks/Move.cs new file mode 100644 index 0000000..b4b014d --- /dev/null +++ b/benchmarks/unity/Assets/Benchmarks/Move.cs @@ -0,0 +1,768 @@ +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: move.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Benchproto { + + /// Holder for reflection information generated from move.proto + public static partial class MoveReflection { + + #region Descriptor + /// File descriptor for move.proto + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MoveReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "Cgptb3ZlLnByb3RvEgpiZW5jaHByb3RvIioKB1ZlY3RvcjMSCQoBeBgBIAEo", + "AhIJCgF5GAIgASgCEgkKAXoYAyABKAIivwEKC01vdmVNZXNzYWdlEiUKCHBv", + "c2l0aW9uGAEgASgLMhMuYmVuY2hwcm90by5WZWN0b3IzEhAKCHZlbG9jaXR5", + "GAIgAygCEiYKCXdheXBvaW50cxgDIAMoCzITLmJlbmNocHJvdG8uVmVjdG9y", + "MxIRCglwbGF5ZXJfaWQYBCABKA0SDgoGYWN0aXZlGAUgASgIEg8KB3Zpc2li", + "bGUYBiABKAgSDQoFZ2hvc3QYByABKAgSDAoEbmFtZRgIIAEoCUItWitnaXRo", + "dWIuY29tL2VkbWFuZDQ2L2FycGFjay9iZW5jaG1hcmtzL3Byb3RvYgZwcm90", + "bzM=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Benchproto.Vector3), global::Benchproto.Vector3.Parser, new[]{ "X", "Y", "Z" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Benchproto.MoveMessage), global::Benchproto.MoveMessage.Parser, new[]{ "Position", "Velocity", "Waypoints", "PlayerId", "Active", "Visible", "Ghost", "Name" }, null, null, null, null) + })); + } + #endregion + + } + #region Messages + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Vector3 : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Vector3()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::Benchproto.MoveReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Vector3() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Vector3(Vector3 other) : this() { + x_ = other.x_; + y_ = other.y_; + z_ = other.z_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Vector3 Clone() { + return new Vector3(this); + } + + /// Field number for the "x" field. + public const int XFieldNumber = 1; + private float x_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public float X { + get { return x_; } + set { + x_ = value; + } + } + + /// Field number for the "y" field. + public const int YFieldNumber = 2; + private float y_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public float Y { + get { return y_; } + set { + y_ = value; + } + } + + /// Field number for the "z" field. + public const int ZFieldNumber = 3; + private float z_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public float Z { + get { return z_; } + set { + z_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as Vector3); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Vector3 other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(X, other.X)) return false; + if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(Y, other.Y)) return false; + if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(Z, other.Z)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (X != 0F) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(X); + if (Y != 0F) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(Y); + if (Z != 0F) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(Z); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (X != 0F) { + output.WriteRawTag(13); + output.WriteFloat(X); + } + if (Y != 0F) { + output.WriteRawTag(21); + output.WriteFloat(Y); + } + if (Z != 0F) { + output.WriteRawTag(29); + output.WriteFloat(Z); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (X != 0F) { + output.WriteRawTag(13); + output.WriteFloat(X); + } + if (Y != 0F) { + output.WriteRawTag(21); + output.WriteFloat(Y); + } + if (Z != 0F) { + output.WriteRawTag(29); + output.WriteFloat(Z); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (X != 0F) { + size += 1 + 4; + } + if (Y != 0F) { + size += 1 + 4; + } + if (Z != 0F) { + size += 1 + 4; + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Vector3 other) { + if (other == null) { + return; + } + if (other.X != 0F) { + X = other.X; + } + if (other.Y != 0F) { + Y = other.Y; + } + if (other.Z != 0F) { + Z = other.Z; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 13: { + X = input.ReadFloat(); + break; + } + case 21: { + Y = input.ReadFloat(); + break; + } + case 29: { + Z = input.ReadFloat(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 13: { + X = input.ReadFloat(); + break; + } + case 21: { + Y = input.ReadFloat(); + break; + } + case 29: { + Z = input.ReadFloat(); + break; + } + } + } + } + #endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class MoveMessage : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new MoveMessage()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::Benchproto.MoveReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public MoveMessage() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public MoveMessage(MoveMessage other) : this() { + position_ = other.position_ != null ? other.position_.Clone() : null; + velocity_ = other.velocity_.Clone(); + waypoints_ = other.waypoints_.Clone(); + playerId_ = other.playerId_; + active_ = other.active_; + visible_ = other.visible_; + ghost_ = other.ghost_; + name_ = other.name_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public MoveMessage Clone() { + return new MoveMessage(this); + } + + /// Field number for the "position" field. + public const int PositionFieldNumber = 1; + private global::Benchproto.Vector3 position_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Benchproto.Vector3 Position { + get { return position_; } + set { + position_ = value; + } + } + + /// Field number for the "velocity" field. + public const int VelocityFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_velocity_codec + = pb::FieldCodec.ForFloat(18); + private readonly pbc::RepeatedField velocity_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Velocity { + get { return velocity_; } + } + + /// Field number for the "waypoints" field. + public const int WaypointsFieldNumber = 3; + private static readonly pb::FieldCodec _repeated_waypoints_codec + = pb::FieldCodec.ForMessage(26, global::Benchproto.Vector3.Parser); + private readonly pbc::RepeatedField waypoints_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Waypoints { + get { return waypoints_; } + } + + /// Field number for the "player_id" field. + public const int PlayerIdFieldNumber = 4; + private uint playerId_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint PlayerId { + get { return playerId_; } + set { + playerId_ = value; + } + } + + /// Field number for the "active" field. + public const int ActiveFieldNumber = 5; + private bool active_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Active { + get { return active_; } + set { + active_ = value; + } + } + + /// Field number for the "visible" field. + public const int VisibleFieldNumber = 6; + private bool visible_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Visible { + get { return visible_; } + set { + visible_ = value; + } + } + + /// Field number for the "ghost" field. + public const int GhostFieldNumber = 7; + private bool ghost_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Ghost { + get { return ghost_; } + set { + ghost_ = value; + } + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 8; + private string name_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Name { + get { return name_; } + set { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as MoveMessage); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(MoveMessage other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (!object.Equals(Position, other.Position)) return false; + if(!velocity_.Equals(other.velocity_)) return false; + if(!waypoints_.Equals(other.waypoints_)) return false; + if (PlayerId != other.PlayerId) return false; + if (Active != other.Active) return false; + if (Visible != other.Visible) return false; + if (Ghost != other.Ghost) return false; + if (Name != other.Name) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (position_ != null) hash ^= Position.GetHashCode(); + hash ^= velocity_.GetHashCode(); + hash ^= waypoints_.GetHashCode(); + if (PlayerId != 0) hash ^= PlayerId.GetHashCode(); + if (Active != false) hash ^= Active.GetHashCode(); + if (Visible != false) hash ^= Visible.GetHashCode(); + if (Ghost != false) hash ^= Ghost.GetHashCode(); + if (Name.Length != 0) hash ^= Name.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (position_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Position); + } + velocity_.WriteTo(output, _repeated_velocity_codec); + waypoints_.WriteTo(output, _repeated_waypoints_codec); + if (PlayerId != 0) { + output.WriteRawTag(32); + output.WriteUInt32(PlayerId); + } + if (Active != false) { + output.WriteRawTag(40); + output.WriteBool(Active); + } + if (Visible != false) { + output.WriteRawTag(48); + output.WriteBool(Visible); + } + if (Ghost != false) { + output.WriteRawTag(56); + output.WriteBool(Ghost); + } + if (Name.Length != 0) { + output.WriteRawTag(66); + output.WriteString(Name); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (position_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Position); + } + velocity_.WriteTo(ref output, _repeated_velocity_codec); + waypoints_.WriteTo(ref output, _repeated_waypoints_codec); + if (PlayerId != 0) { + output.WriteRawTag(32); + output.WriteUInt32(PlayerId); + } + if (Active != false) { + output.WriteRawTag(40); + output.WriteBool(Active); + } + if (Visible != false) { + output.WriteRawTag(48); + output.WriteBool(Visible); + } + if (Ghost != false) { + output.WriteRawTag(56); + output.WriteBool(Ghost); + } + if (Name.Length != 0) { + output.WriteRawTag(66); + output.WriteString(Name); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (position_ != null) { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Position); + } + size += velocity_.CalculateSize(_repeated_velocity_codec); + size += waypoints_.CalculateSize(_repeated_waypoints_codec); + if (PlayerId != 0) { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(PlayerId); + } + if (Active != false) { + size += 1 + 1; + } + if (Visible != false) { + size += 1 + 1; + } + if (Ghost != false) { + size += 1 + 1; + } + if (Name.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(MoveMessage other) { + if (other == null) { + return; + } + if (other.position_ != null) { + if (position_ == null) { + Position = new global::Benchproto.Vector3(); + } + Position.MergeFrom(other.Position); + } + velocity_.Add(other.velocity_); + waypoints_.Add(other.waypoints_); + if (other.PlayerId != 0) { + PlayerId = other.PlayerId; + } + if (other.Active != false) { + Active = other.Active; + } + if (other.Visible != false) { + Visible = other.Visible; + } + if (other.Ghost != false) { + Ghost = other.Ghost; + } + if (other.Name.Length != 0) { + Name = other.Name; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (position_ == null) { + Position = new global::Benchproto.Vector3(); + } + input.ReadMessage(Position); + break; + } + case 18: + case 21: { + velocity_.AddEntriesFrom(input, _repeated_velocity_codec); + break; + } + case 26: { + waypoints_.AddEntriesFrom(input, _repeated_waypoints_codec); + break; + } + case 32: { + PlayerId = input.ReadUInt32(); + break; + } + case 40: { + Active = input.ReadBool(); + break; + } + case 48: { + Visible = input.ReadBool(); + break; + } + case 56: { + Ghost = input.ReadBool(); + break; + } + case 66: { + Name = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + if (position_ == null) { + Position = new global::Benchproto.Vector3(); + } + input.ReadMessage(Position); + break; + } + case 18: + case 21: { + velocity_.AddEntriesFrom(ref input, _repeated_velocity_codec); + break; + } + case 26: { + waypoints_.AddEntriesFrom(ref input, _repeated_waypoints_codec); + break; + } + case 32: { + PlayerId = input.ReadUInt32(); + break; + } + case 40: { + Active = input.ReadBool(); + break; + } + case 48: { + Visible = input.ReadBool(); + break; + } + case 56: { + Ghost = input.ReadBool(); + break; + } + case 66: { + Name = input.ReadString(); + break; + } + } + } + } + #endif + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/benchmarks/unity/Assets/Benchmarks/Move.cs.meta b/benchmarks/unity/Assets/Benchmarks/Move.cs.meta new file mode 100644 index 0000000..a71ee34 --- /dev/null +++ b/benchmarks/unity/Assets/Benchmarks/Move.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c7457f233226e42568ebd6ff92de57fc \ No newline at end of file diff --git a/benchmarks/unity/Assets/InputSystem_Actions.inputactions b/benchmarks/unity/Assets/InputSystem_Actions.inputactions new file mode 100644 index 0000000..1a12cb9 --- /dev/null +++ b/benchmarks/unity/Assets/InputSystem_Actions.inputactions @@ -0,0 +1,1057 @@ +{ + "name": "InputSystem_Actions", + "maps": [ + { + "name": "Player", + "id": "df70fa95-8a34-4494-b137-73ab6b9c7d37", + "actions": [ + { + "name": "Move", + "type": "Value", + "id": "351f2ccd-1f9f-44bf-9bec-d62ac5c5f408", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Look", + "type": "Value", + "id": "6b444451-8a00-4d00-a97e-f47457f736a8", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Attack", + "type": "Button", + "id": "6c2ab1b8-8984-453a-af3d-a3c78ae1679a", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Interact", + "type": "Button", + "id": "852140f2-7766-474d-8707-702459ba45f3", + "expectedControlType": "Button", + "processors": "", + "interactions": "Hold", + "initialStateCheck": false + }, + { + "name": "Crouch", + "type": "Button", + "id": "27c5f898-bc57-4ee1-8800-db469aca5fe3", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Jump", + "type": "Button", + "id": "f1ba0d36-48eb-4cd5-b651-1c94a6531f70", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Previous", + "type": "Button", + "id": "2776c80d-3c14-4091-8c56-d04ced07a2b0", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Next", + "type": "Button", + "id": "b7230bb6-fc9b-4f52-8b25-f5e19cb2c2ba", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Sprint", + "type": "Button", + "id": "641cd816-40e6-41b4-8c3d-04687c349290", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403", + "path": "/leftStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "WASD", + "id": "00ca640b-d935-4593-8157-c05846ea39b3", + "path": "Dpad", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "e2062cb9-1b15-46a2-838c-2f8d72a0bdd9", + "path": "/w", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "8180e8bd-4097-4f4e-ab88-4523101a6ce9", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "320bffee-a40b-4347-ac70-c210eb8bc73a", + "path": "/s", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "1c5327b5-f71c-4f60-99c7-4e737386f1d1", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "d2581a9b-1d11-4566-b27d-b92aff5fabbc", + "path": "/a", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "2e46982e-44cc-431b-9f0b-c11910bf467a", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcfe95b8-67b9-4526-84b5-5d0bc98d6400", + "path": "/d", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "77bff152-3580-4b21-b6de-dcd0c7e41164", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8", + "path": "/{Primary2DAxis}", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3ea4d645-4504-4529-b061-ab81934c3752", + "path": "/stick", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Move", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c1f7a91b-d0fd-4a62-997e-7fb9b69bf235", + "path": "/rightStick", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8c8e490b-c610-4785-884f-f04217b23ca4", + "path": "/delta", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse;Touch", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3e5f5442-8668-4b27-a940-df99bad7e831", + "path": "/{Hatswitch}", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Look", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "143bb1cd-cc10-4eca-a2f0-a3664166fe91", + "path": "/buttonWest", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "05f6913d-c316-48b2-a6bb-e225f14c7960", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "886e731e-7071-4ae4-95c0-e61739dad6fd", + "path": "/primaryTouch/tap", + "interactions": "", + "processors": "", + "groups": ";Touch", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ee3d0cd2-254e-47a7-a8cb-bc94d9658c54", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8255d333-5683-4943-a58a-ccb207ff1dce", + "path": "/{PrimaryAction}", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b3c1c7f0-bd20-4ee7-a0f1-899b24bca6d7", + "path": "/enter", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Attack", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "cbac6039-9c09-46a1-b5f2-4e5124ccb5ed", + "path": "/2", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Next", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e15ca19d-e649-4852-97d5-7fe8ccc44e94", + "path": "/dpad/right", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Next", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "f2e9ba44-c423-42a7-ad56-f20975884794", + "path": "/leftShift", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8cbb2f4b-a784-49cc-8d5e-c010b8c7f4e6", + "path": "/leftStickPress", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d8bf24bf-3f2f-4160-a97c-38ec1eb520ba", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Sprint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "eb40bb66-4559-4dfa-9a2f-820438abb426", + "path": "/space", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "daba33a1-ad0c-4742-a909-43ad1cdfbeb6", + "path": "/buttonSouth", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "603f3daf-40bd-4854-8724-93e8017f59e3", + "path": "/secondaryButton", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Jump", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1534dc16-a6aa-499d-9c3a-22b47347b52a", + "path": "/1", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Previous", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "25060bbd-a3a6-476e-8fba-45ae484aad05", + "path": "/dpad/left", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Previous", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1c04ea5f-b012-41d1-a6f7-02e963b52893", + "path": "/e", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b3f66d0b-7751-423f-908b-a11c5bd95930", + "path": "/buttonNorth", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4f4649ac-64a8-4a73-af11-b3faef356a4d", + "path": "/buttonEast", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "36e52cba-0905-478e-a818-f4bfcb9f3b9a", + "path": "/c", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Crouch", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "UI", + "id": "272f6d14-89ba-496f-b7ff-215263d3219f", + "actions": [ + { + "name": "Navigate", + "type": "PassThrough", + "id": "c95b2375-e6d9-4b88-9c4c-c5e76515df4b", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Submit", + "type": "Button", + "id": "7607c7b6-cd76-4816-beef-bd0341cfe950", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Cancel", + "type": "Button", + "id": "15cef263-9014-4fd5-94d9-4e4a6234a6ef", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Point", + "type": "PassThrough", + "id": "32b35790-4ed0-4e9a-aa41-69ac6d629449", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Click", + "type": "PassThrough", + "id": "3c7022bf-7922-4f7c-a998-c437916075ad", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "RightClick", + "type": "PassThrough", + "id": "44b200b1-1557-4083-816c-b22cbdf77ddf", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "MiddleClick", + "type": "PassThrough", + "id": "dad70c86-b58c-4b17-88ad-f5e53adf419e", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "ScrollWheel", + "type": "PassThrough", + "id": "0489e84a-4833-4c40-bfae-cea84b696689", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDevicePosition", + "type": "PassThrough", + "id": "24908448-c609-4bc3-a128-ea258674378a", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "TrackedDeviceOrientation", + "type": "PassThrough", + "id": "9caa3d8a-6b2f-4e8e-8bad-6ede561bd9be", + "expectedControlType": "Quaternion", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "Gamepad", + "id": "809f371f-c5e2-4e7a-83a1-d867598f40dd", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "14a5d6e8-4aaf-4119-a9ef-34b8c2c548bf", + "path": "/leftStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "9144cbe6-05e1-4687-a6d7-24f99d23dd81", + "path": "/rightStick/up", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2db08d65-c5fb-421b-983f-c71163608d67", + "path": "/leftStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "58748904-2ea9-4a80-8579-b500e6a76df8", + "path": "/rightStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "8ba04515-75aa-45de-966d-393d9bbd1c14", + "path": "/leftStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "712e721c-bdfb-4b23-a86c-a0d9fcfea921", + "path": "/rightStick/left", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fcd248ae-a788-4676-a12e-f4d81205600b", + "path": "/leftStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "1f04d9bc-c50b-41a1-bfcc-afb75475ec20", + "path": "/rightStick/right", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "fb8277d4-c5cd-4663-9dc7-ee3f0b506d90", + "path": "/dpad", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "Joystick", + "id": "e25d9774-381c-4a61-b47c-7b6b299ad9f9", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "3db53b26-6601-41be-9887-63ac74e79d19", + "path": "/stick/up", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "0cb3e13e-3d90-4178-8ae6-d9c5501d653f", + "path": "/stick/down", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "0392d399-f6dd-4c82-8062-c1e9c0d34835", + "path": "/stick/left", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "942a66d9-d42f-43d6-8d70-ecb4ba5363bc", + "path": "/stick/right", + "interactions": "", + "processors": "", + "groups": "Joystick", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "Keyboard", + "id": "ff527021-f211-4c02-933e-5976594c46ed", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Navigate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "563fbfdd-0f09-408d-aa75-8642c4f08ef0", + "path": "/w", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "up", + "id": "eb480147-c587-4a33-85ed-eb0ab9942c43", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "2bf42165-60bc-42ca-8072-8c13ab40239b", + "path": "/s", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "85d264ad-e0a0-4565-b7ff-1a37edde51ac", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "74214943-c580-44e4-98eb-ad7eebe17902", + "path": "/a", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "cea9b045-a000-445b-95b8-0c171af70a3b", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "8607c725-d935-4808-84b1-8354e29bab63", + "path": "/d", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "4cda81dc-9edd-4e03-9d7c-a71a14345d0b", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Navigate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "9e92bb26-7e3b-4ec4-b06b-3c8f8e498ddc", + "path": "*/{Submit}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Submit", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "82627dcc-3b13-4ba9-841d-e4b746d6553e", + "path": "*/{Cancel}", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Cancel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c52c8e0b-8179-41d3-b8a1-d149033bbe86", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e1394cbc-336e-44ce-9ea8-6007ed6193f7", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5693e57a-238a-46ed-b5ae-e64e6e574302", + "path": "/touch*/position", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4faf7dc9-b979-4210-aa8c-e808e1ef89f5", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8d66d5ba-88d7-48e6-b1cd-198bbfef7ace", + "path": "/tip", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "47c2a644-3ebc-4dae-a106-589b7ca75b59", + "path": "/touch*/press", + "interactions": "", + "processors": "", + "groups": "Touch", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "bb9e6b34-44bf-4381-ac63-5aa15d19f677", + "path": "/trigger", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "38c99815-14ea-4617-8627-164d27641299", + "path": "/scroll", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse", + "action": "ScrollWheel", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4c191405-5738-4d4b-a523-c6a301dbf754", + "path": "/rightButton", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "RightClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "24066f69-da47-44f3-a07e-0015fb02eb2e", + "path": "/middleButton", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "MiddleClick", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "7236c0d9-6ca3-47cf-a6ee-a97f5b59ea77", + "path": "/devicePosition", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDevicePosition", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "23e01e3a-f935-4948-8d8b-9bcac77714fb", + "path": "/deviceRotation", + "interactions": "", + "processors": "", + "groups": "XR", + "action": "TrackedDeviceOrientation", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [ + { + "name": "Keyboard&Mouse", + "bindingGroup": "Keyboard&Mouse", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + }, + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Gamepad", + "bindingGroup": "Gamepad", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Touch", + "bindingGroup": "Touch", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "Joystick", + "bindingGroup": "Joystick", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + }, + { + "name": "XR", + "bindingGroup": "XR", + "devices": [ + { + "devicePath": "", + "isOptional": false, + "isOR": false + } + ] + } + ] +} \ No newline at end of file diff --git a/benchmarks/unity/Assets/InputSystem_Actions.inputactions.meta b/benchmarks/unity/Assets/InputSystem_Actions.inputactions.meta new file mode 100644 index 0000000..e25b7aa --- /dev/null +++ b/benchmarks/unity/Assets/InputSystem_Actions.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 3590b91b4603b465dbb4216d601bff33 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/benchmarks/unity/Assets/Plugins.meta b/benchmarks/unity/Assets/Plugins.meta new file mode 100644 index 0000000..8b6f753 --- /dev/null +++ b/benchmarks/unity/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f4bc80e0b96da47f3bbcaed7aa3fcb27 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/benchmarks/unity/Assets/Plugins/Google.Protobuf.dll b/benchmarks/unity/Assets/Plugins/Google.Protobuf.dll new file mode 100755 index 0000000000000000000000000000000000000000..70f875ad66e10a365e5ef1829a6e239d101bee2a GIT binary patch literal 485472 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 fd9fkN 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�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

    _*hnY8}qLUUI|pWANh3c1>=Sg*IE>_oh{5 z{-x}bOS3v{KVi1BhuOTVd8ewkkM6l}`mKTMd-k3Ce(9TYqFF0}l9 zYx7cj+qBiPHP4P8$Z+q}x=b?c~Gur!c8Ae8}y&E@eA9nfTl=s11_aAt(W>MjTV^>tB S{d@;1a~kaK_cJ^0_&)%fxDfUL literal 0 HcmV?d00001 diff --git a/benchmarks/unity/Assets/Plugins/Google.Protobuf.dll.meta b/benchmarks/unity/Assets/Plugins/Google.Protobuf.dll.meta new file mode 100644 index 0000000..9f9a6ca --- /dev/null +++ b/benchmarks/unity/Assets/Plugins/Google.Protobuf.dll.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f7d8cfb8b4c854ef88343739cde5f7d6 \ No newline at end of file diff --git a/benchmarks/unity/Assets/Scenes.meta b/benchmarks/unity/Assets/Scenes.meta new file mode 100644 index 0000000..e9a21bf --- /dev/null +++ b/benchmarks/unity/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2528068817984550af33837b73bee36 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/benchmarks/unity/Assets/Scenes/SampleScene.unity b/benchmarks/unity/Assets/Scenes/SampleScene.unity new file mode 100644 index 0000000..9f07b34 --- /dev/null +++ b/benchmarks/unity/Assets/Scenes/SampleScene.unity @@ -0,0 +1,231 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &519420028 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 519420032} + - component: {fileID: 519420031} + - component: {fileID: 519420029} + - component: {fileID: 519420033} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &519420029 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 +--- !u!20 &519420031 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 1 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &519420032 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &519420033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ac4456ca45dd64092a7c26b7fc6cff0f, type: 3} + m_Name: + m_EditorClassIdentifier: Benchmarks::BenchmarkRunner +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 519420032} diff --git a/benchmarks/unity/Assets/Scenes/SampleScene.unity.meta b/benchmarks/unity/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 0000000..c1e3c88 --- /dev/null +++ b/benchmarks/unity/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2cda990e2423bbf4892e6590ba056729 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/benchmarks/unity/Benchmarks.csproj b/benchmarks/unity/Benchmarks.csproj new file mode 100644 index 0000000..dc4d9ce --- /dev/null +++ b/benchmarks/unity/Benchmarks.csproj @@ -0,0 +1,887 @@ + + + + 9.0 + <_TargetFrameworkDirectories>non_empty_path_generated_by_unity.rider.package + <_FullFrameworkReferenceAssemblyPaths>non_empty_path_generated_by_unity.rider.package + true + false + + + Debug + AnyCPU + 10.0.20506 + 2.0 + + {b6ce87c6-d606-93b9-b8b1-3b520c8d6bae} + {E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + Benchmarks + v4.7.1 + 512 + . + + + true + full + false + Temp\Bin\Debug\Benchmarks\ + UNITY_6000_3_11;UNITY_6000_3;UNITY_6000;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_2019_4_OR_NEWER;UNITY_2020_1_OR_NEWER;UNITY_2020_2_OR_NEWER;UNITY_2020_3_OR_NEWER;UNITY_2021_1_OR_NEWER;UNITY_2021_2_OR_NEWER;UNITY_2021_3_OR_NEWER;UNITY_2022_1_OR_NEWER;UNITY_2022_2_OR_NEWER;UNITY_2022_3_OR_NEWER;UNITY_2023_1_OR_NEWER;UNITY_2023_2_OR_NEWER;UNITY_2023_3_OR_NEWER;UNITY_6000_0_OR_NEWER;UNITY_6000_1_OR_NEWER;UNITY_6000_2_OR_NEWER;UNITY_6000_3_OR_NEWER;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;ENABLE_AR;ENABLE_AUDIO;ENABLE_AUDIO_SCRIPTABLE_PIPELINE;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_VIRTUALTEXTURING;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_UNITY_CONSENT;ENABLE_UNITY_CLOUD_IDENTIFIERS;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_NATIVE_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_EDITOR_GAME_SERVICES;ENABLE_UNITY_GAME_SERVICES_ANALYTICS_SUPPORT;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_GENERATE_NATIVE_PLUGINS_FOR_ASSEMBLIES_API;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;ENABLE_MANAGED_UNITYTLS;INCLUDE_DYNAMIC_GI;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_MARSHALLING_TESTS;ENABLE_VIDEO;ENABLE_NAVIGATION_OFFMESHLINK_TO_NAVMESHLINK;ENABLE_ACCELERATOR_CLIENT_DEBUGGING;ENABLE_ACCESSIBILITY_SCREEN_READER;TEXTCORE_1_0_OR_NEWER;EDITOR_ONLY_NAVMESH_BUILDER_DEPRECATED;PLATFORM_STANDALONE_OSX;PLATFORM_STANDALONE;UNITY_STANDALONE_OSX;UNITY_STANDALONE;ENABLE_GAMECENTER;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_CLOUD_SERVICES_ENGINE_DIAGNOSTICS;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_SPATIALTRACKING;PLATFORM_HAS_CUSTOM_MUTEX;PLATFORM_UPDATES_TIME_OUTSIDE_OF_PLAYER_LOOP;PLATFORM_SUPPORTS_SPLIT_GRAPHICS_JOBS;ENABLE_MONO;NET_STANDARD_2_0;NET_STANDARD;NET_STANDARD_2_1;NETSTANDARD;NETSTANDARD2_1;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_INPUT_SYSTEM;TEXTCORE_FONT_ENGINE_1_5_OR_NEWER;TEXTCORE_TEXT_ENGINE_1_5_OR_NEWER;TEXTCORE_FONT_ENGINE_1_6_OR_NEWER;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER + prompt + 4 + 0169,0649 + True + False + + + true + true + false + false + false + + + + + + + + + + + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.AIModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ARModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.AdaptivePerformanceModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.AndroidJNIModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.AnimationModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.AssetBundleModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.AudioModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ClothModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ContentLoadModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.CoreModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.CrashReportingModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.DSPGraphModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.DirectorModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.GIModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.GameCenterModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.GraphicsStateCollectionSerializerModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.GridModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.HierarchyCoreModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.HotReloadModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.IMGUIModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.IdentifiersModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ImageConversionModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.InputModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.InputForUIModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.InputLegacyModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.InsightsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.JSONSerializeModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.LocalizationModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.MarshallingModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.MultiplayerModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ParticleSystemModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.PerformanceReportingModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.PhysicsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.Physics2DModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.PhysicsBackendPhysXModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.PropertiesModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.RenderAs2DModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ScreenCaptureModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ShaderRuntimeModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.ShaderVariantAnalyticsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.SharedInternalsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.SpriteMaskModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.SpriteShapeModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.StreamingModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.SubstanceModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.SubsystemsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.TLSModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.TerrainModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.TerrainPhysicsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.TextCoreFontEngineModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.TextCoreTextEngineModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.TextRenderingModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.TilemapModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UIModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UIElementsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UmbraModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityAnalyticsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityAnalyticsCommonModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityConnectModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityConsentModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityCurlModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityWebRequestModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityWebRequestAssetBundleModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityWebRequestAudioModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityWebRequestTextureModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.UnityWebRequestWWWModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.VFXModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.VRModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.VectorGraphicsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.VehiclesModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.VideoModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.VirtualTexturingModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.WindModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEngine.XRModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.AccessibilityModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.AdaptivePerformanceModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.AssetComplianceModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.BuildProfileModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.ClothModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.CoreBusinessMetricsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.CoreModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.DeviceSimulatorModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.DiagnosticsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.EditorToolbarModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.EmbreeModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.GIModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.GraphViewModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.GraphicsStateCollectionSerializerModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.GridAndSnapModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.GridModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.HierarchyModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.MediaModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.MultiplayerModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.Physics2DModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.PhysicsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.PlayModeModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.PresetsUIModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.PropertiesModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.QuickInstallModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.QuickSearchModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.SafeModeModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.SceneTemplateModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.SceneViewModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.ShaderBuildSettingsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.ShaderCompilationModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.ShaderFoundryModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.SketchUpModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.SpriteMaskModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.SpriteShapeModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.SubstanceModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.TerrainModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.TextCoreFontEngineModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.TextCoreTextEngineModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.TextRenderingModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.TilemapModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.TreeModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.UIAutomationModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.UIBuilderModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.UIElementsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.UIElementsSamplesModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.UIToolkitAuthoringModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.UmbraModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.UnityConnectModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.VFXModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.VectorGraphicsModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.VideoModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEngine/UnityEditor.XRModule.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/Managed/UnityEditor.Graphs.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/PlaybackEngines/MacStandaloneSupport/UnityEditor.OSXStandalone.Extensions.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.visualscripting@eb6004dcc707/Editor/VisualScripting.Core/Dependencies/YamlDotNet/Unity.VisualScripting.YamlDotNet.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.collections@aea9d3bd5e19/Unity.Collections.LowLevel.ILSupport/Unity.Collections.LowLevel.ILSupport.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.ext.nunit@d8c07649098d/net40/unity-custom/nunit.framework.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.collab-proxy@a5329f833fa8/Lib/Editor/Unity.Plastic.Antlr3.Runtime.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.collab-proxy@a5329f833fa8/Lib/Editor/Unity.Plastic.Newtonsoft.Json.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.collab-proxy@a5329f833fa8/Lib/Editor/log4netPlastic.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.visualscripting@eb6004dcc707/Editor/VisualScripting.Core/Dependencies/DotNetZip/Unity.VisualScripting.IonicZip.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.collections@aea9d3bd5e19/Unity.Collections.Tests/System.IO.Hashing/System.IO.Hashing.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.collab-proxy@a5329f833fa8/Lib/Editor/unityplastic.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.visualscripting@eb6004dcc707/Runtime/VisualScripting.Flow/Dependencies/NCalc/Unity.VisualScripting.Antlr3.Runtime.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.visualscripting@eb6004dcc707/Editor/VisualScripting.Core/EditorAssetResources/Unity.VisualScripting.TextureAssets.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.nuget.mono-cecil@ecb9724e46ff/Mono.Cecil.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/PackageCache/com.unity.collections@aea9d3bd5e19/Unity.Collections.Tests/System.Runtime.CompilerServices.Unsafe/System.Runtime.CompilerServices.Unsafe.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Assets/Plugins/Google.Protobuf.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/PlaybackEngines/MacStandaloneSupport/UnityEditor.iOS.Extensions.Xcode.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/ref/2.1.0/netstandard.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/Microsoft.Win32.Primitives.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.AppContext.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Buffers.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Collections.Concurrent.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Collections.NonGeneric.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Collections.Specialized.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Collections.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.ComponentModel.EventBasedAsync.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.ComponentModel.Primitives.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.ComponentModel.TypeConverter.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.ComponentModel.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Console.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Data.Common.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Diagnostics.Contracts.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Diagnostics.Debug.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Diagnostics.FileVersionInfo.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Diagnostics.Process.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Diagnostics.StackTrace.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Diagnostics.TextWriterTraceListener.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Diagnostics.Tools.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Diagnostics.TraceSource.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Diagnostics.Tracing.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Drawing.Primitives.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Dynamic.Runtime.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Globalization.Calendars.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Globalization.Extensions.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Globalization.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.Compression.ZipFile.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.Compression.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.FileSystem.DriveInfo.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.FileSystem.Primitives.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.FileSystem.Watcher.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.FileSystem.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.IsolatedStorage.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.MemoryMappedFiles.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.Pipes.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.UnmanagedMemoryStream.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.IO.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Linq.Expressions.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Linq.Parallel.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Linq.Queryable.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Linq.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Memory.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.Http.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.NameResolution.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.NetworkInformation.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.Ping.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.Primitives.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.Requests.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.Security.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.Sockets.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.WebHeaderCollection.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.WebSockets.Client.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Net.WebSockets.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Numerics.Vectors.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.ObjectModel.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Reflection.DispatchProxy.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Reflection.Emit.ILGeneration.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Reflection.Emit.Lightweight.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Reflection.Emit.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Reflection.Extensions.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Reflection.Primitives.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Reflection.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Resources.Reader.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Resources.ResourceManager.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Resources.Writer.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.CompilerServices.VisualC.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.Extensions.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.Handles.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.InteropServices.RuntimeInformation.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.InteropServices.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.Numerics.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.Serialization.Formatters.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.Serialization.Json.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.Serialization.Primitives.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.Serialization.Xml.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Runtime.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Security.Claims.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Security.Cryptography.Algorithms.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Security.Cryptography.Csp.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Security.Cryptography.Encoding.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Security.Cryptography.Primitives.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Security.Cryptography.X509Certificates.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Security.Principal.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Security.SecureString.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Text.Encoding.Extensions.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Text.Encoding.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Text.RegularExpressions.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Threading.Overlapped.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Threading.Tasks.Extensions.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Threading.Tasks.Parallel.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Threading.Tasks.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Threading.Thread.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Threading.ThreadPool.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Threading.Timer.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Threading.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.ValueTuple.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Xml.ReaderWriter.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Xml.XDocument.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Xml.XPath.XDocument.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Xml.XPath.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Xml.XmlDocument.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netstandard/System.Xml.XmlSerializer.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/Extensions/2.0.0/System.Runtime.InteropServices.WindowsRuntime.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.ComponentModel.Composition.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Core.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Data.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Drawing.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.IO.Compression.FileSystem.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Net.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Numerics.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Runtime.Serialization.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.ServiceModel.Web.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Transactions.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Web.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Windows.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Xml.Linq.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Xml.Serialization.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.Xml.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/System.dll + + + /Applications/Unity/Hub/Editor/6000.3.11f1/Unity.app/Contents/Resources/Scripting/NetStandard/compat/2.1.0/shims/netfx/mscorlib.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/ScriptAssemblies/UnityEditor.UI.dll + + + /Users/edmand46/GolandProjects/arpack/benchmarks/unity/Library/ScriptAssemblies/UnityEngine.UI.dll + + + + + + + diff --git a/benchmarks/unity/ProjectSettings/AudioManager.asset b/benchmarks/unity/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..27287fe --- /dev/null +++ b/benchmarks/unity/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 0 diff --git a/benchmarks/unity/ProjectSettings/ClusterInputManager.asset b/benchmarks/unity/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/benchmarks/unity/ProjectSettings/DynamicsManager.asset b/benchmarks/unity/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..72d1430 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_DefaultMaxDepenetrationVelocity: 10 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0.1 + m_ClothInterCollisionStiffness: 0.2 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ClothGravity: {x: 0, y: -9.81, z: 0} + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_SolverType: 0 + m_DefaultMaxAngularSpeed: 50 diff --git a/benchmarks/unity/ProjectSettings/EditorBuildSettings.asset b/benchmarks/unity/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..f9f99a7 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,13 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: + - enabled: 1 + path: Assets/Scenes/SampleScene.unity + guid: 2cda990e2423bbf4892e6590ba056729 + m_configObjects: + com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 3590b91b4603b465dbb4216d601bff33, type: 3} + m_UseUCBPForAssetBundles: 0 diff --git a/benchmarks/unity/ProjectSettings/EditorSettings.asset b/benchmarks/unity/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..8a66dfc --- /dev/null +++ b/benchmarks/unity/ProjectSettings/EditorSettings.asset @@ -0,0 +1,50 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 15 + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 1 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 5 + m_SpritePackerCacheSize: 10 + m_SpritePackerPaddingPower: 1 + m_Bc7TextureCompressor: 0 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp + m_ProjectGenerationRootNamespace: + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_EnableEditorAsyncCPUTextureLoading: 0 + m_AsyncShaderCompilation: 1 + m_PrefabModeAllowAutoSave: 1 + m_EnterPlayModeOptionsEnabled: 1 + m_EnterPlayModeOptions: 0 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_InspectorUseIMGUIDefaultInspector: 0 + m_UseLegacyProbeSampleCount: 0 + m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 1 + m_ShadowmaskStitching: 0 + m_AssetPipelineMode: 1 + m_RefreshImportMode: 0 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 + m_CacheServerValidationMode: 2 + m_CacheServerDownloadBatchSize: 128 + m_EnableEnlightenBakedGI: 0 + m_ReferencedClipsExactNaming: 1 + m_ForceAssetUnloadAndGCOnSceneLoad: 1 diff --git a/benchmarks/unity/ProjectSettings/GraphicsSettings.asset b/benchmarks/unity/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..c165afb --- /dev/null +++ b/benchmarks/unity/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,64 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_VideoShadersIncludeMode: 2 + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_DefaultRenderingLayerMask: 1 + m_LogWhenShaderIsCompiled: 0 diff --git a/benchmarks/unity/ProjectSettings/InputManager.asset b/benchmarks/unity/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..b16147e --- /dev/null +++ b/benchmarks/unity/ProjectSettings/InputManager.asset @@ -0,0 +1,487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: joystick button 8 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: backspace + altNegativeButton: + altPositiveButton: joystick button 9 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Reset + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Next + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page down + altNegativeButton: + altPositiveButton: joystick button 5 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Previous + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page up + altNegativeButton: + altPositiveButton: joystick button 4 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Validate + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Persistent + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: right shift + altNegativeButton: + altPositiveButton: joystick button 2 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Multiplier + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: joystick button 3 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 6 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 5 + joyNum: 0 diff --git a/benchmarks/unity/ProjectSettings/MemorySettings.asset b/benchmarks/unity/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000..5b5face --- /dev/null +++ b/benchmarks/unity/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/benchmarks/unity/ProjectSettings/MultiplayerManager.asset b/benchmarks/unity/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 0000000..2a93664 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_StrippingTypes: {} diff --git a/benchmarks/unity/ProjectSettings/NavMeshAreas.asset b/benchmarks/unity/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..ad2654e --- /dev/null +++ b/benchmarks/unity/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/benchmarks/unity/ProjectSettings/NetworkManager.asset b/benchmarks/unity/ProjectSettings/NetworkManager.asset new file mode 100644 index 0000000..5dc6a83 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/NetworkManager.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!149 &1 +NetworkManager: + m_ObjectHideFlags: 0 + m_DebugLevel: 0 + m_Sendrate: 15 + m_AssetToPrefab: {} diff --git a/benchmarks/unity/ProjectSettings/PackageManagerSettings.asset b/benchmarks/unity/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..b3a65dd --- /dev/null +++ b/benchmarks/unity/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,44 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_EnablePackageDependencies: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_ErrorMessage: + m_Original: + m_Id: + m_Name: + m_Url: + m_Scopes: [] + m_IsDefault: 0 + m_Capabilities: 0 + m_Modified: 0 + m_Name: + m_Url: + m_Scopes: + - + m_SelectedScopeIndex: 0 diff --git a/benchmarks/unity/ProjectSettings/Physics2DSettings.asset b/benchmarks/unity/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..6cfcdda --- /dev/null +++ b/benchmarks/unity/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_SimulationMode: 0 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/benchmarks/unity/ProjectSettings/PresetManager.asset b/benchmarks/unity/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/benchmarks/unity/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/benchmarks/unity/ProjectSettings/ProjectSettings.asset b/benchmarks/unity/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..1321a53 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,736 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 28 + productGUID: 347ef167e38f44dd4ad3618bb9e1a4f9 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: unity + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1920 + defaultScreenHeight: 1080 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 1 + unsupportedMSAAFallback: 0 + m_SpriteBatchMaxVertexCount: 65535 + m_SpriteBatchVertexThreshold: 300 + m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 + numberOfMipsStrippedPerMipmapLimitGroup: {} + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 1 + androidDisplayOptions: 1 + androidBlitType: 0 + androidResizeableActivity: 1 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + androidAutoRotationBehavior: 1 + androidPredictiveBackSupport: 0 + androidApplicationEntry: 2 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + audioSpatialExperience: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + dedicatedServerOptimizations: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 0 + meshDeformation: 0 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + metalUseMetalDisplayLink: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchGpuScratchPoolGranularity: 2097152 + switchAllowGpuScratchShrinking: 0 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + switchMaxWorkerMultiple: 8 + switchNVNGraphicsFirmwareMemory: 32 + switchGraphicsJobsSyncAfterKick: 1 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 0 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + loadStoreDebugModeEnabled: 0 + visionOSBundleVersion: 1.0 + tvOSBundleVersion: 1.0 + bundleVersion: 1.0 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 + allowHDRDisplaySupport: 0 + useHDRDisplay: 0 + hdrBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.4 + androidMinAspectRatio: 1 + applicationIdentifier: + Standalone: com.DefaultCompany.2D-Project + buildNumber: + Standalone: 0 + VisionOS: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 1 + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 25 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + AndroidPreferredDataLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + androidSplitApplicationBinary: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + strictShaderVariantMatching: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSSimulatorArchitecture: 0 + iOSTargetOSVersionString: 15.0 + tvOSSdkVersion: 0 + tvOSSimulatorArchitecture: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 15.0 + VisionOSSdkVersion: 0 + VisionOSTargetOSVersionString: 1.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + macOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + metalCompileShaderBinary: 0 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + shaderPrecisionModel: 0 + clonedFromGUID: 10ad67313f4034357812315f3c407484 + templatePackageId: com.unity.template.2d@11.0.0 + templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomGradleSettingsTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 2 + AndroidAllowedArchitectures: -13 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 + AndroidEnableArm64MTE: 0 + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + androidAppCategory: 3 + useAndroidAppCategory: 1 + androidAppCategoryOther: + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + AndroidReportGooglePlayAppDependencies: 1 + androidSymbolsSizeThreshold: 800 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] + m_BuildTargetBatching: [] + m_BuildTargetShaderSettings: [] + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 0 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 0 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 0 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 0 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: [] + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 1 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + m_BuildTargetVRSettings: [] + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupHDRCubemapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] + m_BuildTargetNormalMapEncoding: [] + m_BuildTargetDefaultTextureCompressionFormat: + - serializedVersion: 3 + m_BuildTarget: Android + m_Formats: 03000000 + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + editorGfxJobOverride: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + macOSTargetOSVersion: 12.0 + switchNMETAOverride: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchEnableFileSystemTrace: 0 + switchLTOSetting: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchDisableHTCSPlayerConnection: 0 + switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 0 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 + switchUpgradedPlayerSettingsToNMETA: 0 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: ARLRRL59bcfuU0C9AGuPDYRMsZlDaGMq + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 32 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 0 + webGLWasmArithmeticExceptions: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLDecompressionFallback: 0 + webGLInitialMemorySize: 32 + webGLMaximumMemorySize: 2048 + webGLMemoryGrowthMode: 2 + webGLMemoryLinearGrowthStep: 16 + webGLMemoryGeometricGrowthStep: 0.2 + webGLMemoryGeometricGrowthCap: 96 + webGLPowerPreference: 2 + webGLWebAssemblyTable: 0 + webGLWebAssemblyBigInt: 0 + webGLCloseOnQuit: 0 + webWasm2023: 0 + webEnableSubmoduleStrippingCompatibility: 0 + scriptingDefineSymbols: {} + additionalCompilerArguments: {} + platformArchitecture: {} + scriptingBackend: + Android: 1 + il2cppCompilerConfiguration: {} + il2cppCodeGeneration: {} + il2cppStacktraceInformation: {} + managedStrippingLevel: {} + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 0 + useDeterministicCompilation: 1 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + editorAssembliesCompatibilityLevel: 1 + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: unity + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: unity + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} + metroSplashScreenUseBackgroundColor: 0 + syncCapabilities: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: {} + cloudServicesEnabled: {} + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + hmiPlayerDataPath: + hmiForceSRGBBlit: 0 + embeddedLinuxEnableGamepadInput: 0 + hmiCpuConfiguration: + hmiLogStartupTiming: 0 + qnxGraphicConfPath: + apiCompatibilityLevel: 6 + captureStartupLogs: {} + activeInputHandler: 1 + windowsGamepadBackendHint: 0 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] + projectName: + organizationId: + cloudEnabled: 0 + legacyClampBlendShapeWeights: 0 + hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 + virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 + androidVulkanDenyFilterList: [] + androidVulkanAllowFilterList: [] + androidVulkanDeviceFilterListAsset: {fileID: 0} + d3d12DeviceFilterListAsset: {fileID: 0} + allowedHttpConnections: 3 diff --git a/benchmarks/unity/ProjectSettings/ProjectVersion.txt b/benchmarks/unity/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..550b6e8 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 6000.3.11f1 +m_EditorVersionWithRevision: 6000.3.11f1 (3000ef702840) diff --git a/benchmarks/unity/ProjectSettings/QualitySettings.asset b/benchmarks/unity/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..bcd6706 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/QualitySettings.asset @@ -0,0 +1,239 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 255 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Lumin: 5 + GameCoreScarlett: 5 + GameCoreXboxOne: 5 + Nintendo Switch: 5 + PS4: 5 + PS5: 5 + Stadia: 5 + Standalone: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/benchmarks/unity/ProjectSettings/SceneTemplateSettings.json b/benchmarks/unity/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 0000000..ede5887 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,121 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "defaultInstantiationMode": 1 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "defaultInstantiationMode": 0 + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "defaultInstantiationMode": 0 + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "defaultInstantiationMode": 1 + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/benchmarks/unity/ProjectSettings/TagManager.asset b/benchmarks/unity/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/benchmarks/unity/ProjectSettings/TimeManager.asset b/benchmarks/unity/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/benchmarks/unity/ProjectSettings/UnityConnectSettings.asset b/benchmarks/unity/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..029ad8b --- /dev/null +++ b/benchmarks/unity/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + InsightsSettings: + m_EngineDiagnosticsEnabled: 1 + m_Enabled: 0 + CrashReportingSettings: + serializedVersion: 2 + m_EventUrl: https://perf-events.cloud.unity3d.com + m_EnableCloudDiagnosticsReporting: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/benchmarks/unity/ProjectSettings/VFXManager.asset b/benchmarks/unity/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..46f38e1 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/VFXManager.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 + m_CompiledVersion: 0 + m_RuntimeVersion: 0 diff --git a/benchmarks/unity/ProjectSettings/VersionControlSettings.asset b/benchmarks/unity/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000..dca2881 --- /dev/null +++ b/benchmarks/unity/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/benchmarks/unity/ProjectSettings/XRSettings.asset b/benchmarks/unity/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/benchmarks/unity/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file diff --git a/benchmarks/unity/unity.sln b/benchmarks/unity/unity.sln new file mode 100644 index 0000000..fdd7ecf --- /dev/null +++ b/benchmarks/unity/unity.sln @@ -0,0 +1,17 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmarks", "Benchmarks.csproj", "{b6ce87c6-d606-93b9-b8b1-3b520c8d6bae}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {b6ce87c6-d606-93b9-b8b1-3b520c8d6bae}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {b6ce87c6-d606-93b9-b8b1-3b520c8d6bae}.Debug|Any CPU.Build.0 = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/go.mod b/go.mod index b0fbf4e..d4163d8 100644 --- a/go.mod +++ b/go.mod @@ -1 +1,8 @@ module github.com/edmand46/arpack + +go 1.23 + +require ( + github.com/google/flatbuffers v25.2.10+incompatible + google.golang.org/protobuf v1.36.11 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..cebee63 --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=