From c6abf52c3640310b1d07174b6430c33f4242a0aa Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sat, 8 Jun 2024 14:46:15 +0530 Subject: [PATCH] perf improv --- src/InstanceManager.hx | 68 +++++++++++++++++++++++++++++---- src/collision/BVHTree.hx | 1 + src/octree/PriorityQueue.hx | 1 + src/octree/PriorityQueueNode.hx | 1 + 4 files changed, 64 insertions(+), 7 deletions(-) diff --git a/src/InstanceManager.hx b/src/InstanceManager.hx index f0d7d3a8..940d229c 100644 --- a/src/InstanceManager.hx +++ b/src/InstanceManager.hx @@ -29,6 +29,7 @@ class MeshBatchInfo { var mesh:Mesh; var dtsShader:DtsTexture; var glowPassDtsShader:DtsTexture; + var baseBounds:h3d.col.Bounds; public function new() {} } @@ -44,17 +45,69 @@ class MeshInstance { } } +@:generic +class ReusableListIterator { + var l:ReusableList; + var i = 0; + + public function new(l:ReusableList) { + this.l = l; + } + + public inline function hasNext() { + return i != l.length; + } + + public inline function next() { + var ret = @:privateAccess l.array[i]; + i += 1; + return ret; + } +} + +@:allow(ReusableListIterator) +@:generic +class ReusableList { + var array:Array; + + public var length:Int = 0; + + public inline function new() { + array = []; + } + + public inline function push(item:T) { + if (array.length == length) { + array.push(item); + length += 1; + } else { + array[length] = item; + length += 1; + } + } + + public inline function clear() { + length = 0; + } + + public inline function iterator():ReusableListIterator { + return new ReusableListIterator(this); + } +} + class InstanceManager { var objects:Array> = []; - var objectMap:Map = []; var scene:Scene; + var opaqueinstances = new ReusableList(); + var transparentinstances = new ReusableList(); public function new(scene:Scene) { this.scene = scene; } public function render() { + static var tmpBounds = new h3d.col.Bounds(); var renderFrustum = scene.camera.frustum; var doFrustumCheck = true; // This sucks holy shit @@ -63,24 +116,24 @@ class InstanceManager { for (meshes in objects) { for (minfo in meshes) { - var opaqueinstances = []; - var transparentinstances = []; + opaqueinstances.clear(); + transparentinstances.clear(); // Culling if (minfo.meshbatch != null || minfo.transparencymeshbatch != null) { for (inst in minfo.instances) { // for (frustum in renderFrustums) { // if (frustum.hasBounds(objBounds)) { - var objBounds = @:privateAccess cast(minfo.meshbatch.primitive, Instanced).baseBounds.clone(); - objBounds.transform(inst.emptyObj.getAbsPos()); + tmpBounds.load(minfo.baseBounds); + tmpBounds.transform(inst.emptyObj.getAbsPos()); - if (cameraFrustrums == null && !renderFrustum.hasBounds(objBounds)) + if (cameraFrustrums == null && !renderFrustum.hasBounds(tmpBounds)) continue; if (cameraFrustrums != null) { var found = false; for (frustrum in cameraFrustrums) { - if (frustrum.hasBounds(objBounds)) { + if (frustrum.hasBounds(tmpBounds)) { found = true; break; } @@ -195,6 +248,7 @@ class InstanceManager { minfo.instances = [new MeshInstance(obj, object)]; minfo.meshbatch = isMesh ? new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene) : null; minfo.mesh = isMesh ? cast obj : null; + minfo.baseBounds = isMesh ? @:privateAccess cast(minfo.meshbatch.primitive, Instanced).baseBounds : null; if (isMesh) { var mat = cast(obj, Mesh).material; diff --git a/src/collision/BVHTree.hx b/src/collision/BVHTree.hx index 08d5c8f2..2364519e 100644 --- a/src/collision/BVHTree.hx +++ b/src/collision/BVHTree.hx @@ -9,6 +9,7 @@ interface IBVHObject { function rayCast(rayOrigin:Vector, rayDirection:Vector, results:Array):Void; } +@:generic @:publicFields class BVHNode { var index:Int; diff --git a/src/octree/PriorityQueue.hx b/src/octree/PriorityQueue.hx index 2748c3e1..a68ee36c 100644 --- a/src/octree/PriorityQueue.hx +++ b/src/octree/PriorityQueue.hx @@ -1,5 +1,6 @@ package octree; +@:generic class PriorityQueue { var queue:Array>; diff --git a/src/octree/PriorityQueueNode.hx b/src/octree/PriorityQueueNode.hx index b9fc74d7..9ef34c02 100644 --- a/src/octree/PriorityQueueNode.hx +++ b/src/octree/PriorityQueueNode.hx @@ -1,5 +1,6 @@ package octree; +@:generic class PriorityQueueNode { public var value:T; public var priority:Float;