Parcourir la source

Ability to have more than 4 collision steps (#173)

PhysicsUpdateContext::Step is now allocated from the temp allocator so it is no longer a fixed size array
Jorrit Rouwe il y a 3 ans
Parent
commit
198a7cbe65

+ 1 - 1
Jolt/Core/JobSystemThreadPool.h

@@ -106,7 +106,7 @@ private:
 		virtual void		OnJobFinished(Job *inJob) override;
 
 		/// Jobs queue for the barrier
-		static constexpr uint cMaxJobs = 1024;
+		static constexpr uint cMaxJobs = 2048;
 		static_assert(IsPowerOf2(cMaxJobs));								// We do bit operations and require max jobs to be a power of 2
 		atomic<Job *> 		mJobs[cMaxJobs];								///< List of jobs that are part of this barrier, nullptrs for empty slots
 		alignas(JPH_CACHE_LINE_SIZE) atomic<uint> mJobReadIndex { 0 };		///< First job that could be valid (modulo cMaxJobs), can be nullptr if other thread is still working on adding the job

+ 2 - 3
Jolt/Physics/PhysicsSystem.cpp

@@ -144,15 +144,15 @@ void PhysicsSystem::Update(float inDeltaTime, int inCollisionSteps, int inIntegr
 	mPreviousSubStepDeltaTime = sub_step_delta_time;
 
 	// Create the context used for passing information between jobs
-	PhysicsUpdateContext context;
+	PhysicsUpdateContext context(*inTempAllocator);
 	context.mPhysicsSystem = this;
-	context.mTempAllocator = inTempAllocator;
 	context.mJobSystem = inJobSystem;
 	context.mBarrier = inJobSystem->CreateBarrier();
 	context.mIslandBuilder = &mIslandBuilder;
 	context.mStepDeltaTime = inDeltaTime / inCollisionSteps;
 	context.mSubStepDeltaTime = sub_step_delta_time;
 	context.mWarmStartImpulseRatio = warm_start_impulse_ratio;
+	context.mSteps.resize(inCollisionSteps);
 
 	// Allocate space for body pairs
 	JPH_ASSERT(context.mBodyPairs == nullptr);
@@ -188,7 +188,6 @@ void PhysicsSystem::Update(float inDeltaTime, int inCollisionSteps, int inIntegr
 		JPH_PROFILE("Build Jobs");
 
 		// Iterate over collision steps
-		context.mSteps.resize(inCollisionSteps);
 		for (int step_idx = 0; step_idx < inCollisionSteps; ++step_idx)
 		{
 			bool is_first_step = step_idx == 0;

+ 6 - 0
Jolt/Physics/PhysicsUpdateContext.cpp

@@ -7,6 +7,12 @@
 
 JPH_NAMESPACE_BEGIN
 
+PhysicsUpdateContext::PhysicsUpdateContext(TempAllocator &inTempAllocator) :
+	mTempAllocator(&inTempAllocator),
+	mSteps(inTempAllocator)
+{
+}
+
 PhysicsUpdateContext::~PhysicsUpdateContext()
 {
 	JPH_ASSERT(mBodyPairs == nullptr);

+ 6 - 2
Jolt/Physics/PhysicsUpdateContext.h

@@ -8,6 +8,7 @@
 #include <Jolt/Physics/Collision/BroadPhase/BroadPhase.h>
 #include <Jolt/Core/StaticArray.h>
 #include <Jolt/Core/JobSystem.h>
+#include <Jolt/Core/STLTempAllocator.h>
 
 JPH_NAMESPACE_BEGIN
 
@@ -21,10 +22,10 @@ class PhysicsUpdateContext : public NonCopyable
 {
 public:
 	/// Destructor
+	explicit				PhysicsUpdateContext(TempAllocator &inTempAllocator);
 							~PhysicsUpdateContext();
 
 	static constexpr int	cMaxConcurrency = 32;									///< Maximum supported amount of concurrent jobs
-	static constexpr int	cMaxSteps = 4;											///< Maximum supported amount of collision steps
 	static constexpr int	cMaxSubSteps = 4;										///< Maximum supported amount of integration sub steps
 
 	using JobHandleArray = StaticArray<JobHandle, cMaxConcurrency>;
@@ -92,6 +93,9 @@ public:
 	/// Structure that contains data needed for each collision step.
 	struct Step
 	{
+							Step() = default;
+							Step(const Step &)										{ JPH_ASSERT(false); } // vector needs a copy constructor, but we're never going to call it
+
 		PhysicsUpdateContext *mContext;												///< The physics update context
 
 		BroadPhase::UpdateState	mBroadPhaseUpdateState;								///< Handle returned by Broadphase::UpdatePrepare
@@ -133,7 +137,7 @@ public:
 		JobHandle			mStartNextStep;											///< Job that kicks the next step (empty for the last step)
 	};
 
-	using Steps = StaticArray<Step, cMaxSteps>;
+	using Steps = vector<Step, STLTempAllocator<Step>>;
 
 	/// Maximum amount of concurrent jobs on this machine
 	int						GetMaxConcurrency() const								{ const int max_concurrency = PhysicsUpdateContext::cMaxConcurrency; return min(max_concurrency, mJobSystem->GetMaxConcurrency()); } ///< Need to put max concurrency in temp var as min requires a reference