NDK と SDL の助けを借りて、C++ 2D ゲームを Android に移植しています。OpenGL を使用してスプライトをレンダリングします。パフォーマンスはかなり残念です。
いくつかの調査の結果、ボトルネックはレンダリング手順中の OpenGL 呼び出しにあることがわかりました。一瞬待って!GL の状態を変更しない、既にバインドされているテクスチャをバインドしないなどの古典的な回答を貼り付ける前に、以下をお読みください。
実際、黒い画面の真ん中に 364x353 の rgba テクスチャを 1 つ表示しても、レンダリングに 20 ミリ秒近くかかることがあります。手順は次のように要約できます。
を呼び出すために使用される以下のコードを編集glFlush()
します。thokra がコメントで指摘したように、これは必要ありません。それにもかかわらず、それを削除してもパフォーマンスは向上しませんでした。
glClear( GL_COLOR_BUFFER_BIT );
glBindTexture( the_texture );
glEnable(GL_BLEND);
glEnableClientState( GL_COLOR_ARRAY );
glColorPointer( 4, GL_FLOAT, 0, colors );
glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 2, GL_FLOAT, 0, positions );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer( 2, GL_FLOAT, 0, texture_positions );
glDrawArrays( GL_TRIANGLE_FAN, 0, vertex_count );
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );
glDisable(GL_BLEND);
//glFlush();
SDL_GL_SwapWindow( window );
この関数の最後の 2 行 (フラッシュとスワップ) の実行は、非常に不定期です。4 ~ 12 ミリ秒かかります。
私がウェブで見つけることができる最良のヒントは、StackOverflow のこの質問とGoogle グループのこのスレッドです。
StackOverflow に関する質問への回答は役に立ちません。質問の著者によると:
glClear でフレームをクリアするかクリアしないかは、私にとっては fps に影響しません。ブレンディングの有効化/無効化も同様です。
と
[…] 圧縮テクスチャを使用するとフィル レートが向上するかどうかを確認したいだけです。ないようです […]
Google グループのスレッドは私の問題と非常によく似ていますが、作成者があきらめたときに終了しました。
基本的に、テクセル読み取りのボトルネックのため、OpenGL を使用して画面に 480x854 の画像を 60fps で描画する方法はありません。
マジで、まさか?glFlush()
との両方の呼び出しにSDL_GL_SwapWindow()
時間がかかるのはなぜですか? そして、なぜそれはとても不規則なのですか?私はそれについて何もできませんか?
SDL2 のソース コードを簡単に検索したところ、Java Native Interfaceを使用して Java メソッドを呼び出すことがわかりました。SDL_GL_SwapWindow()
イレギュラーの原因になるのでしょうか?これについて何ができますか?