在surfaceview容器中onDraw会导致视频无效吗?

时间:2014-04-17 12:55:51

标签: android optimization surfaceview android-videoview hardware-acceleration

我有视频观看次数。此视图包含在名为FrameLayout的自定义VideoStructure中,我还可以在其中添加频道徽标或类似内容。 enter image description here 在正常情况下,视频是硬件加速的,因此视图(我认为)实际上是一个透明的“黑洞”,而视频是解码的。由相关硬件提供。

我的问题是,如果我在视频视图的容器中覆盖draw()(图片中的VideoStructure扩展FrameLayout)来绘制一些内容(即图像中的圆圈) OVER 视频 - 我重写draw(),而不是onDraw() - 这会破坏硬件加速吗?我可以期待这样做有很大的性能影响吗?

1 个答案:

答案 0 :(得分:2)

它应该对性能没有影响。

SurfaceViews有两个部分,“视图”部分和“表面”部分。 “视图”部分是与其他视图匹配的透明孔,“表面”部分是完全独立的层,由系统与视图层合成。视频正被发送到“表面”部分。

如果您覆盖SurfaceView的“视图”渲染器,您将获得一个通常完全透明的视图的硬件加速Canvas(因此,如果您删除它,最好使用零的alpha和正确的传输模式)。

如果您尝试在“表面”部分渲染,通过从lockCanvas()获取画布,您将失败(因为视频实际上已将其锁定),或者成功并阻止视频写入其中

无论“视图”图层中出现什么,系统合成器都必须混合“视图”和“表面”图层,因此使多个像素不透明不会产生可测量的影响。< / p>

更新:有关曲面和合成的详细信息,请参阅graphics architecture doc