2
0
Эх сурвалжийг харах

Improve performance of certain physics queries when using Jolt Physics

Mikael Hermansson 8 сар өмнө
parent
commit
5d2a54e6b1

+ 1 - 1
modules/jolt_physics/spaces/jolt_physics_direct_space_state_3d.cpp

@@ -76,7 +76,7 @@ bool JoltPhysicsDirectSpaceState3D::_cast_motion_impl(const JPH::Shape &p_jolt_s
 	aabb_translated.Translate(motion);
 	aabb.Encapsulate(aabb_translated);
 
-	JoltQueryCollectorAnyMulti<JPH::CollideShapeBodyCollector, 2048> aabb_collector;
+	JoltQueryCollectorAnyMulti<JPH::CollideShapeBodyCollector, 1024> aabb_collector;
 	space->get_broad_phase_query().CollideAABox(aabb, aabb_collector, p_broad_phase_layer_filter, p_object_layer_filter);
 
 	if (!aabb_collector.had_hit()) {

+ 18 - 8
modules/jolt_physics/spaces/jolt_query_collectors.h

@@ -34,10 +34,9 @@
 #include "../jolt_project_settings.h"
 #include "jolt_space_3d.h"
 
-#include "core/templates/local_vector.h"
-
 #include "Jolt/Jolt.h"
 
+#include "Jolt/Core/STLLocalAllocator.h"
 #include "Jolt/Physics/Collision/InternalEdgeRemovingCollector.h"
 #include "Jolt/Physics/Collision/Shape/Shape.h"
 
@@ -45,11 +44,16 @@ template <typename TBase, int TDefaultCapacity>
 class JoltQueryCollectorAll final : public TBase {
 public:
 	typedef typename TBase::ResultType Hit;
+	typedef JPH::Array<Hit, JPH::STLLocalAllocator<Hit, TDefaultCapacity>> HitArray;
 
 private:
-	JPH::Array<Hit> hits;
+	HitArray hits;
 
 public:
+	JoltQueryCollectorAll() {
+		hits.reserve(TDefaultCapacity);
+	}
+
 	bool had_hit() const {
 		return !hits.is_empty();
 	}
@@ -109,14 +113,17 @@ template <typename TBase, int TDefaultCapacity>
 class JoltQueryCollectorAnyMulti final : public TBase {
 public:
 	typedef typename TBase::ResultType Hit;
+	typedef JPH::Array<Hit, JPH::STLLocalAllocator<Hit, TDefaultCapacity>> HitArray;
 
 private:
-	JPH::Array<Hit> hits;
+	HitArray hits;
 	int max_hits = 0;
 
 public:
 	explicit JoltQueryCollectorAnyMulti(int p_max_hits = TDefaultCapacity) :
-			max_hits(p_max_hits) {}
+			max_hits(p_max_hits) {
+		hits.reserve(TDefaultCapacity);
+	}
 
 	bool had_hit() const {
 		return hits.size() > 0;
@@ -189,14 +196,17 @@ template <typename TBase, int TDefaultCapacity>
 class JoltQueryCollectorClosestMulti final : public TBase {
 public:
 	typedef typename TBase::ResultType Hit;
+	typedef JPH::Array<Hit, JPH::STLLocalAllocator<Hit, TDefaultCapacity + 1>> HitArray;
 
 private:
-	JPH::Array<Hit> hits;
+	HitArray hits;
 	int max_hits = 0;
 
 public:
 	explicit JoltQueryCollectorClosestMulti(int p_max_hits = TDefaultCapacity) :
-			max_hits(p_max_hits) {}
+			max_hits(p_max_hits) {
+		hits.reserve(TDefaultCapacity + 1);
+	}
 
 	bool had_hit() const {
 		return hits.size() > 0;
@@ -220,7 +230,7 @@ public:
 	}
 
 	virtual void AddHit(const Hit &p_hit) override {
-		typename JPH::Array<Hit>::const_iterator E = hits.cbegin();
+		typename HitArray::const_iterator E = hits.cbegin();
 		for (; E != hits.cend(); ++E) {
 			if (p_hit.GetEarlyOutFraction() < E->GetEarlyOutFraction()) {
 				break;