web-dev-qa-db-ja.com

GLSurfaceViewからTextureViewへの変換(GLTextureView経由)

Android 4.0(アイスクリームサンドイッチ)がリリースされたとき、新しいビューがSDKに導入されました。このビューはTextureViewです。ドキュメントでは、TextureViewを使用してコンテンツを表示できると記載されていますOpenGLシーンの場合。

これを行う方法を調べると、1つの例へのこのリンクが見つかります。

https://groups.google.com/forum/?fromgroups=#!topic/Android-developers/U5RXFGpAHPE

ただし、GLSurfaceViewをTextureViewに置き換え、残りのコードを同じに保ち、TextureViewの利点を享受したかっただけです。

22
William Goodale

回答:

1)GLSurfaceViewのソースコードから始めて、ファイルにGLTextureView.Javaという名前を付けます。

2)ヘッダーを次のように変更します。GLTextureViewはTextureViewを拡張してSurfaceTextureListenerを実装します

3)コンストラクターの名前をGLTextureViewに変更します。 init()メソッドからコードを削除します。

4)輸入品を整理します。常に非GLSurfaceViewオプションを選択してください。

5)SurfaceHolderのすべてのインスタンスを検索し、SurfaceTextureに変更します

6)SurfaceTextureListenerに未実装のメソッドを追加します。各メソッドは次のようになります。

  • onSurfaceTextureAvailable-surfaceCreated(surface)
  • onSurfaceTextureDestroyed-surfaceDestroyed(surface)、(trueを返す)
  • onSurfaceTextureSizeChanged-surfaceChanged(surface、0、width、height)
  • onSurfaceTextureUpdated-requestRender()

7)getHolder()が呼び出されている行が1行あるはずですが、それをgetSurfaceTexture()に変更します。

8)init()メソッドに、次の行を入力しますsetSurfaceTextureListener(this)

次に、OnLayoutChangeListenerを追加し、surfaceChanged(getSurfaceTexture(), 0, right - left, bottom - top)を呼び出させます。

これで、GLSurfaceViewコードをGLTextureViewに置き換えて、GLTextureViewのメリットを享受できるはずです。また、アプリがハードウェアアクセラレーションをサポートしていること、およびレンダラーがGLTextureView。Rendererを拡張していることを確認してください。

33
William Goodale

鮮やかさ!

グドール氏の見事な答えへのマイナーな追加:

GLSurfaceViewの4.1.1バージョンは、幅/高さがゼロのサーフェスでのレンダリングを回避するように変更されているようです。また、onSurfaceTextureAvailableの直後に無償のonSurfaceTextureChanged通知がないようです。

4.1.1ソースから始める場合、onSurfaceTextureAvailableは次のように読む必要があります。

public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
        int height) 
{
    this.surfaceCreated(surface);
    this.surfaceChanged(surface, 0,width,height);
}

それ以外は、約5分でフラットに稼働しました!ありがとう。

13
Robin Davies

Goodale氏とDavies氏の回答に感謝します。

GLSurfaceViewからGLTextureViewへの変換について少し余分なことがあります。 1つ目は、レンダリングモードについてです。説明したように there onSurfaceTextureUpdatedのrequestRender()呼び出しを削除するだけです。

2番目は約
mGLESVersion = SystemProperties.getInt( "ro.opengles.version"、ConfigurationInfo.GL_ES_VERSION_UNDEFINED); link を使用するだけですが、context.getClassLoader();を実行するにはContextが必要です。 init()からgetIntのリフレクションバージョンを呼び出し、結果を静的フィールドに保存できますsGLESVersion = getInt(getContext()、 "ro.opengles.version"、ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

そして最後の最も簡単な変更はEGLLogWrapper.getErrorString(error)についてです。 EGLLogWrapperソースからgetErrorStringをコピーするだけです。

GitHub Gist でGLSurfaceViewからGLTextureViewへの変換の最終バージョンを参照してください

5
AndreyICE

既製のクラスをコピーして貼り付けたい場合は、ここに1つ書きました。

GLTextureView

GLSurfaceViewと同様に、setRenderer(GLSurfaceView.Renderer)を呼び出すことができます。

4
Yervant