OpenGL显示列表比立即模式慢?
Posted
技术标签:
【中文标题】OpenGL显示列表比立即模式慢?【英文标题】:OpenGL Display Lists slower than immediate mode? 【发布时间】:2014-03-06 19:42:37 【问题描述】:好吧,在有人想杀我之前,我知道我应该离开这个被上帝遗弃的技术,在 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 仍然更高。为什么会这样?
【问题讨论】:
在这种情况下,您可能希望将整个网格呈现到显示列表中。虽然这需要在GRID_WIDTH
更改时重新构建列表,但这仍然可以在运行时完成,几乎不会影响性能(假设值不经常更改,例如当用户更改 UI 大小或调整窗口大小时)。
【参考方案1】:
整个块应该在显示列表中,而不是最里面的位。
这个想法是给 OpenGL 一个大块来优化的东西。
在显示列表中包装看起来像单个四边形的内容并没有真正为您带来任何好处,只是稍微减少了函数调用开销。
【讨论】:
我明白了,但是如果我根据地图文件渲染东西怎么办?还是更新单个网格?我不认为在显示列表中编写所有代码可以帮助我进行“动态”渲染,可以这么说 是的,你是对的。如果一切都是动态的,那么你就是 SOL。 在这种情况下您有什么建议,我应该学习 VBO 吗? 是的,尽管它们并不能真正帮助您解决动态问题。不过,它们确实让您将所有内容大块地放入服务器内存中。一旦它在服务器内存中,您可以相对快速地渲染 VBO 的所有/部分。【参考方案2】:除了已接受的答案之外(因为我还不能发表评论),值得注意的是,现代驱动程序将尝试通过将它们批处理并将它们转换为 DrawArrays 或幕后的类似命令来优化即时模式渲染。因此,尽管您应该使用现代/更快的东西并且它应该表现更好,但有时您会看到它看起来更慢的情况。在这种情况下,一个可能的原因是您使用新技术的实施效率低于驱动程序将旧绘图转换为的效率。
【讨论】:
以上是关于OpenGL显示列表比立即模式慢?的主要内容,如果未能解决你的问题,请参考以下文章