Added new computation of time to allocate to flushing deleted and compiling OpenGL objects per frame.

This commit is contained in:
Robert Osfield
2008-04-16 18:13:41 +00:00
parent c10acfcc47
commit 922dcb0423
3 changed files with 180 additions and 36 deletions

View File

@@ -161,6 +161,10 @@ static OpenThreads::Mutex s_drawSerializerMutex;
Renderer::Renderer(osg::Camera* camera):
osg::GraphicsOperation("Renderer",true),
OpenGLQuerySupport(),
_targetFrameRate(100.0),
_minimumTimeAvailableForGLCompileAndDeletePerFrame(0.001),
_flushTimeRatio(0.5),
_conservativeTimeRatio(0.5),
_camera(camera),
_done(false),
_graphicsThreadDoesCull(true)
@@ -389,22 +393,13 @@ void Renderer::draw()
_availableQueue.add(sceneView);
double availableTime = 0.004; // 4 ms
osg::Timer_t afterDispatchTick = osg::Timer::instance()->tick();
if (compileThread)
{
compileThread->add(_flushOperation.get());
}
else
{
sceneView->flushDeletedGLObjects(availableTime);
}
if (databasePager && databasePager->requiresExternalCompileGLObjects(sceneView->getState()->getContextID()))
{
databasePager->compileGLObjects(*(sceneView->getState()), availableTime);
}
double dispatchTime = osg::Timer::instance()->delta_s(beforeDrawTick, afterDispatchTick);
// now flush delete OpenGL objects and compile any objects as required by the DatabasePager
flushAndCompile(dispatchTime, sceneView, databasePager, compileThread);
if (acquireGPUStats)
{
endQuery();
@@ -512,20 +507,12 @@ void Renderer::cull_draw()
sceneView->draw();
}
double availableTime = 0.004; // 4 ms
if (databasePager && databasePager->requiresExternalCompileGLObjects(sceneView->getState()->getContextID()))
{
databasePager->compileGLObjects(*(sceneView->getState()), availableTime);
}
osg::Timer_t afterDispatchTick = osg::Timer::instance()->tick();
double cullAndDispatchTime = osg::Timer::instance()->delta_s(beforeCullTick, afterDispatchTick);
// now flush delete OpenGL objects and compile any objects as required by the DatabasePager
flushAndCompile(cullAndDispatchTime, sceneView, databasePager, compileThread);
if (compileThread)
{
compileThread->add(_flushOperation.get());
}
else
{
sceneView->flushDeletedGLObjects(availableTime);
}
if (acquireGPUStats)
{
@@ -552,6 +539,54 @@ void Renderer::cull_draw()
}
void Renderer::flushAndCompile(double currentElapsedFrameTime, osgUtil::SceneView* sceneView, osgDB::DatabasePager* databasePager, osg::GraphicsThread* compileThread)
{
double targetFrameRate = _targetFrameRate;
double minimumTimeAvailableForGLCompileAndDeletePerFrame = _minimumTimeAvailableForGLCompileAndDeletePerFrame;
if (databasePager)
{
targetFrameRate = std::min(targetFrameRate, databasePager->getTargetFrameRate());
minimumTimeAvailableForGLCompileAndDeletePerFrame = std::min(minimumTimeAvailableForGLCompileAndDeletePerFrame, databasePager->getMinimumTimeAvailableForGLCompileAndDeletePerFrame());
}
double targetFrameTime = 1.0/targetFrameRate;
double availableTime = std::max((targetFrameTime - currentElapsedFrameTime)*_conservativeTimeRatio,
minimumTimeAvailableForGLCompileAndDeletePerFrame);
double flushTime = availableTime * _flushTimeRatio;
double compileTime = availableTime - flushTime;
#if 0
osg::notify(osg::NOTICE)<<"total availableTime = "<<availableTime*1000.0<<std::endl;
osg::notify(osg::NOTICE)<<" flushTime = "<<flushTime*1000.0<<std::endl;
osg::notify(osg::NOTICE)<<" compileTime = "<<compileTime*1000.0<<std::endl;
#endif
if (compileThread)
{
compileThread->add(_flushOperation.get());
}
else
{
sceneView->flushDeletedGLObjects(flushTime);
}
// if any time left over from flush add this to compile time.
if (flushTime>0.0) compileTime += flushTime;
#if 0
osg::notify(osg::NOTICE)<<" revised compileTime = "<<compileTime*1000.0<<std::endl;
#endif
if (databasePager && databasePager->requiresExternalCompileGLObjects(sceneView->getState()->getContextID()))
{
databasePager->compileGLObjects(*(sceneView->getState()), compileTime);
}
}
void Renderer::operator () (osg::Object* object)
{
osg::GraphicsContext* context = dynamic_cast<osg::GraphicsContext*>(object);