我正在为使用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的性能?
纹理尺寸?纹理对象数量? OpenGL硬件(如果有)品牌/型号? – genpfault 2011-01-26 15:27:20
40 * 40,约900个物体,GeForce 8600M GT。 – cargath 2011-01-26 19:58:22