我正在开发一种东方风格的子弹地狱射击游戏。屏幕将完全充满子弹(所以实例化是我想要的),但我希望这可以在较旧的硬件上工作,所以我现在正在做一些事情,没有颜色,纹理,直到我弄清楚这一点。
glVertexPointer(3, GL_FLOAT, 0, SQUARE_VERTICES);
for (int i = 0; i < info.centers.size(); i += 3) {
glPushMatrix();
glTranslatef(info.centers.get(i), info.centers.get(i + 1), info.centers.get(i + 2));
glScalef(info.sizes.get(i), info.sizes.get(i + 1), info.sizes.get(i + 2));
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, SQUARE_INDICES);
glPopMatrix();
}
因为我希望这可以在旧硬件上工作,所以我试图避免使用着色器等等。那里的设置让我失去了大约80个多边形。我希望从中得到至少几百个。 info
是一个结构,它具有渲染的所有好处,除了一些向量之外没有什么东西。
我对OpenGL很陌生,但我至少听过并尝试过所有可以做到的事情,而不是说我对它很好。这个游戏是一个2D游戏,我从SDL切换到Opengl,因为它可以让一些更好的效果更容易。显然,SDL的工作方式不同,但我从未遇到过这个问题。
归结为此,我显然在这里做错了,那么如何才能正确实现旧硬件(OpenGL 1.x)的实例化呢?另外,请给我任何提高性能的提示。
答案 0 :(得分:9)
另外,请给我提高性能的提示。
如果您打算使用精灵 ....
的glTranslatef
对于2D 基于精灵的(重要的)游戏,您可以完全避免使用矩阵(可能除了相机/投影矩阵)。我认为矩阵不会对2D游戏产生很大的好处。
使用2D游戏,您的主要瓶颈将是GPU内存传输速度 - 将数据从纹理传输到屏幕。因此,“使用少量绘制调用”和“将所有内容放入VA”对您无济于事 - 您可以使用一个精灵来消除性能。
然而,如果您要使用矢量图片(请参阅area2048(youtube)或rez),不使用纹理,那么上面的大多数建议将不适用,并且这种游戏与3D游戏不会有很大不同。在这种情况下,使用顶点数组,顶点缓冲区对象或显示列表(取决于可用的内容)并利用矩阵函数是合理的 - 因为您的瓶颈将是顶点处理。您仍然需要最小化状态切换次数。