Пример #1
0
        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();
        }
Пример #2
0
 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");
     }
 }
Пример #3
0
 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");
     }
 }
Пример #4
0
    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");
            }
        }
    }
Пример #5
0
    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}");
            }
        }
    }