|
测试目的:想知道 渲染 时的绘制时间消耗在哪段代码中。
测试条件:在场景中显示了一个曲面,创建了曲面的顶点数组和索引数组,将其放入geometry对象相应成员对象中,采用的线程方式是 singleThreaded,程序运行正常,显示正常。
测试位置:在 渲染 过程中分段计算各段渲染操作代码 所消耗时间。
代码段1、在 ViewerBase::frame() 中,在 renderingTraversals()前后设置取时间点,测试时间。
代码段2、在 RenderStage::drawInner(osg::RenderInfo& renderInfo,RenderLeaf*& previous, bool& doCopyTexture)中,
在如下代码段前后设置取时间点:
if(state.getCheckForGLErrors()!=osg::State::NEVER_CHECK_GL_ERRORS)
{
GLenum errorNo = glGetError();
if (errorNo!=GL_NO_ERROR)
{
const char* error = (char*)gluErrorString(errorNo);
if (error) osg::notify(osg::NOTICE)<<"Warning: detected OpenGL error '"<<error<<"' after RenderBin::draw(,)"<<std::endl;
else osg::notify(osg::NOTICE)<<"Warning: detected OpenGL errorNo= 0x"<<std::hex<<errorNo<<" after RenderBin::draw(,)"<<std::dec<<std::endl;
if (fbo_ext) osg::notify(osg::NOTICE)<<"RenderStage::drawInner(,) FBO status= 0x"<<std::hex<<fbo_ext->glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)<<std::dec<<std::endl;
}
}
代码段3、在 void GraphicsWindowWin32::swapBuffersImplementation()中,在::SwapBuffers(_hdc);前后设置取时间点。
各段代码的消耗时间:
代码段1: 0.0156627 秒
代码段2: 0.0143021 秒
代码段3: 0.000071 秒
看起来在整个渲染的过程中,消耗时间最大贡献的是代码段2,但是代码段2只是检查错误的代码,让我觉得很奇怪,既然是错误代码,那对程序的影响也许不大,于是我考虑屏蔽掉其中
GLenum errorNo = glGetError();
if (errorNo!=GL_NO_ERROR)
{
const char* error = (char*)gluErrorString(errorNo);
if (error) osg::notify(osg::NOTICE)<<"Warning: detected OpenGL error '"<<error<<"' after RenderBin::draw(,)"<<std::endl;
else osg::notify(osg::NOTICE)<<"Warning: detected OpenGL errorNo= 0x"<<std::hex<<errorNo<<" after RenderBin::draw(,)"<<std::dec<<std::endl;
if (fbo_ext) osg::notify(osg::NOTICE)<<"RenderStage::drawInner(,) FBO status= 0x"<<std::hex<<fbo_ext->glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)<<std::dec<<std::endl;
}
部分,再重新测试时间,得出了如下结果:
各段代码的消耗时间:
代码段1: 0.0157272 秒
代码段2: 2.69988e-007 秒
代码段3: 0.012529 秒
代码段2是不耗时了,耗时的变成了代码段3,我不知道为什么glGetError会对这个时间测试有那么大的影响,如果 SwapBuffers 在2次测试中均贡献大,那我还能想通,但是我现在完全迷糊了,知识有限,无法解释这个现象的原因,请热心的朋友们告诉我,到底耗时到哪里去了?我是否能避开这 10+ ms 的耗时。 |
|