5

以下2問。

Windows、Linux、MacOS、iPhone、iPad、および Android フォンで数年間正常に動作するグラフィックス OpenGL ES 2 アプリケーションがあります。過去数か月の間に、一部の Android デバイス (Toshiba Thrive、HTC One X、Nexus 7、Asus Transformer、API 15 および 17 など) のユーザーから、画面が黒くなったりちらついたりする問題、またはごくまれにアプリの問題に関するフィードバックを受け取り始めました。クラッシュ。私たちのアプリは API 9 以降をターゲットにしており、NativeActivity を使用して NDK で記述されています。nvidia の Android の例とデモに直接基づいています。すべてのプラットフォームで徹底的にテストされており、メモリ リークや無効なメモリ アクセスはありません。小さな Java を呼び出すことはめったにありません。コード。

LogCat を調べたところ、これらのデバイスで次の 2 種類のエラー メッセージが表示されていることがわかりました。

(1)JNI ERROR: env->self != thread-self (0x11734c0 vs. 0xd6d360); auto-correcting

(2)NvRmChannelSubmit failed (err = 196623, SyncPointValue = 0)続いてGL_OUT_OF_MEMORY

(1) に関しては、スレッドと JNI の問題についてはわかっており、これを修正する方法もわかっていると思います。私はこの情報を読みましたが、私の質問は次のとおりです。「自動修正」とは、エラーを心配する必要があることを意味しますか、それとも、コードが将来的にうまく動作しないことを意味する警告ですが、今では完全にうまく機能します(修正済み!)これは問題(2)とは関係ありませんか?私が尋ねている理由は、時々次の行も見られるからです:

E/libEGL: call to OpenGL ES API with no current context (logged once per thread)
E/NvEGLUtil: Failure: eglSwapBuffers, error = 0x0000300d (swap:422)

真剣に見えるもの。JNIcheck が有効になっている API 17 エミュレーターでアプリをテストしました。問題は報告されておらず、アプリは正常に動作します。

さて、メッセージ (2) に関して、いくつかのフォーラム (たとえば、ここここ、およびこれ) でこのメッセージが報告されているのを見つけましたが、その理由は不明です。ファームウェアまたはドライバーの問題、または GPU のメモリ リークまたはメモリの断片化のように見えます...多くのゲームが画面のちらつきの影響を受けており、人々はデバイスの再起動/リセット、キャッシュのクリア、アップグレードなどを試みていますが、問題は解決していないようです. この問題は、かなりの数の一般的なデバイスに関係しています。にもかかわらずGL_OUT_OF_MEMORYテストに使用したアプリは、通常のバージョンで使用されている 512x512 のテクスチャではなく、小さな 32x32 のテクスチャを使用していたため、エラー コード「メモリが不足しています」は正当化されません (これらの大きなテクスチャは古いデバイスで完全に機能します)。誰でもこれを修正する方法について経験がありますが、これは私たちの側で修正できますか? これは正式に確認されたハードウェア/ファームウェア/OS のバグですか? 私は、この問題の既知の理由と実際の解決策を探しています。理由がわからずに誤って役立つ試行錯誤の回避策ではありません。

ありがとう!

4

1 に答える 1