From b3705a6b5809ab918dd60349a27471eef6e89fc9 Mon Sep 17 00:00:00 2001 From: notgiven688 Date: Wed, 18 Dec 2024 12:32:12 +0100 Subject: [PATCH] sorting --- src/Jitter2/Collision/DynamicTree.cs | 43 +++++++++++----------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/src/Jitter2/Collision/DynamicTree.cs b/src/Jitter2/Collision/DynamicTree.cs index 9175f9d4..91508f4c 100644 --- a/src/Jitter2/Collision/DynamicTree.cs +++ b/src/Jitter2/Collision/DynamicTree.cs @@ -126,15 +126,15 @@ public struct Node private int nodePointer = -1; private int root = NullNode; - private Action updateBoundingBoxes; + private readonly Action scanMoved; + private readonly Action scanOverlaps; + private readonly Action updateBoundingBoxes; /// /// Gets the root of the dynamic tree. /// public int Root => root; - private readonly Action scanOverlapsPre; - private readonly Action scanOverlapsPost; public Func Filter { get; set; } @@ -144,14 +144,8 @@ public struct Node /// A collision filter function, used in Jitter to exclude collisions between Shapes belonging to the same body. The collision is filtered out if the function returns false. public DynamicTree(Func filter) { - scanOverlapsPre = batch => - { - ScanForMovedProxies(batch); - //ScanForOverlaps(batch.BatchIndex, false); - }; - - scanOverlapsPost = batch => { ScanForOverlaps(batch.BatchIndex, true); }; - + scanMoved = ScanForMovedProxies; + scanOverlaps = batch => { ScanForOverlaps(batch.BatchIndex, true); }; updateBoundingBoxes = UpdateBoundingBoxesCallback; Filter = filter; @@ -159,10 +153,10 @@ public DynamicTree(Func filter) public enum Timings { - ScanOverlapsPre, - UpdateProxies, - ScanOverlapsPost, UpdateBoundingBoxes, + ScanMoved, + UpdateProxies, + ScanOverlaps, Last } @@ -196,20 +190,18 @@ void SetTime(Timings type) CheckBagCount(multiThread); - SetTime(Timings.ScanOverlapsPre); - SetTime(Timings.UpdateBoundingBoxes); if (multiThread) { proxies.ParallelForBatch(256, updateBoundingBoxes); + SetTime(Timings.UpdateBoundingBoxes); const int taskThreshold = 24; int numTasks = Math.Clamp(proxies.ActiveCount / taskThreshold, 1, ThreadPool.Instance.ThreadCount); + Parallel.ForBatch(0, proxies.ActiveCount, numTasks, scanMoved); - Parallel.ForBatch(0, proxies.ActiveCount, numTasks, scanOverlapsPre); - - SetTime(Timings.ScanOverlapsPre); + SetTime(Timings.ScanMoved); updatedProxies = 0; @@ -227,19 +219,18 @@ void SetTime(Timings type) SetTime(Timings.UpdateProxies); - Parallel.ForBatch(0, proxies.ActiveCount, numTasks, scanOverlapsPost); + Parallel.ForBatch(0, proxies.ActiveCount, numTasks, scanOverlaps); - SetTime(Timings.ScanOverlapsPost); + SetTime(Timings.ScanOverlaps); } else { var batch = new Parallel.Batch(0, proxies.ActiveCount); - UpdateBoundingBoxesCallback(batch); SetTime(Timings.UpdateBoundingBoxes); - scanOverlapsPre(batch); - SetTime(Timings.ScanOverlapsPre); + scanMoved(batch); + SetTime(Timings.ScanMoved); var sl = lists[0]; for (int i = 0; i < sl.Count; i++) @@ -250,8 +241,8 @@ void SetTime(Timings type) SetTime(Timings.UpdateProxies); - scanOverlapsPost(new Parallel.Batch(0, proxies.ActiveCount)); - SetTime(Timings.ScanOverlapsPost); + scanOverlaps(new Parallel.Batch(0, proxies.ActiveCount)); + SetTime(Timings.ScanOverlaps); } }