mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.8 KiB
C++
54 lines
1.8 KiB
C++
#include "scripttracker.hpp"
|
|
|
|
namespace LuaUtil
|
|
{
|
|
namespace
|
|
{
|
|
constexpr unsigned sMinLoadedFrames = 50;
|
|
constexpr unsigned sMaxLoadedFrames = 600;
|
|
constexpr unsigned sUsageFrameGrowth = 10;
|
|
constexpr std::size_t sMinToProcess = 1;
|
|
constexpr std::size_t sToProcessDiv = 20; // 5%
|
|
}
|
|
|
|
void ScriptTracker::onLoad(ScriptsContainer& container)
|
|
{
|
|
mLoadedScripts.emplace(container.mThis, sMinLoadedFrames + mFrame);
|
|
}
|
|
|
|
void ScriptTracker::unloadInactiveScripts(LuaView& lua)
|
|
{
|
|
// This code is technically incorrect if mFrame overflows... but at 300fps that takes about half a year
|
|
std::size_t toProcess = std::max(mLoadedScripts.size() / sToProcessDiv, sMinToProcess);
|
|
while (toProcess && !mLoadedScripts.empty())
|
|
{
|
|
--toProcess;
|
|
auto [ptr, ttl] = std::move(mLoadedScripts.front());
|
|
mLoadedScripts.pop();
|
|
ScriptsContainer* container = *ptr.get();
|
|
// Object no longer exists, cease tracking
|
|
if (!container)
|
|
continue;
|
|
// Ignore activity of local scripts in the active grid
|
|
if (container->isActive())
|
|
ttl = std::max(ttl, mFrame + sMinLoadedFrames);
|
|
else
|
|
{
|
|
bool activeSinceLastPop = container->mRequiredLoading;
|
|
if (activeSinceLastPop)
|
|
{
|
|
container->mRequiredLoading = false;
|
|
ttl = std::min(ttl + sUsageFrameGrowth, mFrame + sMaxLoadedFrames);
|
|
}
|
|
else if (ttl < mFrame)
|
|
{
|
|
container->ensureUnloaded(lua);
|
|
continue;
|
|
}
|
|
}
|
|
mLoadedScripts.emplace(std::move(ptr), ttl);
|
|
}
|
|
++mFrame;
|
|
}
|
|
}
|