非圧縮 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 が原因でした。