This commit is contained in:
CortexCore
2024-03-31 23:31:00 +08:00
parent e179d2eb53
commit b7b89ee71a
641 changed files with 31286 additions and 22134 deletions

View File

@@ -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
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a8172872d3daab147bc7fd15fd3a97a6
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View 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);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 832305bf6e10412ab212389d06708fea
timeCreated: 1578854647

View 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();
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d538ed72a7d2543d390cf79dbb36413c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: