3

解決しました!以下の更新を参照してください。

大規模なC++アプリケーションをAndroidに移植しており、アプリケーションの一時停止と再開に関しては、すべて正常に実行されています。APP_CMD_INIT_WINDOWコマンドをリッスンし、それが発生したら、すべてのeglコマンドを再初期化して、サーフェス、コンテキスト、および表示を取得します。この後、画面は黒くなります。ただし、正常に機能した後にglClearColorを設定すると、少なくともウィンドウがあり、そこに描画できることを意味します。これにより、再初期化されていない何かが他にある可能性があると私たちは信じるようになります。

私の質問は、再開後(または一時停止前)にクリアして再ロードする必要のあるバッファー、シェーダープログラム、またはその他のキャッシュされたものがあるかどうか、およびこれをテストする適切な方法があるかどうかです。アプリケーションが古いEGLコンテキストを使用して古いバッファを参照していることに関係しているのではないかと思われますが、知る方法はありません。アプリケーションは、多くのテクスチャとオフスクリーンバッファを使用します。


更新:いつものように、さまざまなことを1週間試した後、投稿を作成した直後にようやく解決しました。解決策は次のとおりです。

キャッシュされたすべてのテクスチャ、バッファ、およびシェーダは、EGLによって作成されたコンテキストハンドルに接続されます。GLコンテキストを作成するために初期化されるものがいくつかあり、ウィンドウサーフェスもその1つです。これは、アプリケーションを一時停止および再開するときに破棄および再作成されるANativeWindowオブジェクトに依存する唯一のものです。したがって、これを再作成する必要があるのはこれだけです。

要するに:

再開後、新しいウィンドウオブジェクトを引数として、eglCreateWindowSurfaceを再度実行します。

4

2 に答える 2

4

キャッシュされたすべてのテクスチャ、バッファ、およびシェーダは、EGLによって作成されたコンテキストハンドルに接続されます。GLコンテキストを作成するために初期化されるものがいくつかあり、ウィンドウサーフェスもその1つです。これは、アプリケーションを一時停止および再開するときに破棄および再作成されるANativeWindowオブジェクトに依存する唯一のものです。したがって、これを再作成する必要があるのはこれだけです。

要するに:

再開後、新しいウィンドウオブジェクトを引数として、eglCreateWindowSurfaceを再度実行します。

于 2012-04-24T13:16:23.430 に答える
0

他のすべてを再利用しながら、eglCreateWindowSurfaceとeglMakeCurrentの両方を呼び出す必要があり、それは機能しました(android 4.2)

于 2014-11-09T12:45:25.667 に答える