1
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "BITKit.NativeQuadTree.Editor",
|
||||
"rootNamespace": "",
|
||||
"references": [
|
||||
"GUID:d8b63aba1907145bea998dd612889d6b",
|
||||
"GUID:e0cd26848372d4e5c891c569017e11f1",
|
||||
"GUID:a9eec99827e569e45bfe3e5ea7494591",
|
||||
"GUID:27619889b8ba8c24980f49ee34dbb44a",
|
||||
"GUID:0acc523941302664db1f4e527237feb3"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": true,
|
||||
"precompiledReferences": [
|
||||
"nunit.framework.dll"
|
||||
],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [
|
||||
"UNITY_EDITOR"
|
||||
],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a8172872d3daab147bc7fd15fd3a97a6
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
61
Src/Unity/Scripts/NativeQuadTree/Editor/QuadTreeDrawer.cs
Normal file
61
Src/Unity/Scripts/NativeQuadTree/Editor/QuadTreeDrawer.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using NativeQuadTree;
|
||||
using Unity.Collections;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
public class QuadTreeDrawer : EditorWindow
|
||||
{
|
||||
[MenuItem("Window/QuadTreeDrawer")]
|
||||
static void Init()
|
||||
{
|
||||
GetWindow(typeof(QuadTreeDrawer)).Show();
|
||||
}
|
||||
|
||||
public static void Draw<T>(NativeQuadTree<T> quadTree) where T : unmanaged
|
||||
{
|
||||
QuadTreeDrawer window = (QuadTreeDrawer)GetWindow(typeof(QuadTreeDrawer));
|
||||
window.DoDraw(quadTree, default, default);
|
||||
}
|
||||
|
||||
public static void DrawWithResults<T>(QuadTreeJobs.RangeQueryJob<T> queryJob) where T : unmanaged
|
||||
{
|
||||
QuadTreeDrawer window = (QuadTreeDrawer)GetWindow(typeof(QuadTreeDrawer));
|
||||
window.DoDraw(queryJob);
|
||||
}
|
||||
|
||||
[SerializeField]
|
||||
Color[][] pixels;
|
||||
|
||||
void DoDraw<T>(NativeQuadTree<T> quadTree, NativeList<QuadElement<T>> results, AABB2D bounds) where T : unmanaged
|
||||
{
|
||||
pixels = new Color[256][];
|
||||
for (var i = 0; i < pixels.Length; i++)
|
||||
{
|
||||
pixels[i] = new Color[256];
|
||||
}
|
||||
NativeQuadTree<T>.Draw(quadTree, results, bounds, pixels);
|
||||
}
|
||||
|
||||
void DoDraw<T>(QuadTreeJobs.RangeQueryJob<T> queryJob) where T : unmanaged
|
||||
{
|
||||
DoDraw(queryJob.QuadTree, queryJob.Results, queryJob.Bounds);
|
||||
}
|
||||
|
||||
void OnGUI()
|
||||
{
|
||||
if(pixels != null)
|
||||
{
|
||||
var texture = new Texture2D(256, 256);
|
||||
for (var x = 0; x < pixels.Length; x++)
|
||||
{
|
||||
for (int y = 0; y < pixels[x].Length; y++)
|
||||
{
|
||||
texture.SetPixel(x, y, pixels[x][y]);
|
||||
}
|
||||
}
|
||||
texture.Apply();
|
||||
|
||||
GUI.DrawTexture(new Rect(0, 0, position.width, position.height), texture);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 832305bf6e10412ab212389d06708fea
|
||||
timeCreated: 1578854647
|
134
Src/Unity/Scripts/NativeQuadTree/Editor/QuadTreeTests.cs
Normal file
134
Src/Unity/Scripts/NativeQuadTree/Editor/QuadTreeTests.cs
Normal file
@@ -0,0 +1,134 @@
|
||||
using System.Diagnostics;
|
||||
using NUnit.Framework;
|
||||
using NativeQuadTree;
|
||||
using Unity.Burst;
|
||||
using Unity.Collections;
|
||||
using Unity.Jobs;
|
||||
using Unity.Mathematics;
|
||||
using UnityEngine;
|
||||
using Debug = UnityEngine.Debug;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
public class QuadTreeTests
|
||||
{
|
||||
AABB2D Bounds => new AABB2D(0, 1000);
|
||||
|
||||
float2[] GetValues()
|
||||
{
|
||||
Random.InitState(0);
|
||||
var values = new float2[20000];
|
||||
|
||||
for (int x = 0; x < values.Length; x++)
|
||||
{
|
||||
var val = new int2((int) Random.Range(-900, 900), (int) Random.Range(-900, 900));
|
||||
values[x] = val;
|
||||
}
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void InsertTriggerDivideBulk()
|
||||
{
|
||||
var values = GetValues();
|
||||
|
||||
var elements = new NativeArray<QuadElement<int>>(values.Length, Allocator.TempJob);
|
||||
|
||||
for (int i = 0; i < values.Length; i++)
|
||||
{
|
||||
elements[i] = new QuadElement<int>
|
||||
{
|
||||
pos = values[i],
|
||||
element = i
|
||||
};
|
||||
}
|
||||
|
||||
using var quadtree = new NativeQuadTree<int>(Bounds, Allocator.TempJob);
|
||||
var job = new QuadTreeJobs.AddBulkJob<int>
|
||||
{
|
||||
Elements = elements,
|
||||
QuadTree = quadtree,
|
||||
};
|
||||
|
||||
var s = Stopwatch.StartNew();
|
||||
|
||||
job.Run();
|
||||
|
||||
s.Stop();
|
||||
Debug.Log(s.Elapsed.TotalMilliseconds);
|
||||
|
||||
QuadTreeDrawer.Draw(quadtree);
|
||||
elements.Dispose();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RangeQueryAfterBulk()
|
||||
{
|
||||
var values = GetValues();
|
||||
|
||||
NativeArray<QuadElement<int>> elements = new NativeArray<QuadElement<int>>(values.Length, Allocator.TempJob);
|
||||
|
||||
for (int i = 0; i < values.Length; i++)
|
||||
{
|
||||
elements[i] = new QuadElement<int>
|
||||
{
|
||||
pos = values[i],
|
||||
element = i
|
||||
};
|
||||
}
|
||||
|
||||
var quadTree = new NativeQuadTree<int>(Bounds);
|
||||
quadTree.ClearAndBulkInsert(elements);
|
||||
|
||||
var queryJob = new QuadTreeJobs.RangeQueryJob<int>
|
||||
{
|
||||
QuadTree = quadTree,
|
||||
Bounds = new AABB2D(100, 140),
|
||||
Results = new NativeList<QuadElement<int>>(1000, Allocator.TempJob)
|
||||
};
|
||||
|
||||
var s = Stopwatch.StartNew();
|
||||
queryJob.Run();
|
||||
s.Stop();
|
||||
Debug.Log(s.Elapsed.TotalMilliseconds + " result: " + queryJob.Results.Length);
|
||||
|
||||
QuadTreeDrawer.DrawWithResults(queryJob);
|
||||
quadTree.Dispose();
|
||||
elements.Dispose();
|
||||
queryJob.Results.Dispose();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void InsertTriggerDivideNonBurstBulk()
|
||||
{
|
||||
var values = GetValues();
|
||||
|
||||
var positions = new NativeArray<float2>(values.Length, Allocator.TempJob);
|
||||
var quadTree = new NativeQuadTree<int>(Bounds);
|
||||
|
||||
positions.CopyFrom(values);
|
||||
|
||||
|
||||
NativeArray<QuadElement<int>> elements = new NativeArray<QuadElement<int>>(positions.Length, Allocator.Temp);
|
||||
|
||||
for (int i = 0; i < positions.Length; i++)
|
||||
{
|
||||
elements[i] = new QuadElement<int>
|
||||
{
|
||||
pos = positions[i],
|
||||
element = i
|
||||
};
|
||||
}
|
||||
|
||||
var s = Stopwatch.StartNew();
|
||||
|
||||
quadTree.ClearAndBulkInsert(elements);
|
||||
|
||||
s.Stop();
|
||||
Debug.Log(s.Elapsed.TotalMilliseconds);
|
||||
|
||||
QuadTreeDrawer.Draw(quadTree);
|
||||
quadTree.Dispose();
|
||||
positions.Dispose();
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d538ed72a7d2543d390cf79dbb36413c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in New Issue
Block a user