C++ OpenGL显示列表比即时模式慢?
好吧,在有人想杀我之前,我知道我应该把这个被上帝抛弃的技术留在OpenGL中。但我正在写一个简单的2D游戏,我对VBO和着色器了解不多。所以我使用即时模式在屏幕上填充多边形,但我读到显示列表应该比即时模式快得多。所以我去试了试,但我得到了一半的FPS,我用即时模式得到的。我不是在每个帧中初始化列表,而是使用下面的for循环来绘制网格:C++ OpenGL显示列表比即时模式慢?,c++,opengl,C++,Opengl,好吧,在有人想杀我之前,我知道我应该把这个被上帝抛弃的技术留在OpenGL中。但我正在写一个简单的2D游戏,我对VBO和着色器了解不多。所以我使用即时模式在屏幕上填充多边形,但我读到显示列表应该比即时模式快得多。所以我去试了试,但我得到了一半的FPS,我用即时模式得到的。我不是在每个帧中初始化列表,而是使用下面的for循环来绘制网格: glPushMatrix(); for(int y = 0; y < 56; y++) { for(int x = 0; x < 80; x+
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();
glPushMatrix();
对于(int y=0;y<56;y++)
{
对于(int x=0;x<80;x++)
{
glCallList(grid);
GLTRANSTEF(网格宽度,0.0f,0.0f);
}
GLTRANSTEF(-80*网格宽度,网格高度,0.0f);
}
glPopMatrix();
我不认为for循环是错误的,因为我尝试了相同的代码,除了我将glCallList更改为立即模式代码,并且FPS更高。为什么会发生这种情况?整个块应该在显示列表中,而不是最里面的一位 这个想法是为了给OpenGL提供一大块要优化的东西
在显示列表中包装一个四元组并不能真正为您带来任何好处,只能减少函数调用开销。添加到可接受的答案中(因为我还不能发表评论),值得注意的是,现代驱动程序将尝试通过将即时模式渲染成批并在幕后将其转换为DrawArray或类似命令来优化即时模式渲染。因此,尽管你应该使用现代/更快的东西,而且它应该表现得更好,但有时你会看到它看起来更慢的情况。在这种情况下,一个可能的原因是,与驱动程序将旧绘图转换为的绘图相比,您使用新技术的实现效率较低。我明白了,但是如果我根据地图文件渲染东西呢?还是更新单个网格?我不认为在显示列表中编写所有代码可以帮助我进行“动态”渲染,所以说句话,你是对的。如果一切都是动态的,那么你就是索尔。在这种情况下,你的建议是什么?我应该学习VBO吗?是的,尽管它们并不能真正帮助你解决动态问题。不过,它们确实可以让您将所有内容大批量地放入服务器内存中。一旦它进入服务器内存,您就可以相对快速地渲染VBO的所有/部分。在这种情况下,您可能希望将整个网格渲染到显示列表中。虽然如果
网格宽度
发生更改,则需要重新构建列表,但这仍然可以在运行时完成,不会对性能造成太大影响(假设该值不经常更改,例如当用户更改UI大小或调整窗口大小时)。