好吧,在任何人试图杀死我之前,我知道我应该放弃这种以神弃绝的技术来绘制OpenGL。但我正在写一个简单的2D游戏,我对VBO和着色器并不是很了解。所以我使用立即模式用多边形填充屏幕,但我读到显示列表应该比立即模式快得多。所以我去尝试了,但是我得到了一半使用立即模式的FPS。我没有在每个帧中初始化列表,我正在使用下面的for循环来绘制网格:
glPushMatrix();
for(int y = 0; y < 56; y++)
{
for(int x = 0; x < 80; x++)
{
glCallList(grid);
glTranslatef(GRID_WIDTH, 0.0f, 0.0f);
}
glTranslatef(-80*GRID_WIDTH, GRID_HEIGHT, 0.0f);
}
glPopMatrix();
我认为for循环不应该受到责备,因为我尝试了相同的代码,除了我将glCallList更改为立即模式代码并且FPS仍然更高。为什么会这样?
答案 0 :(得分:1)
整个块应该在显示列表中,而不是最里面的位。
我们的想法是为OpenGL提供一个大块来优化。
在显示列表中包含看似单个四边形的内容除了功能调用开销的少量减少之外,并不能真正为您买任何东西。
答案 1 :(得分:0)
添加到已接受的答案(因为我还没有评论),值得注意的是,现代驱动程序将尝试通过批量处理并将它们转换为DrawArrays或类似的命令来优化立即模式渲染。因此,尽管你应该使用现代/更快的东西并且应该表现得更好,但有时你会看到它看起来更慢的情况。在这种情况下,一个可能的原因是您使用较新技术的实现效率低于驱动程序将旧绘制转换为的效率。