私の以前の質問は、Java からネイティブにいくつかのコードを移動する必要があるこの質問に私を導きました。大量のテクスチャ (RGBA888 のデータは最大 2GiB、圧縮は許可されていません (例: 565、ETC...)) をオンザフライでロードし、古いものを破棄するため、ロード中に大量のガベージ コレクションが発生します。GC を OpenGL スレッドから部分的に移動することができたので、FPS が遅くなることはありませんが、GC によって一時停止されるため、テクスチャの読み込み時間が長くなります。
したがって、C で画像をデコードしてアップロードすることにより、GC を完全に削除したいと考えています。このために、私は Java の LinkedBlockingDeque を使用し、消費者は Thread クラスを拡張し、無限ループでキューから項目を取得します。アイテムには画像のファイルパスに関する情報が含まれており、これをワーカー スレッドでデコードし、GLSurfaceView の queueEvent() メソッドを使用して GL スレッドに送信します。
すべての画像 (PNG) は圧縮なしの zip ファイルにあり、そこから直接ストリーミングします (Android の APK 拡張ファイル メカニズム)。C/C++ の経験は豊富ですが、JNI の経験はありません。現在、Android の JNI の例を読んでいます。
問題は、InputStream をネイティブ コードに送信し、そこで png をデコードする方法 (私は libpng を使用します)、そしてここでトリッキーな部分です: それを GL スレッドに送信し、テクスチャとしてアップロードし、テクスチャ ID を返し、準備完了に設定します。 Java にフラグを立てますか? または、Java.nio ByteBuffer を使用してネイティブ コードに入力し、Java に送り返して、Bitmap の代わりに Buffer を取る glTexImage2D メソッドでアップロードすることはできますか? この java.nio バッファはガベージ コレクションを妨げますか、それともすべて C で行う必要がありますか?
Android 3.2以降をターゲットにしています。