Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL显示列表比即时模式慢?_C++_Opengl - Fatal编程技术网

C++ OpenGL显示列表比即时模式慢?

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+

好吧,在有人想杀我之前,我知道我应该把这个被上帝抛弃的技术留在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();
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大小或调整窗口大小时)。