我的显卡是Mobile Intel 4 Series。我正在更新一个纹理,每帧更改一次数据,这是我的主循环:
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可以将迭代时间缩短到2毫秒。
问题不在像素格式上。我已经尝试了像素格式BGRA、RGBA和ABGR_EXT以及像素类型UNSIGNED_BYTE、BYTE、UNSIGNED_INT_8_8_8_8和UNSIGNED_INT_8_8_8_8_EXT。纹理的内部像素格式为RGBA。
调用顺序很重要。例如,将纹理上传移动到四边形绘制之前可以修复性能问题。
我还在GeForce GT 420M卡上尝试过这个问题,并且它在那里运行得很快。我的真实应用程序在非Intel显卡上存在性能问题,通过glFlush调用可以解决这些问题,但我还没有将它们提炼成一个测试用例。
有什么想法可以调试这个问题吗?