我正在尝试将实时效果应用于相机预览并在多个视图中显示,我该怎么办?
(就像camera2)(snapshot
我知道两种方法来显示实时效果的相机预告,如果没有涉及到左侧的滚动视图。
使用GLSurfaceView setRenderer。将surfacetexture绑定为gles外部纹理,并使用glsl(opengl着色语言)应用效果。
使用TextureView。它更复杂,因为需要设置eglcontext/eglsurface并执行线程管理。
但是,我不知道如何使实时效果的滚动视图项目覆盖谷歌组成。
我应该选择glsurfaceview(用于性能)还是textureview(用于flexble)来实现scrollview?哪一个是更好的解决方案?为什么?
是否可以在多个视图之间共享一个egl上下文/表面?如果是的话,有什么代码片段可以参考吗?
经过谷歌搜索和阅读niceGraphics architecture文章和Grafika项目,我仍然不知道…
也许我错过了一些重要的事情,有人给我指出来吗?提前谢谢。

最佳答案

surface view和scrolling不能很好地结合在一起,因为surfaceview有两个部分——surface和view——其中一个的移动往往落后于另一个的移动。视图由应用程序呈现,但曲面由surfaceflinger合成,因此窗口移动必须通过窗口管理器。TextureView没有这个问题,但确实会带来一些额外的开销。
如果你想让它在滚动时看起来很好,你可能需要一个纹理视图。
多个egl上下文可以共享数据,也可以使用单个egl上下文呈现到多个曲面。Grafika有两种情况的示例(“show+capture camera”使用glsurfaceview和共享egl上下文,“continuous capture”使用surfaceview和单个egl上下文;两种活动都呈现为屏幕上的曲面和屏幕外的曲面)。
所有的硬件加速视图都有自己的egl上下文管理,如果你渲染到surfaceview或textureview上,就没有理由去处理这个问题。
如果计划实时绘制多个版本的实时摄影机预览,则可以在一个场景中自己渲染它们,从而获得最佳性能。渲染多个TextureView的效率会降低。根据用户界面的选择,这可能意味着要处理项目绘图并自己滚动,而不是将其交给listview。(至少,您需要确保只实时更新屏幕上的缩略图。)

关于android - SurfaceView或TextureView组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27376340/

10-12 06:27