28

EGLと混同しています。

私の GLSurfaceView は EGLContext を作成します。次に、共有コンテキストを作成します。次に、EGLExtension を使用する必要があります。

私が使用しなければならないメソッドは呼び出されます (>=API18):

EGLExt.eglPresentationTimeANDROID(android.opengl.EGLDisplay display, android.opengl.EGLSurface surface, long time);

問題は、GLSurfaceView が javax.microedition.khronos.egl.EGLContext のみを作成することです。

つまり、GLSurfaceView を使用しないでください。そこで、少し似ている TextureView を試してみましたが、独自の EGL を処理する必要があるという違いがあります。その目的に適したものです。

しかし: TextureView は遅く、少なくともそのように見えたので、メソッド プロファイラーでいくつかの図を記録しました。

独自の EGL 処理を備えた TextureView: ここに画像の説明を入力 上部の Thread は、中央の Thread を起動するクロックであり、TextureView にレンダリングされます。その後、TextureView を再描画するために、メイン スレッドが呼び出されます。

...そしてここで、独自の EGL 処理を備えた GLSurfaceView 時計は今回は真ん中にあり、上部のスレッドを呼び出して画像をフレームバッファーにレンダリングします。これを直接 SurfaceView (RENDERMODE_WHEN_DIRTY) に渡し、requestRender を呼び出しますビューのレンダリングをリクエストします。 ここに画像の説明を入力

GLSurfaceView を使用すると、TextureView を使用した場合よりもきれいに見えることが、簡単に見てわかるように既にわかります。

両方の例で、画面に他に何も表示されておらず、同じシェーダーでまったく同じメッシュをレンダリングしました。

私の質問に: EGL14 コンテキストで GLSurfaceView を使用する方法はありますか?

私は何か間違ったことをしましたか?

4

2 に答える 2

50

おそらくやりたいことは、プレーンなSurfaceViewを使用することです。

短いバージョンは次のとおりです。

  • SurfaceViewには と の 2 つの部分がSurfaceありViewます。はSurfaceサーフェス コンポジター (SurfaceFlinger) に直接渡されるため、OpenGL で描画する場合、オーバーヘッドは比較的少なくなります。これにより高速化されますが、ビュー階層が適切に機能しなくなります。これは、Surfaceが 1 つのレイヤーにあり、ビューベースの UI が別のレイヤーにあるためです。
  • TextureViewにも 2 つの部分がありますが、描画する部分は舞台裏で生きています (ここで のSurfaceTexture出番です)。フレームが完成したら、描いたものが View レイヤーにブリットされます。GPU はこれを迅速に行うことができますが、「ある程度の作業」は常に「作業なし」よりも遅くなります。
  • GLSurfaceViewは、SurfaceViewすべての EGL セットアップとスレッド間メッセージングを行うラッパー クラスを備えています。

編集:ロングバージョンはこちらから入手できます。

GL/EGL のセットアップとスレッド管理を自分で行うことができる場合 (TextureView で実行している場合は、明らかにそれが可能です)、おそらくプレーンを使用する必要がありますSurfaceView

そうは言っても、元のコードを で動作させることは可能GLSurfaceViewです。内部からではなく、eglPresentationTimeANDROID()と共有されている EGL コンテキストを呼び出したいと思うので、内部で EGL10 を使用していても問題ありません。コンテキストを共有する上で重要なのは、コンテキストの構成に使用される EGL インターフェースのバージョンではなく、コンテキスト クライアントのバージョン (GLES2 と GLES3 など) です。GLSurfaceViewGLSurfaceViewGLSurfaceView

これらすべてがGrafikaで機能する例を見ることができます。特に:

  • 「Show + Capture Camera」はGLSurfaceView、カメラ、およびビデオ エンコーダーを使用します。EGL コンテキストが共有されていることに注意してください。GLSurfaceViewこの例は複雑でやや苦痛です。これは主に、共有 EGL コンテキストを意図的に使用しようとしているためです。(更新:共有コンテキストでの競合状態に関するこの問題に注意してください。)
  • 「ビデオの再生 (TextureView)」と「TextureView の基本的な GL」が実際に表示TextureViewされます。
  • 「FBO で GL アプリを記録する」ではプレーンなSurfaceView.
于 2014-01-24T01:14:18.203 に答える