Stop copying the gravity process's input every frame

In the vast majority of cases (i.e. when Gravity::Exchange is indirectly called from BeforeSim), the input is cleared to zeros anyway, so it's less work in Exchange to actually just exchange the old input with the new one than to copy the new one into the old one.

Also make gravity functions private in Simulation.
This commit is contained in:
Tamás Bálint Misius
2024-12-09 16:32:05 +01:00
parent a65338beea
commit 6b5bbb177d
5 changed files with 15 additions and 7 deletions

View File

@@ -3740,6 +3740,7 @@ void Simulation::BeforeSim()
air->update_airh();
DispatchNewtonianGravity();
// gravIn is now potentially garbage, which is ok, we were going to clear it for the frame anyway
for (auto p : gravIn.mass.Size().OriginRect())
{
gravIn.mass[p] = 0.f;
@@ -3964,6 +3965,8 @@ void Simulation::ResetNewtonianGravity(GravityInput newGravIn, GravityOutput new
{
gravIn = newGravIn;
DispatchNewtonianGravity();
// gravIn is now potentially garbage, set it again
gravIn = newGravIn;
if (grav)
{
gravOut = newGravOut;
@@ -3981,7 +3984,10 @@ void Simulation::EnableNewtonianGravity(bool enable)
if (!grav && enable)
{
grav = Gravity::Create();
auto oldGravIn = gravIn;
DispatchNewtonianGravity();
// gravIn is now potentially garbage, set it again
gravIn = std::move(oldGravIn);
}
}

View File

@@ -220,10 +220,11 @@ public:
~Simulation();
void EnableNewtonianGravity(bool enable);
void ResetNewtonianGravity(GravityInput newGravIn, GravityOutput newGravOut);
void DispatchNewtonianGravity();
void UpdateGravityMask();
private:
CoordStack& getCoordStackSingleton();
void ResetNewtonianGravity(GravityInput newGravIn, GravityOutput newGravOut);
void DispatchNewtonianGravity();
void UpdateGravityMask();
};

View File

@@ -204,7 +204,7 @@ void GravityImpl::Init()
});
}
void Gravity::Exchange(GravityOutput &gravOut, const GravityInput &gravIn)
void Gravity::Exchange(GravityOutput &gravOut, GravityInput &gravIn)
{
auto *fftGravity = static_cast<GravityImpl *>(this);
@@ -231,7 +231,7 @@ void Gravity::Exchange(GravityOutput &gravOut, const GravityInput &gravIn)
std::memcmp(&fftGravity->gravIn.mask[{ 0, 0 }], &gravIn.mask[{ 0, 0 }], NCELL * sizeof(float)))
{
fftGravity->copyGravOut = true;
fftGravity->gravIn = gravIn;
std::swap(gravIn, fftGravity->gravIn);
}
fftGravity->Dispatch();

View File

@@ -8,7 +8,8 @@ protected:
Gravity() = default;
public:
void Exchange(GravityOutput &gravOut, const GravityInput &gravIn);
// potentially clobbers gravIn
void Exchange(GravityOutput &gravOut, GravityInput &gravIn);
static GravityPtr Create();
};

View File

@@ -1,6 +1,6 @@
#include "Gravity.h"
void Gravity::Exchange(GravityOutput &gravOut, const GravityInput &gravIn)
void Gravity::Exchange(GravityOutput &gravOut, GravityInput &gravIn)
{
}