gpt4 book ai didi

cocoa - glBindTexture() + glBegin(foo) 慢?

转载 作者:行者123 更新时间:2023-12-03 16:14:17 25 4
gpt4 key购买 nike

我正在使用 Cocoa + OpenGL 为 MacOS 构建一个小游戏来创建 GUI。该游戏是 BoulderDash-Clone,因此它基本上是一个 2D 对象数组,而且数量不多(一个关卡大约有 40 个对象宽,25 个对象高)。很多对象都是动画的,所以我必须在绘制它们时动态获取纹理(我使用 NSTimer 不断重绘动画场景)。这似乎会导致严重的性能问题。

我首先做到了

for(y1, ..., yn) for(x1, ..., xn)
{
glBindTexture(foo);
glBegin(GL_QUAD);
[drawing the quad with texture]
glEnd();
}

它可以工作,但速度非常慢(事件监视器显示 CPU 使用率为 20%)。由于我没有创建任何纹理,所以我使用了一个占位符,它允许我进行测试

glBindTexture(foo);
for(y1, ..., yn) for(x1, ..., xn)
{
glBegin(GL_QUAD);
[drawing of quad with texture]
glEnd();
}

速度快很多(CPU 使用率 2%)。所以我认为是 glBindTexture() 导致了速度大幅下降。然后我试图找出 glBindTexture() 到底有多慢,并且确实如此

for(y1, ..., yn) for(x1, ..., xn)
{
glBindTexture(foo);
// no drawing this time
}

速度也非常快(2% CPU 使用率)。这是为什么?

最终我必须将 glBindTexture() 和绘图放入同一个循环中,因为我必须根据对象及其动画绑定(bind)纹理。所以我需要找出第一个代码示例中导致性能问题的原因以及如何加快速度。我一直认为使用 OpenGL 处理数百个具有不同纹理的对象不会那么慢。哦,我已经用 Java + JOGL 构建过这个游戏一次,如果我没记错的话,我做了完全相同的事情,而且速度要快得多。 Objective-C/C++ 不应该破坏 Java 的性能吗?

最佳答案

在命令处理方面,OpenGL 规范为实现提供了相当大的余地。您的 glBindTexture() 调用可能只是在命令队列中设置一个 int,在交换缓冲区或调用 glFinish()/glFlush 之前,它实际上不会被处理。 ()。如果您调用它,然后不向 OpenGL 提供任何几何体来使用它,它甚至可能(大部分)被忽略。

使用texture atlases减少 glBindTexture() 调用。

glBegin() 和类似的方法是将几何体提交给 OpenGL 的最慢方法。尝试尽可能多地批量处理几何体并使用 vertex arrays/VBOs减少函数调用开销。

关于cocoa - glBindTexture() + glBegin(foo) 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4805451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com