public void InsertTriggerDivideNonBurstBulk() { var values = GetValues(); var positions = new NativeArray <float3>(values.Length, Allocator.TempJob); var octree = new NativeOctree <int>(Bounds); positions.CopyFrom(values); NativeArray <OctElement <int> > elements = new NativeArray <OctElement <int> >(positions.Length, Allocator.Temp); for (int i = 0; i < positions.Length; i++) { elements[i] = new OctElement <int> { pos = positions[i], element = i }; } var s = Stopwatch.StartNew(); octree.ClearAndBulkInsert(elements); s.Stop(); Debug.Log(s.Elapsed.TotalMilliseconds); OctreeDrawer.Draw(octree); octree.Dispose(); positions.Dispose(); }
public void RangeQuery(NativeOctree <int> tree, AABB bounds2, NativeList <OctElement <int> > results) { QueryStopWatch.Restart(); Job.WithCode(() => { tree.RangeQuery(bounds2, results); }).Run(); QueryStopWatch.Stop(); if (DebugLogging) { Debug.Log($"NativeOctree.RangeQuery took {QueryStopWatch.Elapsed.TotalMilliseconds:N4}ms to find {results.Length} results"); } }
public void Build(NativeOctree <int> tree, NativeArray <OctElement <int> > elements) { BuildStopWatch.Restart(); Job.WithCode(() => { tree.ClearAndBulkInsert(elements); }).Run(); BuildStopWatch.Stop(); if (DebugLogging) { Debug.Log($"NativeOctree.ClearAndBulkInsert took {BuildStopWatch.Elapsed.TotalMilliseconds:N4}ms for {elements.Length} elements"); } }
public void RangeQueryAfterBulk() { var values = GetValues(); NativeArray <OctElement <int> > elements = new NativeArray <OctElement <int> >(values.Length, Allocator.TempJob); for (int i = 0; i < values.Length; i++) { elements[i] = new OctElement <int> { pos = values[i], element = i }; } var octree = new NativeOctree <int>(Bounds); octree.ClearAndBulkInsert(elements); var queryJob = new OctreeJobs.RangeQueryJob <int> { Octree = octree, Bounds = new AABB { Center = 100, Extents = new float3(200, 1000, 200) }, Results = new NativeList <OctElement <int> >(1000, Allocator.TempJob) }; var s = Stopwatch.StartNew(); queryJob.Run(); s.Stop(); Debug.Log(s.Elapsed.TotalMilliseconds + " result: " + queryJob.Results.Length); OctreeDrawer.DrawWithResults(queryJob); octree.Dispose(); elements.Dispose(); queryJob.Results.Dispose(); }
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}"); } } }
public static void Draw <T>(NativeOctree <T> octree) where T : unmanaged { OctreeDrawer window = (OctreeDrawer)GetWindow(typeof(OctreeDrawer)); window.DoDraw(octree, default, default);