1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-21 07:39:44 +00:00

Merge branch 'CompositeMapRendererFreeze' into 'master'

Implement fix for the CompositeMapRender freeze

Closes #7696

See merge request OpenMW/openmw!3626
This commit is contained in:
elsid 2023-12-28 09:37:12 +00:00
commit 2a797cb4e4
2 changed files with 6 additions and 16 deletions

View file

@ -43,19 +43,18 @@ namespace Terrain
mImmediateCompileSet.erase(node);
mMutex.unlock();
compile(*node, renderInfo, nullptr);
compile(*node, renderInfo);
mMutex.lock();
}
double timeLeft = availableTime;
while (!mCompileSet.empty() && timeLeft > 0)
const auto deadline = std::chrono::steady_clock::now() + std::chrono::duration<double>(availableTime);
while (!mCompileSet.empty() && std::chrono::steady_clock::now() < deadline)
{
osg::ref_ptr<CompositeMap> node = *mCompileSet.begin();
mCompileSet.erase(node);
mMutex.unlock();
compile(*node, renderInfo, &timeLeft);
compile(*node, renderInfo);
mMutex.lock();
if (node->mCompiled < node->mDrawables.size())
@ -68,7 +67,7 @@ namespace Terrain
mTimer.setStartTick();
}
void CompositeMapRenderer::compile(CompositeMap& compositeMap, osg::RenderInfo& renderInfo, double* timeLeft) const
void CompositeMapRenderer::compile(CompositeMap& compositeMap, osg::RenderInfo& renderInfo) const
{
// if there are no more external references we can assume the texture is no longer required
if (compositeMap.mTexture->referenceCount() <= 1)
@ -124,15 +123,6 @@ namespace Terrain
++compositeMap.mCompiled;
compositeMap.mDrawables[i] = nullptr;
if (timeLeft)
{
*timeLeft -= timer.time_s();
timer.setStartTick();
if (*timeLeft <= 0)
break;
}
}
if (compositeMap.mCompiled == compositeMap.mDrawables.size())
compositeMap.mDrawables = std::vector<osg::ref_ptr<osg::Drawable>>();

View file

@ -38,7 +38,7 @@ namespace Terrain
void drawImplementation(osg::RenderInfo& renderInfo) const override;
void compile(CompositeMap& compositeMap, osg::RenderInfo& renderInfo, double* timeLeft) const;
void compile(CompositeMap& compositeMap, osg::RenderInfo& renderInfo) const;
/// Set the available time in seconds for compiling (non-immediate) composite maps each frame
void setMinimumTimeAvailableForCompile(double time);