2011-01-26 55 views
4

我正在为使用Cocoa + OpenGL创建GUI的MacOS构建一个小游戏。这个游戏是一个BoulderDash-Clone,所以它基本上是一个二维数组对象,而不是那么多(一个级别是40个对象,25个对象)。很多对象都是动画的,所以在绘制时我必须动态获取纹理(我使用NSTimer不断重绘动画的场景)。这似乎会导致严重的性能问题。glBindTexture()+ glBegin(foo)slow?

我第一次做

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

这工作,但真的很慢(活动监视器显示,20%的CPU使用率)。因为我没有创建任何纹理但我使用这使一个占位符我来测试

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

这是快了很多(2%的CPU使用率)。所以我认为它是glBindTexture()导致了大规模的放缓。然后,我试图找出glBindTexture()的真实速度和速度。

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

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

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

+0

纹理尺寸?纹理对象数量? OpenGL硬件(如果有)品牌/型号? – genpfault 2011-01-26 15:27:20

+1

40 * 40,约900个物体,GeForce 8600M GT。 – cargath 2011-01-26 19:58:22

回答

4

OpenGL规范为执行命令提供了很大的余地。您的glBindTexture()调用可能只是在命令队列中设置一个int值,直到您交换缓冲区或调用glFinish()/glFlush()之后才会真正处理该值。如果你调用它,甚至可能(大部分)被忽略,然后不给OpenGL任何几何体来使用它。

使用texture atlases减少glBindTexture()来电。

glBegin()和朋友只是将几何图形提交给OpenGL的最慢方法。尝试尽可能地对几何进行批处理,并使用vertex arrays/VBOs来减少函数调用开销。