为什么 Netflix 在全屏模式下表现更好(更高效)?

Cra*_*tis 6 video mac google-chrome netflix macos

前几天我注意到,在我的 Retina MacBook Pro 上用 Chrome 在 Netflix 上观看电影时,当我只是在常规窗口的单个标签中观看视频时,粉丝会更快地旋转。(即。不是全屏。)

当切换到全屏模式时,大约一分钟左右,风扇就会消失。

所以我在两种模式下使用电池监视器应用程序测量了mAh,在窗口模式下测量了大约85 mAh,在全屏模式下测量了大约50 mAh。

我还没有在其他浏览器中测试。

活动监视器报告说,仅在选项卡中打开 Netflix 会导致独立显卡启动,因此我认为这不是集成显卡与独立显卡的问题。

我似乎无法确定为什么更大的观看区域和(理论上)更高质量的视频流会使用更少的系统资源。

all*_*tic 6

它几乎肯定与桌面窗口合成器有关。

当您在 Web 浏览器窗口中播放视频时,更糟糕的是,在插件中,Web 浏览器必须如此呈现其页面:

  1. 绘制我们的窗口装饰(地址栏、书签、按钮等)
  2. 绘制网页的第一部分。
  3. 在视频应该出现的地方画一个“黑色方块”,但在它的两侧(左右)绘制网页的相关部分。
  4. 很好地要求插件在它说要打开窗口的地方进行绘制。
  5. 在窗口下方绘制网页的其余部分,一直到页面底部。
  6. 在此序列之上,负责动画效果(例如最小化和最大化窗口等)的合成窗口管理器必须跟踪屏幕上每个窗口的内容。作为其中的一部分,它必须跟踪该窗口内绘制的所有内容,包括插件,它在 Chrome 中是一个进程外插件(意思是,它是另一个进程的一部分,而不是 chrome 主进程的一部分)。如果合成窗口管理器没有跟踪这一点,并将窗口中的所有内容都视为“3D 纹理”,则当您单击减号按钮时,它将无法将窗口的最小化动画化到您的任务栏中。

当您告诉 Flash(或 Silverlight)全屏播放视频时,Flash 停止告诉 Chrome 渲染任何内容。事实上,可以暂时禁用整个合成窗口管理器,并且可能负责将图形渲染到监视器的所有其他程序都被暂时告知停止渲染(或者,也许允许它们提交绘图命令,但它们没有屏幕上的实际效果。)

非全屏时的图形管道:

浏览器和 Flash/Silverlight -> 合成窗口管理器 -> 图形硬件

全屏时的图形管道:

Flash/Silverlight -> 图形硬件

这种简化的管道减少了开销,因为正在进行的缓冲区“复制”更少,整个视频处理看起来像这样:

  1. 从网络下载视频内容。
  2. 使用 DRM 系统解密视频。
  3. 使用 GPU 的一个特殊部分,称为固定功能视频解码管道,将视频数据硬件解码为未压缩格式。
  4. 硬件视频解码管道现在可以将解码后的视频直接复制到图形帧缓冲区中并播放——无需将其发送回 CPU/RAM!

正是因为合成窗口管理器总是在说:“好的,视频现在是什么样子?” 并且在合成窗口管理器决定将它与所有其他合成数据(浏览器、任务栏等)一起写回到显卡之前,它必须被回 CPU(并且可能缓冲在 RAM 中) .)

合成窗口管理器必须不断要求将视频内容传输回 CPU,因为在正常情况下,系统上唯一允许直接写入视频帧缓冲区的进程合成窗口管理器。浏览器、视频播放器和系统上的所有其他组件都必须通过合成窗口管理器,就像位于硬件和用户空间之间的看门人或发言人。

这部分是为了启用“效果”,部分是出于安全性和稳定性的原因,因为程序无法直接破坏桌面(恶意或错误编码);合成窗口管理器不会让它。但是,当合成窗口管理器被禁用时(在 Flash 和 Silverlight 等特权程序的请求下),突然那额外的“开销”层就消失了。

Mac OS X 上使用的合成窗口管理器称为Quartz Compositor,长期以来它一直是 OS X 的一部分。Quartz Extreme是 Quartz 合成器的现代化身,它在 GPU 本身上完成我上面描述的所有操作(尽管这些操作并不是“免费”的,因为它们被卸载到 GPU;GPU 仍然消耗功率来执行这些合成步骤.)

有关程序(例如 Flash 或 Silverlight)如何获得全屏控制并暂时禁用 Quartz Compositor 的确切开发人员观点,请参阅此 Apple 开发人员文档

长话短说: Quartz Compositor + 非常频繁的屏幕更新(视频每秒 30 到 60 次)== 高 CPU 使用率。从管道中移除 Quartz Compositor 组件,CPU 使用率会急剧下降,尤其是因为 Flash 和 Silverlight 具有硬件加速的视频渲染和视频解码。