2012-01-06 15 views
2

Android ICSでNDKベースのゲームを作成しようとしています。ハニカムとジンジャーブレッドでうまくいきました。ICSのeglCreateWindowSurfaceと2Dから3Dへの切り替え

ゲームでは、いくつかの2Dレンダリング、いくつかの3Dレンダリング、実行のさまざまな段階で2つの間の切り替えが使用されます。 (これは第三者コードのために交渉可能ではありません).2DレンダリングにはANativeWindow_lock()/ANativeWindow_unlockAndPost()、3DレンダリングにはeglCreateWindowSurface()/gl*()/eglSwapBuffers()を使用しています。

ハニカムとジンジャーブレッドでこれはうまくいきました。 ICSで、eglCreateWindowSurface()はログに次のメッセージで失敗します。それは何かのは、2Dレンダリングのためのオープンネイティブウィンドウを得たのでeglCreateWindowSurface()が失敗していることはかなり明白なようで、ソースコードを見てみると

E/SurfaceTexture(1765): [com.fnord/com.fnord.MyActivity] connect: already connected (cur=2, req=1) 
E/libEGL (5466): EGLNativeWindowType 0x29e9b8 already connected to another API 
E/libEGL (5466): eglCreateWindowSurface:374 error 300b (EGL_BAD_NATIVE_WINDOW) 
E/libEGL (5466): call to OpenGL ES API with no current context (logged once per thread) 

、それは私をさせません何らかの形で表面をリリースせずに3Dに変更してください。しかし、ANativeWindow APIではこれを行うための明白な方法はありません。

他に誰もこの問題にぶつかりましたが、その解決策は何ですか?

は、だから私は、OpenGLを使用するために私の2Dレンダリングコードを書き換えました

を更新しました(swapbuffers、三角形の対を介してテクスチャをレンダリング、テクスチャにバックバッファアップロード)の代わりにプリミティブ。これはポイントまで動作します。 何が起こっているのは、2Dレンダリングが正常に動作することです。表面を破壊し、3Dレンダリングの準備として新しいものを作成し、eglCreateWindowSurface()への2回目の呼び出しが失敗します。今回は、と:

E/SurfaceTexture(1869): [com.fnord/com.fnord.MyActivity] connect: already connected (cur=1, req=1) 

...そして、それはAEGL_BAD_NATIVE_WINDOWのEGLエラーがスローされます。

新しいサーフェスは、正確に同じ属性と古いものとしてで作成されます。私はeglCreateWindowSurface()への2回の呼び出しの間にeglTerminate()/eglInitialize()と呼ぶことを確かめてみました。

それぞれのANativeWindowを1回正確に使用できるのですか?もしそうなら、それはクロノスのEGL適合テストに失敗しませんか? NativeActivityにウィンドウを再作成させる方法はありますか?

更新更新

は最後の問題は、コンテキストと表面を破壊する前にeglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)を呼び出すに失敗私によって引き起こされたことが判明します。これはスレッドがコンテキストとサーフェスをアンバインドするまで破棄を遅らせる原因となりました。そのため、eglCreateWindowSurface()への呼び出しは正当に失敗します(同じネイティブウィンドウに2つのウィンドウサーフェスを持つことはできません)。

eglTerminate()を呼び出すと、すべてのEGLリソースは破棄されるが、その仕様では許可されていると考えられるため、これはである。は直観に反する。警告してください!

答えて

1

これはサポートされている使用例ではありません。それが前に働いたという事実は、あなたにとっては運が良かっただけで、いくつかのデバイスでは失敗する可能性があります。これを回避するには、2Dまたは3Dコンテンツを別のウィンドウでレンダリングするか、ビットマップで2DコンテンツをレンダリングしてGLテクスチャなどとしてレンダリングします

+0

あなたは、このための参照のためのリンクを持っていますか?つまり、サポートされる機能は何ですか? –

+0

OpenGLで2Dレンダリングを行うようにコードを書き直しましたが、それでも動作しません。身体の詳細。提案は大変感謝しています... –

+0

コードを表示してください。ウィンドウの表面を破壊/再作成することは、ハードウェアレンダリングが非常に頻繁に行うことです。なぜあなたはあなたの表面btwを破壊していますか? –

0

あなたはCPUレンダリング(ANativeWindow_lock)およびその逆へのOpenGLから切り替えることができますが、Surface.release()で使用Surfaceを解放し、他のAPIのためのあなたのSurfaceTextureから新しいものを作成する必要があります。

Example app

関連する問題