从GLSurfaceView转换为TextureView(通过GLTextureView)

Wil*_*ale 22 android opengl-es google-tv

当Android 4.0(冰淇淋三明治)发布时,新的视图被引入到sdk中.这个视图是TextureView.在文档中,它表示TextureView可用于显示OpenGL场景的内容.

当您查找如何执行此操作时,您将找到一个示例链接.

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

但是我想用TextureView替换GLSurfaceView,并保持我的其余代码相同,并且只是接受TextureView的优点.

Wil*_*ale 33

回答:

1)从GLSurfaceView的源代码开始,将文件命名为GLTextureView.java

2)将标题更改为: GLTextureView extends TextureView实现SurfaceTextureListener

3)将构造函数重命名为GLTextureView.从init()方法中删除代码.

4)组织进口.始终选择非GLSurfaceView选项.

5)找到SurfaceHolder的每个实例并将其更改为SurfaceTexture

6)为SurfaceTextureListener添加未实现的方法,每个方法应如下所示:

  • onSurfaceTextureAvailable - surfaceCreated(surface)
  • onSurfaceTextureDestroyed - surfaceDestroyed(surface),(return true)
  • onSurfaceTextureSizeChanged - surfaceChanged(surface,0,width,height)
  • onSurfaceTextureUpdated - requestRender()

7)应该有一行调用getHolder(),将其更改为getSurfaceTexture()

8)在init()方法中,输入以下行 setSurfaceTextureListener(this)

然后添加一个OnLayoutChangeListener并打电话surfaceChanged(getSurfaceTexture(), 0, right - left, bottom - top).

有了它,你应该能够用你的GLSurfaceView代码替换它GLTextureView并从中获益GLTextureView.还要确保您的应用支持硬件加速,并且您的渲染器扩展GLTextureView.Renderer.

  • 是否可以发布一个这样的例子?我发现了这个:https://github.com/eaglesakura/gltextureview/blob/master/GLTextureView/src/com/eaglesakura/view/GLTextureView.java这与你描述的方法类似吗? (2认同)
  • 请注意,虽然这个答案确实有效,但您不希望执行第5点的最后一步,即`onSurfaceTextureUpdated - requestRender()`.使用此行,即使rendermode设置为RENDERMODE_WHEN_DIRTY,也会连续调用onDrawFrame.如果没有它,RENDERMODE_WHEN_DIRTY的行为就应该如此. (2认同)

Rob*_*ies 13

辉煌!

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);
}
Run Code Online (Sandbox Code Playgroud)

除此之外,我在大约五分钟的时间里跑起来!谢谢.


And*_*ICE 5

感谢Goodale先生和戴维斯先生的回答!

我还有一些关于将GLSurfaceView转换为GLTextureView的额外信息.第一个是关于渲染模式.如上所述,只需删除onSurfaceTextureUpdated中的requestRender()调用.

第二个是关于
mGLESVersion = SystemProperties.getInt("ro.opengles.version",ConfigurationInfo.GL_ES_VERSION_UNDEFINED); 只需使用link,但是你需要Context来做context.getClassLoader(); 您可以从init()调用getInt的反射版本,并将结果保存在静态字段sGLESVersion = getInt(getContext(),"ro.opengles.version",ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

最后一个最简单的变化是关于EGLLogWrapper.getErrorString(错误); 只需从EGLLogWrapper源复制getErrorString即可.

GitHub Gist上查看我的转换GLSurfaceView到GLTextureView的最终版本