我有一个视频观看。此 View 包含在名为 VideoStructure
的自定义 FrameLayout
中,我还可以在其中放置 channel Logo 或类似内容。
在正常情况下,视频是硬件加速的,所以 View (我想)实际上是一个透明的“黑洞”,而视频是由相关硬件解码和渲染的。
我的问题是,如果我重写视频 View 容器中的 draw()
(图像中的 VideoStructure
扩展了 FrameLayout
)来绘制一些东西(即图像中的圆圈)OVER 视频 - 我正在覆盖 draw()
,而不是 onDraw()
- 将这个破解硬件加速?我可以期望这样做会带来很大的性能影响吗?
最佳答案
它应该不会影响性能。
SurfaceView 有两部分,“ View ”部分和“表面”部分。 “ View ”部分是一个透明孔,与其他 View 相适应,“表面”部分是一个完全独立的层,由系统与 View 层合成。视频正在发送到“表面”部分。
如果您重写 SurfaceView 的“ View ”渲染器,您将获得通常完全透明的 View 的硬件加速 Canvas (因此,如果您删除它,最好使用零 alpha 和正确的传输模式)。
如果您尝试在“表面”部分进行渲染,通过从 lockCanvas()
获取 Canvas ,您将失败(因为视频有效地锁定了它),或者成功并阻止视频从被写入它。
无论“ View ”层中出现什么,系统合成器都必须混合“ View ”层和“表面”层,因此使更多像素不透明不会产生可衡量的影响。
更新:请参阅 graphics architecture doc有关表面和成分的更多详细信息。
关于android - surfaceview 容器中的 onDraw 会导致视频失效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23133739/