【问题标题】:does onDraw in a surfaceview container causes video to be invalidated?SurfaceView 容器中的 onDraw 会导致视频无效吗?
【发布时间】:2014-04-17 12:55:51
【问题描述】:

我有一个视频观看。这个视图包含在一个名为VideoStructure 的自定义FrameLayout 中,我还可以在其中放置频道徽标或类似内容。 在正常情况下,视频是硬件加速的,所以视图(我想)真的是一个透明的“黑洞”,而视频是由相关硬件解码和渲染的。

我的问题是,如果我在视频视图的容器中覆盖 draw()(图像中的 VideoStructure 扩展了 FrameLayout)以绘制一些东西(即图像中的圆圈)OVER强> 视频-我正在覆盖draw(),而不是onDraw()-这会破坏硬件加速吗?我可以期待这样做会带来很大的性能损失吗?

【问题讨论】:

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


    【解决方案1】:

    它应该对性能没有影响。

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

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

    如果您尝试在“表面”部分进行渲染,通过从lockCanvas() 获取 Canvas,您将失败(因为视频有效地锁定了它),或者成功并阻止将视频写入其中。

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

    更新:请参阅graphics architecture doc,了解有关表面和成分的更多详细信息。

    【讨论】:

    • 哦,多么准确的解释,正是我想知道的!
    • @fadden - 我知道这是一个旧答案,但它在搜索中出现,并且作为 rupps 注释非常详细,所以快速跟进问题:我们如何解释 onDraw 方法 - 它是否被称为当您的答案中的“视图”部分或“表面”部分被绘制到(或两者)时?我猜可能是系统合成器必须将视图和视频与写入的每个视频帧混合,这就是为什么,如其他地方所讨论的,您可以通过查看视图的 onDraw 来计算视频帧率?
    • View 失效时应用框架调用onDraw()。视频更新不调用它。请记住,视图 UI 和视频正在渲染到不同的图形缓冲区集,两者都被馈送到系统合成器(前者由应用程序提供,后者由媒体服务器进程中的视频编解码器提供)。您无法从 onDraw() 计算视频帧速率,除非您在软件中解码视频并对每一帧发出无效请求。
    • 很好的解释,尤其是关于单独图形缓冲区的说明(我必须通过你上面链接的文档来工作......)。
    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 2011-09-09
    • 2019-11-07
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2013-03-11
    相关资源
    最近更新 更多