我联系是因为,我尝试使用openGL与android,以制作2D游戏:)
这是我的工作方式:
我有一个班级GlRender
public class GlRenderer implements Renderer
在这个类中,我在onDrawFrame上
GameRender()
和GameDisplay()
在gameDisplay()
我有:
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// Reset the Modelview Matrix
gl.glMatrixMode(GL10.GL_PROJECTION); //Select The Modelview Matrix
gl.glLoadIdentity(); //Reset The Modelview Matrix
// Point to our buffers
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// Set the face rotation
gl.glFrontFace(GL10.GL_CW);
for(Sprites...)
{
sprite.draw(gl, att.getX(), att.getY());
}
//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
在sprite的draw方法中我有:
_vertices[0] = x;
_vertices[1] = y;
_vertices[3] = x;
_vertices[4] = y + height;
_vertices[6] = x + width;
_vertices[7] = y;
_vertices[9] = x + width;
_vertices[10] = y + height;
if(vertexBuffer != null)
{
vertexBuffer.clear();
}
// fill the vertexBuffer with the vertices
vertexBuffer.put(_vertices);
// set the cursor position to the beginning of the buffer
vertexBuffer.position(0);
// bind the previously generated texture
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
// Point to our vertex buffer
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer.mByteBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer.mByteBuffer);
// Draw the vertices as triangle strip
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, _vertices.length / 3);
我的问题是我的帧速率很低,即使在30 FPS时,有时只有1个精灵会丢失一些帧(但它与50相同)
我做错了吗?我怎样才能提高FPS?
答案 0 :(得分:1)
通常,您不应该为每个绘制的精灵更改顶点缓冲区。除非你正在制作一个粒子系统,否则“通常”,我的意思是“从不”。即使这样,你也会使用正确的流媒体技术,而不是一次写一个四元组。
对于每个精灵,你都有一个预制的四边形。要渲染它,可以使用着色器uniform
将精灵从中性位置转换为想要在屏幕上看到它的实际位置。