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リソースは破棄されるが、その仕様では許可されていると考えられるため、これはである。は直観に反する。警告してください!
あなたは、このための参照のためのリンクを持っていますか?つまり、サポートされる機能は何ですか? –
OpenGLで2Dレンダリングを行うようにコードを書き直しましたが、それでも動作しません。身体の詳細。提案は大変感謝しています... –
コードを表示してください。ウィンドウの表面を破壊/再作成することは、ハードウェアレンダリングが非常に頻繁に行うことです。なぜあなたはあなたの表面btwを破壊していますか? –