30
30
using namespace osgViewer;
32
32
//#define DEBUG_MESSAGE osg::notify(osg::NOTICE)
33
#define DEBUG_MESSAGE osg::notify(osg::INFO)
33
#define DEBUG_MESSAGE osg::notify(osg::DEBUG_FP)
36
36
OpenGLQuerySupport::OpenGLQuerySupport():
161
161
Renderer::Renderer(osg::Camera* camera):
162
162
osg::GraphicsOperation("Renderer",true),
163
163
OpenGLQuerySupport(),
164
_targetFrameRate(100.0),
165
_minimumTimeAvailableForGLCompileAndDeletePerFrame(0.001),
166
_flushTimeRatio(0.5),
167
_conservativeTimeRatio(0.5),
166
170
_graphicsThreadDoesCull(true)
255
259
if (_done || _graphicsThreadDoesCull) return;
257
// note we assume lock has already been aquired.
261
// note we assume lock has already been acquired.
258
262
osgUtil::SceneView* sceneView = _availableQueue.takeFront();
260
264
DEBUG_MESSAGE<<"cull() got SceneView "<<sceneView<<std::endl;
274
278
const osg::FrameStamp* fs = state->getFrameStamp();
275
279
int frameNumber = fs ? fs->getFrameNumber() : 0;
278
282
osg::Timer_t beforeCullTick = osg::Timer::instance()->tick();
280
284
sceneView->inheritCullSettings(*(sceneView->getCamera()));
390
394
_availableQueue.add(sceneView);
392
double availableTime = 0.004; // 4 ms
393
if (databasePager && databasePager->requiresExternalCompileGLObjects(sceneView->getState()->getContextID()))
395
databasePager->compileGLObjects(*(sceneView->getState()), availableTime);
400
compileThread->add(_flushOperation.get());
404
sceneView->flushDeletedGLObjects(availableTime);
396
osg::Timer_t afterDispatchTick = osg::Timer::instance()->tick();
398
double dispatchTime = osg::Timer::instance()->delta_s(beforeDrawTick, afterDispatchTick);
400
// now flush delete OpenGL objects and compile any objects as required by the DatabasePager
401
flushAndCompile(dispatchTime, sceneView, databasePager, compileThread);
410
406
checkQuery(stats);
464
460
initialize(state);
467
bool aquireGPUStats = stats && _timerQuerySupported && stats->collectStats("gpu");
463
bool acquireGPUStats = stats && _timerQuerySupported && stats->collectStats("gpu");
471
467
checkQuery(stats);
475
471
osg::Timer_t beforeCullTick = osg::Timer::instance()->tick();
477
473
sceneView->inheritCullSettings(*(sceneView->getCamera()));
511
507
sceneView->draw();
514
double availableTime = 0.004; // 4 ms
515
if (databasePager && databasePager->requiresExternalCompileGLObjects(sceneView->getState()->getContextID()))
517
databasePager->compileGLObjects(*(sceneView->getState()), availableTime);
522
compileThread->add(_flushOperation.get());
526
sceneView->flushDeletedGLObjects(availableTime);
510
osg::Timer_t afterDispatchTick = osg::Timer::instance()->tick();
511
double cullAndDispatchTime = osg::Timer::instance()->delta_s(beforeCullTick, afterDispatchTick);
513
// now flush delete OpenGL objects and compile any objects as required by the DatabasePager
514
flushAndCompile(cullAndDispatchTime, sceneView, databasePager, compileThread);
532
520
checkQuery(stats);
542
void Renderer::flushAndCompile(double currentElapsedFrameTime, osgUtil::SceneView* sceneView, osgDB::DatabasePager* databasePager, osg::GraphicsThread* compileThread)
545
double targetFrameRate = _targetFrameRate;
546
double minimumTimeAvailableForGLCompileAndDeletePerFrame = _minimumTimeAvailableForGLCompileAndDeletePerFrame;
550
targetFrameRate = std::min(targetFrameRate, databasePager->getTargetFrameRate());
551
minimumTimeAvailableForGLCompileAndDeletePerFrame = std::min(minimumTimeAvailableForGLCompileAndDeletePerFrame, databasePager->getMinimumTimeAvailableForGLCompileAndDeletePerFrame());
554
double targetFrameTime = 1.0/targetFrameRate;
556
double availableTime = std::max((targetFrameTime - currentElapsedFrameTime)*_conservativeTimeRatio,
557
minimumTimeAvailableForGLCompileAndDeletePerFrame);
559
double flushTime = availableTime * _flushTimeRatio;
560
double compileTime = availableTime - flushTime;
563
osg::notify(osg::NOTICE)<<"total availableTime = "<<availableTime*1000.0<<std::endl;
564
osg::notify(osg::NOTICE)<<" flushTime = "<<flushTime*1000.0<<std::endl;
565
osg::notify(osg::NOTICE)<<" compileTime = "<<compileTime*1000.0<<std::endl;
570
compileThread->add(_flushOperation.get());
574
sceneView->flushDeletedGLObjects(flushTime);
577
// if any time left over from flush add this to compile time.
578
if (flushTime>0.0) compileTime += flushTime;
581
osg::notify(osg::NOTICE)<<" revised compileTime = "<<compileTime*1000.0<<std::endl;
584
if (databasePager && databasePager->requiresExternalCompileGLObjects(sceneView->getState()->getContextID()))
586
databasePager->compileGLObjects(*(sceneView->getState()), compileTime);
554
590
void Renderer::operator () (osg::Object* object)
556
592
osg::GraphicsContext* context = dynamic_cast<osg::GraphicsContext*>(object);