24

Android 4.0 (Ice Cream Sandwich) がリリースされたとき、SDK に新しいビューが導入されました。このビューは TextureView です。ドキュメントでは、TextureView を使用して OpenGL シーンのコンテンツを表示できると書かれています。

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

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

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

4

4 に答える 4

36

答え:

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

2) ヘッダーを次のように変更します: GLTextureView extends TextureView implements SurfaceTextureListener

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

4) インポートを整理します。常に GLSurfaceView 以外のオプションを選択してください。

5) SurfaceHolder のすべてのインスタンスを見つけて、SurfaceTexture に変更します。

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

  • onSurfaceTextureAvailable - surfaceCreated(表面)
  • onSurfaceTextureDestroyed - surfaceDestroyed(表面)、(true を返す)
  • onSurfaceTextureSizeChanged - surfaceChanged(表面、0、幅、高さ)
  • onSurfaceTextureUpdated - requestRender()

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

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

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

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

于 2012-08-21T19:08:05.490 に答える
14

素晴らしい!

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 分で稼働しました。ありがとう。

于 2012-08-23T01:04:01.653 に答える
5

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

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

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

最後に最も簡単な変更は、EGLLogWrapper.getErrorString(error); に関するものです。EGLLogWrapper ソースから getErrorString をコピーするだけです。

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

于 2014-12-11T16:52:47.063 に答える