もともとはキャンバスを使って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に設定しても、まだ多少の途切れがあり、この1か月間、フレームレートをスムーズにしようとしていたため、イライラします。私はギャラクシーS2でテストしているので、ハードウェアではないことがわかります。このコードがすべて正しい場合、それはアクティビティの他の何かである可能性があると思いますか?私のGLSurfaceViewは実際にはカスタムビューです。単一のテクスチャを一定の速度でスムーズに動かすことさえできれば素晴らしいでしょう。