【发布时间】:2011-10-21 04:13:39
【问题描述】:
我的显卡是 Mobile Intel 4 系列。我正在更新纹理,每帧都更改数据,这是我的主循环:
for(;;) {
Timer timer;
glBindTexture(GL_TEXTURE2D, tex);
glBegin(GL_QUADS); ... /* draw textured quad */ ... glEnd();
glTexSubImage2D(GL_TEXTURE2D, 0, 0, 0, 512, 512,
GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
swapBuffers();
cout << timer.Elapsed();
}
每次迭代需要 120 毫秒。但是,在 glTexSubImage2D 之前插入 glFlush 会使迭代时间为 2ms。
问题不在于像素格式。我尝试了像素格式 BGRA、RGBA 和 ABGR_EXT 以及像素类型 UNSIGNED_BYTE、BYTE、UNSIGNED_INT_8_8_8_8 和 UNSIGNED_INT_8_8_8_8_EXT。纹理的内部像素格式为 RGBA。
调用顺序很重要。例如,将纹理上传移到四边形绘制之前,可以解决缓慢问题。
我还在 GeForce GT 420M 卡上试过这个,它在那里运行得很快。我的真实应用在非英特尔卡上确实存在由 glFlush 调用修复的性能问题,但我还没有将这些问题提炼到测试用例中。
关于如何调试的任何想法?
【问题讨论】:
-
当然它在 GT420 上运行很快。这是一台GT420。但是让它在 GMA 上运行得更快,甚至 nVidia 也会(应该)更快。
-
@genpfault:Windows 7 SP 1,驱动程序版本 8.15.10.2281
-
"关于如何调试这个有什么想法吗?"这里没有错误。性能在任何地方都无法保证。没有什么可调试的。这只是英特尔显卡和 OpenGL 驱动程序的一个怪癖;而已。你找到了一种让它更快的方法,所以你应该使用它。
-
@Nicol:嘿,我们不要纠结于 bug 这个词 :) 如果没有明显的原因发生减速,那么我想知道是什么原因造成的,这样我就可以避免它。
-
@StefanMonov:你假设有一个合理的原因,然后你可以在未来避免。不一定有,NVIDIA(可能还有 ATI)卡没有这个问题就证明了这一点。而且,由于您正在处理英特尔臭名昭著的漏洞百出的 OpenGL 驱动程序,因此更不可能有合理的原因。在这些情况下,您能做的最好的事情就是识别出您做了什么导致奇怪的性能故障,尝试重新排列您的代码以使其不会发生,并记下您所做的事情以供将来参考。
标签: performance opengl