-2

JAVA と OpenGL-ES を使用して、Android で 2D ビデオゲームを開発しています。

私はそれがガベージコレクターだと思うことに問題があります。何をしていても、数秒ごとにゲームがフリーズします。

私はそれについていくつかのドキュメントなどを読んでいて、持っていたすべてのループ反復子を削除しました。今では for(i=0,...) などのソリューションを使用しています。事実、それはパフォーマンスで何もしませんでした...

私は自分のコードを調べていて、問題を引き起こしている可能性があると思われるものを見つけました。それは、アニメーション内のスプライト間で変更する方法です。

たとえば、いくつかのキーを押して移動できるヒーローがいます。歩くと、スプライトがフレーム間で変化します。これを行うには、テクスチャ バッファを移動して、イメージの目的の部分を狙います。そして、そうするたびに、私はこの関数を使用します:

protected void SetTextureBuffer(float xo, float xf, float yo, float yf) {

    float textureVertexs[] = {
            xo, yf,     // top left
            xf, yf,     // bottom left
            xf, yo,     // top right
            xo, yo      // bottom right
    };

    // a float has 4 bytes so we allocate for each coordinate 4 bytes
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(textureVertexs.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());

    // allocates the memory from the byte buffer
    textureBuffer = byteBuffer.asFloatBuffer();

    // fill the vertexBuffer with the vertices
    textureBuffer.put(textureVertexs);

    // set the cursor position to the beginning of the buffer
    textureBuffer.position(0);
}

呼び出されるたびにバッファを作成するためにメモリを割り当てます。これは、アニメーションを持つエンティティがさらにあるため、毎秒何度も発生する可能性があります...

これは問題になると思いますか?それとも私はこれを間違って見ていますか?これが問題である場合...別のより効率的な方法でこれを解決するにはどうすればよいですか?

4

1 に答える 1

1

次の行を削除してみてください。

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(textureVertexs.length * 4);
byteBuffer.order(ByteOrder.nativeOrder());
textureBuffer = byteBuffer.asFloatBuffer();

textureBufferクラス コンストラクター/イニシャライザーで 1 回割り当てます。以前のデータを保持する必要がないため、バッファを再作成する必要はありません。したがって、同じバッファ内の古いデータを上書きするだけです。

于 2013-01-24T16:39:58.450 に答える