最初我在 2d 实时动作类型游戏中使用画布绘制位图,但由于某种原因,我的帧速率很糟糕。我怀疑它是画布,所以我切换到opengl。通过网上冲浪,我学会了从 2 个三角形创建一个矩形并在其上设置纹理。我使用 glOrthof 设置它的 2d 透视图并使用 gltranslatef 方法移动我的纹理。我知道问题不在于物理或任何东西,因为我测试了以恒定速度移动单个纹理(x 值以每 33 毫秒约 7 个单位移动)。它仍然波涛汹涌。我将 fps 设置为 30。这是我的游戏循环:
public void onDrawFrame(GL10 gl) {
startTime = System.nanoTime();
gl.glClearColor(0f, .0f, .8f, 0.5f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
g.updatePhysics();
onDraw(gl);
sleepTime = (int) (TICKS_INTERVAL - (System.nanoTime() - startTime)/1000000);
if(sleepTime > 0){
try{
Thread.sleep(sleepTime);
}catch(Exception e){}
}
}
这就是它们的绘制方式:
public void onDraw(GL10 gl){
gl.glLoadIdentity();
if(g.state == g.STATE_GAME){
gl.glTranslatef(x, y, z);
rectangle.draw(gl);
gl.glLoadIdentity();
gl.glTranslatef(x, y, z);
rectangle2.draw()gl;
}
}
这是矩形内的绘制方法:
public void draw(GL10 gl){
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glFrontFace(GL10.GL_CW);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuff);
gl.glDrawElements(GL10.GL_TRIANGLES, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff);// Draw the vertices as triangle strip
//gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
即使当我将帧速率设置为 60 时,仍然会有一些卡顿,这令人沮丧,因为在过去的一个月里,我一直在努力让帧速率平滑。我正在 Galaxy s2 上进行测试,所以我知道它不是硬件。如果所有这些代码都是正确的,您认为它可能是活动中的其他内容吗?我的 GLSurfaceView 实际上是一个自定义视图。即使让单个纹理以恒定速度平滑移动也会很好。