mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-26 15:39:51 +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:
commit
2a797cb4e4
@ -43,19 +43,18 @@ namespace Terrain
|
|||||||
mImmediateCompileSet.erase(node);
|
mImmediateCompileSet.erase(node);
|
||||||
|
|
||||||
mMutex.unlock();
|
mMutex.unlock();
|
||||||
compile(*node, renderInfo, nullptr);
|
compile(*node, renderInfo);
|
||||||
mMutex.lock();
|
mMutex.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
double timeLeft = availableTime;
|
const auto deadline = std::chrono::steady_clock::now() + std::chrono::duration<double>(availableTime);
|
||||||
|
while (!mCompileSet.empty() && std::chrono::steady_clock::now() < deadline)
|
||||||
while (!mCompileSet.empty() && timeLeft > 0)
|
|
||||||
{
|
{
|
||||||
osg::ref_ptr<CompositeMap> node = *mCompileSet.begin();
|
osg::ref_ptr<CompositeMap> node = *mCompileSet.begin();
|
||||||
mCompileSet.erase(node);
|
mCompileSet.erase(node);
|
||||||
|
|
||||||
mMutex.unlock();
|
mMutex.unlock();
|
||||||
compile(*node, renderInfo, &timeLeft);
|
compile(*node, renderInfo);
|
||||||
mMutex.lock();
|
mMutex.lock();
|
||||||
|
|
||||||
if (node->mCompiled < node->mDrawables.size())
|
if (node->mCompiled < node->mDrawables.size())
|
||||||
@ -68,7 +67,7 @@ namespace Terrain
|
|||||||
mTimer.setStartTick();
|
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 there are no more external references we can assume the texture is no longer required
|
||||||
if (compositeMap.mTexture->referenceCount() <= 1)
|
if (compositeMap.mTexture->referenceCount() <= 1)
|
||||||
@ -124,15 +123,6 @@ namespace Terrain
|
|||||||
++compositeMap.mCompiled;
|
++compositeMap.mCompiled;
|
||||||
|
|
||||||
compositeMap.mDrawables[i] = nullptr;
|
compositeMap.mDrawables[i] = nullptr;
|
||||||
|
|
||||||
if (timeLeft)
|
|
||||||
{
|
|
||||||
*timeLeft -= timer.time_s();
|
|
||||||
timer.setStartTick();
|
|
||||||
|
|
||||||
if (*timeLeft <= 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (compositeMap.mCompiled == compositeMap.mDrawables.size())
|
if (compositeMap.mCompiled == compositeMap.mDrawables.size())
|
||||||
compositeMap.mDrawables = std::vector<osg::ref_ptr<osg::Drawable>>();
|
compositeMap.mDrawables = std::vector<osg::ref_ptr<osg::Drawable>>();
|
||||||
|
@ -38,7 +38,7 @@ namespace Terrain
|
|||||||
|
|
||||||
void drawImplementation(osg::RenderInfo& renderInfo) const override;
|
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
|
/// Set the available time in seconds for compiling (non-immediate) composite maps each frame
|
||||||
void setMinimumTimeAvailableForCompile(double time);
|
void setMinimumTimeAvailableForCompile(double time);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user