2

非圧縮 RGBA 8888 形式の約 2 GiB のテクスチャ (すべて 256x256 タイル) があります (RGB 565 テクスチャ形式はオプションではありません。これは、565 形式で緑がかった滑らかなグラデーションとグレーの色合いがたくさんあるためです)。そのため、それらが表示され、古いものを削除する必要があるときに、それらをオンデマンドでロードします。問題は、それらを OpenGL にアップロードすると、厄介な FPS ドロップが発生することです。現在 OpenGL ES 1.1 を使用しています。

別のスレッド (つまり、BitmapFactory.decodeStream(...)) でテクスチャをデコードしてから、ビットマップを GL スレッドに送信し、テクスチャとしてアップロードします。これが発生すると、このアップロードのために GL スレッドが少し遅くなることがあります。テクスチャのアップロード時間を測定したところ、ほとんどが 1 ~ 8 ミリ秒で、平均で約 2 ミリ秒でした。ただし、40 ~ 70 ミリ秒になることもあります。この低下の原因は何ですか?

また、GPU でミップマップを生成します (ミップマップを無効にしても、この動作には影響しません)。すべてのテクスチャ パラメータは次のとおりです。

GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_TEXTURE_MIN_FILTER, GLES11.GL_LINEAR_MIPMAP_NEAREST);
GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_TEXTURE_MAG_FILTER, GLES11.GL_LINEAR);
GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_TEXTURE_WRAP_S, GLES11.GL_CLAMP_TO_EDGE);
GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_TEXTURE_WRAP_T, GLES11.GL_CLAMP_TO_EDGE);
GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_GENERATE_MIPMAP, GLES11.GL_TRUE);
GLES11.glTexEnvx(GLES11.GL_TEXTURE_ENV, GLES11.GL_TEXTURE_ENV_MODE, GLES11.GL_MODULATE);

GLUtils.texImage2D(GLES11.GL_TEXTURE_2D, 0, GLES11.GL_RGBA, bmp, 0);

どうすればこれを改善できますか?たとえば、毎秒多くのフレームをロードして表示する必要がある場合、Open GL ビデオ プレーヤーはどのように処理されますか? または、ページをタイルとしてレンダリングする現在の Web ブラウザーは? EGL_image は検討する価値のある良いオプションですか? OpenGL ES 2.0 とは異なりますか?

編集: 読み込みの速度低下は、GL スレッドでの GC が原因でした。

4

2 に答える 2

1

GC が開始されないようにすることに加えて、同様の質問に対する私の回答で説明されているように、ビットマップの生成とテクスチャのアップロードをすべて別のスレッドで行うことができます: Threading textures load process for android opengl game

これにより、アップロード自体に時間がかかる場合に小さなフレーム ドロップが発生するのを防ぐことができます。

于 2013-11-02T10:37:41.830 に答える
0

最後に、ネイティブ コードでも EGL_image でもなく、このビデオのおかげで解決しました。幸いなことに、ほとんどすべてのテクスチャが 256x256 であり、Android 3.2 以降をターゲットにしているため、このシナリオには簡単な解決策があります。

BitmapOptions.inBitmapBitmapは、新しいタイルごとに1 つを再利用するため、もう GC を行う必要はありません。256x256 より小さいいくつかのビットマップを拡大する必要がありました。

于 2013-02-05T11:12:34.847 に答える