public void BuildOctree() { var cubes = _cubesQuery.ToComponentDataArray <Translation>(Allocator.TempJob); var entities = _cubesQuery.ToEntityArray(Allocator.TempJob); var elements = new NativeArray <OctElement <Entity> >(cubes.Length, Allocator.TempJob); var bounds = new AABB { Center = 0, Extents = _cubesSystem.DesiredRadius }; if (_isTreeCreated) { _tree.Dispose(); } _tree = new NativeOctree_Original <Entity>(bounds, Allocator.Persistent); _isTreeCreated = true; for (int i = 0; i < cubes.Length; i++) { elements[i] = new OctElement <Entity> { pos = cubes[i].Value, element = entities[i] }; } _octreeSystem.Build(_tree, elements); cubes.Dispose(); entities.Dispose(); elements.Dispose(); }
public void RangeQuery(NativeOctree_Original <Entity> tree, AABB bounds, NativeList <OctElement <Entity> > results) { _sw2.Restart(); Job.WithCode(() => { tree.RangeQuery(bounds, results); }).Run(); _sw2.Stop(); if (DebugLogging) { Debug.Log($"NativeOctree_Original.RangeQuery took {_sw2.Elapsed.TotalMilliseconds:N4}ms to find {results.Length} results"); } }
public void Build(NativeOctree_Original <Entity> tree, NativeArray <OctElement <Entity> > elements) { _sw1.Restart(); Job.WithCode(() => { tree.ClearAndBulkInsert(elements); }).Run(); _sw1.Stop(); if (DebugLogging) { Debug.Log($"NativeOctree_Original.ClearAndBulkInsert took {_sw1.Elapsed.TotalMilliseconds:N4}ms for {elements.Length} elements"); } }
public void BuildTree([Values(10, 100, 1000, 25000)] int items, [Values(10, 100, 1000, 25000)] int extents) { var system = base.m_World.GetOrCreateSystem <OctreeTestSystem>(); system.DebugLogging = false; var systemOriginal = base.m_World.GetOrCreateSystem <OctreeTestSystem2>(); systemOriginal.DebugLogging = false; var measurements = 25; var warmups = 5; var group = new SampleGroupDefinition { AggregationType = AggregationType.Average, Name = $"BuildTree, Items:{items} Extents:{extents}", SampleUnit = SampleUnit.Millisecond }; var groupOriginal = new SampleGroupDefinition { AggregationType = AggregationType.Average, Name = $"BuildTree.Original, Items:{items} Extents:{extents}", SampleUnit = SampleUnit.Millisecond }; for (int i = 0; i < measurements; i++) { if (i < warmups) { var bounds = new AABB { Center = 0, Extents = extents }; var tree = new NativeOctree <int>(bounds, Allocator.Temp); var treeOriginal = new NativeOctree_Original <int>(bounds, Allocator.Temp); var elements = new NativeArray <OctElement <int> >(items, Allocator.Temp); system.Build(tree, elements); systemOriginal.Build(treeOriginal, elements); } else { var bounds = new AABB { Center = 0, Extents = extents }; var tree = new NativeOctree <int>(bounds, Allocator.Temp); var elements = new NativeArray <OctElement <int> >(items, Allocator.Temp); for (int j = 0; j < items; j++) { elements[j] = new OctElement <int> { pos = new float3(Random.insideUnitSphere * extents), element = j }; } system.Build(tree, elements); Measure.Custom(group, system.BuildStopWatch.Elapsed.TotalMilliseconds); bounds = new AABB { Center = 0, Extents = extents }; var treeOriginal = new NativeOctree_Original <int>(bounds, Allocator.Temp); elements = new NativeArray <OctElement <int> >(items, Allocator.Temp); for (int j = 0; j < items; j++) { elements[j] = new OctElement <int> { pos = new float3(Random.insideUnitSphere * extents), element = j }; } systemOriginal.Build(treeOriginal, elements); Measure.Custom(groupOriginal, systemOriginal.BuildStopWatch.Elapsed.TotalMilliseconds); Debug.Log($"NativeOctree.ClearAndBulkInsert Original={systemOriginal.BuildStopWatch.Elapsed.TotalMilliseconds:N4}ms Modified={system.BuildStopWatch.Elapsed.TotalMilliseconds:N4}ms"); } } }
public void RangeQuery([Values(10, 100, 1000, 10000)] int items, [Values(10, 100, 1000, 10000)] int extents, [Values(true, false)] bool resultResize, [Values(0.01f, 0.1f, 0.25f, 0.5f, 1.1f)] float queryBounds, [Values(RangeQueryTargetAreaPosition.Centered, RangeQueryTargetAreaPosition.Random)] RangeQueryTargetAreaPosition targetPosition) { var system = base.m_World.GetOrCreateSystem <OctreeTestSystem>(); system.DebugLogging = false; var systemOriginal = base.m_World.GetOrCreateSystem <OctreeTestSystem2>(); systemOriginal.DebugLogging = false; var measurements = 15; var warmups = 2; float3 targetAreaPosition = targetPosition == RangeQueryTargetAreaPosition.Random ? new float3(Random.insideUnitSphere * extents) : 0; var bounds = new AABB { Center = 0, Extents = extents }; var queryAABB = new AABB { Center = targetAreaPosition, Extents = bounds.Extents * queryBounds }; var queryAabb = new Aabb { Min = queryAABB.Min, Max = queryAABB.Max }; var group = new SampleGroupDefinition { AggregationType = AggregationType.Average, Name = $"RangeQuery, Items:{items} Extents:{extents} QueryAABB:{queryAABB}", SampleUnit = SampleUnit.Millisecond }; var groupOriginal = new SampleGroupDefinition { AggregationType = AggregationType.Average, Name = $"RangeQuery.Original, Items:{items} Extents:{extents} QueryAABB:{queryAABB}", SampleUnit = SampleUnit.Millisecond }; var elements = new NativeArray <OctElement <int> >(items, Allocator.Temp); for (int j = 1; j < items; j++) // element 0 should always be a result. { elements[j] = new OctElement <int> { pos = new float3(Random.insideUnitSphere * extents), element = j }; } for (int i = 0; i < measurements; i++) { if (i < warmups) { var tree = new NativeOctree <int>(bounds, Allocator.Temp); var results = new NativeList <OctElement <int> >(resultResize ? 1 : items, Allocator.Temp); system.Build(tree, elements); system.RangeQuery(tree, queryAABB, results); var treeOriginal = new NativeOctree_Original <int>(bounds, Allocator.Temp); var resultsOriginal = new NativeList <OctElement <int> >(resultResize ? 1 : items * 25, Allocator.Temp); systemOriginal.Build(treeOriginal, elements); systemOriginal.RangeQuery(treeOriginal, queryAABB, resultsOriginal); } else { var tree = new NativeOctree <int>(bounds, Allocator.Temp); var results = new NativeList <OctElement <int> >(resultResize ? 1 : items, Allocator.Temp); system.Build(tree, elements); system.RangeQuery(tree, queryAABB, results); Measure.Custom(group, system.QueryStopWatch.Elapsed.TotalMilliseconds); var treeOriginal = new NativeOctree_Original <int>(bounds, Allocator.Temp); var resultsOriginal = new NativeList <OctElement <int> >(resultResize ? 1 : items * 25, Allocator.Temp); systemOriginal.Build(treeOriginal, elements); systemOriginal.RangeQuery(treeOriginal, queryAABB, resultsOriginal); Measure.Custom(groupOriginal, systemOriginal.QueryStopWatch.Elapsed.TotalMilliseconds); if (targetPosition == RangeQueryTargetAreaPosition.Centered) { Assert.IsTrue(resultsOriginal.Length > 0); } Assert.AreEqual(resultsOriginal.Length, results.Length); Debug.Log($"NativeOctree.RangeQuery Original={systemOriginal.QueryStopWatch.Elapsed.TotalMilliseconds:N4}ms Modified={system.QueryStopWatch.Elapsed.TotalMilliseconds:N4}ms for {results.Length} results"); Debug.Log($"TreeData Elements={*tree.Data}"); } } }