从快速 I/O 设备实时流式播放

RV 具有大量功能,旨在使您可以从快速 I/O 设备直接读取 2K 或更高分辨率。由于决定 I/O 和解码速度的变量较多,您应尝试从 RV 中的简单参数集开始,然后逐一调整。如果同时调整所有变量,则很难找出切入点。

我们将尽可能尝试更新更多信息。

快速入门

RV 最常出现在美工人员的桌面上,因此没有为流式 I/O 配置默认首选项。本文列出了启用流式 I/O 需要作出的最重要更改。 更多详细信息和其他选项如下所述:

  1. 启用 Lookahead Cache
  2. 在 RV 的“首选项”(Preferences)中增加 Reader Threads 的数量(尝试找出最合适的数量)
  3. 如有必要,请尝试使用逐格式图像首选项中的 alternate I/O Methods
  4. 使用“首选项”(Preferences)下的“Render”部分中的 prefetch(启用或不启用 PBO)
  5. 在 Linux 中,尝试通过 -scheduler SCHED_RR -priorities 99 99(请参见下文)以根用户身份运行 RV,以实现软实时播放 

系统要求

我们没有可以推荐的固定系统。人们一直使用多种不同的设置来实现流式播放。但是,如果您有以下配置,则肯定会受益:

  • 大量的核心与处理器
  • 大量内存(64 位计算机:6 GB 内存为宜)
  • 64 位计算机
  • 新版 GPU(无需始终为 Quadro)
  • 性能出色的主板
  • 某种快速 I/O 设备,例如 RAID、ioXTREME 等 (单个“快速”磁盘驱动器可能并不足够)
  • NVIDIA 卡,价格低廉的 580 Quadro 非常好,更新版本可能更好。更新版本的 GeForce 卡可能也不错。

流式 I/O 图像格式

流媒体仅使用下列格式。如果您成功令其使用其他格式,那您无异于创造了奇迹。

  • DPX 和 Cineon - 尤其是 10 位文件
  • JPEG
  • TARGA (TGA)
  • TIFF - 通常 RAW tiff 最适合,无压缩
  • EXR 或 ACES

多个读取器线程

需要使用多个读取器线程来获取任何类型的快速 I/O 流。要执行此操作,您必须使用预留缓存。我们建议为预留缓存大小使用尽可能小的值。虽然有些人表示,超过 1 GB(有时更多)才适合他们。但是理想情况下,该值不超过 1 GB。 

如果没有至少两个核心可用,可能无法实现流式播放

以两个线程开始。用两个线程优化速度,之后尝试增加数量。可通过“首选项”(Preferences)下的“Caching”选项卡控制线程数量。更改线程数量后需要重新启动 RV。

核心与处理器数量越多越好。内存越大越好。

多个 EXR 解码线程

如果希望流式处理 EXR 文件,可能需要保留部分核心进行解码。可通过“首选项”(Preferences)下的“Formats”选项卡更改 EXR 解码线程数量。先尝试使用“Automatic”。

I/O 方法

如果不加尝试,很难确定应使用哪种 I/O 方法。可通过“首选项”(Preferences)下的“Formats”选项卡更改 I/O 方法。基本 I/O 方法包括:

  • 标准(适用于某些格式)。该方法使用任何被视为标准或常规的方式来读取这些文件。例如,就 EXR 而言,该方法使用随附于 EXR 库的“常规”EXR I/O 流。
  • 缓冲。数据被“流式处理”为单次逻辑读取所有数据。如果内核决定如此操作,则文件数据可位于文件系统缓存内。读取完所有数据后,文件数据被解码。
  • 无缓冲。类似于缓冲方法,只是 RV 会提示内核,文件数据不应放入文件系统缓存。理论上,这可能会加快 I/O 速度,因为读取期间未创建数据副本。但实际上,我们从未看到这种方法确实发挥作用。Internet 上有很多关于无缓冲 I/O 是否有用的讨论。 
  • 内存映射。文件内容会直接映射到主内存。这种方法的优点在于,可能不会缓存在文件系统中,并且当不再需要时进程可轻松收回内存。在某些方面,它类似于上述缓冲方法。与上述缓冲、无缓冲和标准方法相比,在 Windows 中,该方法可以显著提高局部 I/O 速度。
  • 异步缓冲。类似于上述缓冲方法,但是,内核会以某种随机顺序向 RV 提供数据,而不是等待按顺序自行组合数据。另外,低级别 I/O 区块大小可以用于调整 I/O 以最大化带宽。此方法最适用于 Windows。对于 Linux 和 Mac,异步 I/O 在 RV 环境下不太实用,因为 RV 自行管理解码和读取并发性。
  • 异步无缓冲。与异步缓冲相同,但会提示内核尽可能不要在文件系统缓存中存储数据。这是在 Windows 上使用的默认方法。

经验规则

  • 使用“首选项”(Preferences)中的 Prefetch 选项。这将使所需 VRAM 大小提高一倍,但可显著增加 RV 和显卡之间的带宽。在查看立体显示时,带宽尤其重要。理想情况下,Pixel Buffer Object (PBO) 也处于启用状态。启用 PBO 可让现代显卡受益。对于较旧的显卡,应分别尝试进行启用和禁用 - 启用时,某些早于 Fermi 系列的 Quadro 卡,性能甚至可能会变差。
  • 对于 NVIDIA Quadro Fermi 和 Kepler 系列 GPU(Fermi 4000、6000,Kepler 4000、5000、6000),在 Linux 和 Windows 中启用 Multithreaded GPU Uploads;在 Mac 中启用 Apple Client Storage
  • 在 Windows 中:先尝试异步无缓冲。唯一可能生成很好效果的其他方法是内存映射
  • 在 Linux 中,内存映射可能会导致播放不稳定(尤其是 使用软件 RAID 时)。 无缓冲缓冲是首选方法。但是,如果内存映射能为您所用,那就太棒了。
  • 在 Linux 上,无缓冲方法可能是安慰剂。它的效果取决于您正在读取的文件系统类型。例如,在采用 ext4 的 Ubuntu 10.04 中,无缓冲方法似乎与缓冲方法别无二致。而在 NFS 之上,无缓冲方法实际上可能适得其反。
  • 对于 EXR,请勿使用标准方法。无缓冲方法通常是最佳方法(如果文件系统支持)。
  • 理想情况下,EXR B44 图像采用 4:2:0 的子采样方式。另外,请记住,B44/A 必须是 16 位。PIZ、ZIP 和 ZIPS 编码的 EXR 占用大量 CPU,可能需要更多的 EXR 解码器线程。
  • 如果有最新的显卡,请尝试在“格式”(Format)首选项中,将 DPX 和 Cineon 10 位显示深度设置为 10 Bits/Pixel Reversed。这是在 RV 中处理 10 位数据时速度最快且颜色保留效果最佳的方法。如果拥有“30 位”的显示器(如 HP dreamcolor),还可以将 X Server 或 Windows 设置为 30 位模式以获得高精度颜色和快速流式处理。
  • 如果要在 16 位模式下显示 10 位 DPX,I/O 设备和显卡的带宽需要加倍(与 8 位模式相比)。如果您可以对 DPX/Cineon 使用 10 位模式,请先尝试 8 位。
  • 如果 I/O 设备的延迟时间较长,可能需要大幅增加读取器线程数量以分摊延迟时间。在某些情况下,使用的线程数超过核心数可能会有很好的效果。网络存储可能会发生这种情况。
  • 确保 RV 的 v-sync 与驱动程序的 GL v-sync 不同时处于启用状态。
  • DPX 文件的编写方式是,像素数据从 4096 字节开始写入文件。DPX 文件为小端格式,使用 4 通道 8 位、3 通道 10 位或 4 通道 16 位,并且分辨率宽度是 8 的整数倍。
  • 对于所有速度测试,确保您处于“Play All Frames”(“Control”菜单)而非“Realtime”模式。在此上下文中,“Realtime”意味着 RV 将跳过视频帧以跟上音频。
  • 并非所有 I/O 方法都受所有文件系统支持。特别是无缓冲 I/O 方法,基本文件系统实施可能不支持。

关于测试和文件系统缓存的说明

运行 RV 的所有操作系统均尝试将文件系统中的部分页面保留在内存中,以最大化 IO 吞吐量。算法可能很难预测,但最后的结果是,如果您尝试测试实时流式 IO 性能,操作系统的“帮助”可能会使您的结果无效;要声明的一点是,为了进行测试,您需要确保每次运行时内存中都没有要播放的镜头序列。您可以通过一组大型测试来完成此操作。假设有多个镜头序列,每个镜头序列都有数千帧。如果帧非常大而 RAM 又非常小,则可以在每次运行测试时切换到新镜头序列,这样可确保文件系统缓存中没有新镜头序列的任何部分。

但还有一种更可靠的方法来确保内存中没有任何帧并允许您反复使用相同的镜头序列进行测试,即在每次运行测试之前强制清除文件系统缓存。在 Linux 上可以运行以下命令:

sudo echo 1 > /proc/sys/vm/drop_caches

在 Mac OS X 上可以运行以下命令:

purge

但是我们不知道如何在 Windows 系统中清除文件系统缓存,如果您知道,请给我们留言!

实时

从 RV 3.10.8 版本开始,您可以在 Linux 上让 RV 作为实时应用程序运行。此模式实现了最稳定的 Linux 播放,尤其是在计算机设有服务器时间切片持续时间的情况下(计算机经过调整以实现最大吞吐量时通常如此)。理想情况下,RV 以更多更小的时间切片运行 - 至少用于显示线程和音频线程。

要在此模式下启动 RV,请使用以下命令:

rv -scheduler SCHED_RR -priorities 99 99

在这种情况下,RV Linux 将尝试使用 FIFO 或轮询调度器来代替常规 Linux 调度器。要执行此操作,必须具有 CAP_SYS_NICE 功能。这可以通过很多方法来实现,但目前我们只能使用其中两种方法:在 Linux 二进制文件上运行 setuid root 以使其拥有 root 用户权限,或者就是以 root 用户身份运行 RV。理想情况下,您可以使用 setcap 在文件系统上标记 rv.bin 二进制文件,使其仅包含 CAP_SYS_NICE,这样非 root 用户可以实时运行二进制文件,但目前我们无法实现此操作(可能是因为我们尚未真正了解它)。

在 Mac 中,RV 3.10.8 默认情况下是实时应用,不需要任何特殊的权限。

在 Windows 中,RV 3.10.8 将尽可能提高其优先级,而无需管理员权限。

注意:当 RV 以较高优先级运行时,仅涉及两个线程:显示线程和音频线程。这两个线程不执行大量计算工作。它们通常会受阻。因此,您不必担心 RV 消耗太多内核资源。

刷新速率和 V-Sync

实现绝对流畅播放的最大障碍是识别播放 FPS 和显示器刷新速率相结合的效果。例如,通常情况下,LCD 显示器的默认刷新速率为 60 Hz 左右(即每秒刷新 60 次)。在 60 Hz 显示器上播放 24 FPS 材料会产生类似于 3/2 pull down(3/2 下变换)的效果。为了获得最流畅的播放效果,理想的刷新速率为 48 Hz、72 Hz 或 24 的其他倍数。另外请注意,60 Hz 显示器实际可能是 59.88 Hz,这意味着即使 30 FPS 的材料也无法完全流畅地播放。您需要 59.88 / 2 (29.94) FPS 以获得最佳播放效果。

多显示器系统

连接多个显示器的系统有另一个问题:运行 RV 的显示器可能不是其同步到的显示器。如果发生这种情况,播放可能会变得异常。例如在 Linux 中,驱动程序仅可以同步到一个显示器 - 一旦 RV 启动便无法更改同步显示器。在 Linux 中,您可以通过设置以下环境变量来更改驱动程序用于同步的显示器:__GL_SYNC_DISPLAY_DEVICE。下面这段内容来自 NVIDIA 驱动程序自述:

将 __GL_SYNC_TO_VBLANK 用于 TwinView 时,OpenGL 仅可同步到其中一个显示设备;这可能会导致 OpenGL 未同步到的显示设备发生严重损坏;您可以使用环境变量 __GL_SYNC_DISPLAY_DEVICE 指定 OpenGL 应同步到的显示设备。应将此环境变量设置为某一显示设备的名称;例如“CRT-1”。在 X 日志文件中查找行“Connected displaydevice(s):”,以获取存在的显示设备及其名称列表。此外,也可以查看第 10 章,配置 TwinView“配置 Twinview”以及第 16 章,编程模式 中的“确保同等模式计时”部分,以获取有用信息

RV 的 V-Sync 与驱动程序的 V-Sync

最后,不要在驱动程序的 GL v-sync 和 RV 的 v-sync 均处于启用状态时运行 RV。这几乎注定了播放效果不佳。使用其中一个或另一个。您可能想要进行试验,以了解哪个可以为您的系统带来更好的计时效果。您可以按如下方式找到相关设置

  • 在 RV 的“首选项”(Preferences)下的“Rendering”选项卡中,有一个“Video Sync”复选框。
  • 在 NVIDIA 设置 GUI 中,有一个 OpenGL“Sync to VBlank”复选框。
NVIDIA 建议尽可能使用驱动程序的 v-sync 并禁用 RV 的 v-sync。在 Linux 中,RV 3.12.12 将尝试检测驱动程序使用哪台显示器进行同步,如果该显示器并非运行 RV 的显示器,则发出警告(在 Shell 或控制台窗口中输出“信息”(INFO)消息)。在演示模式下,如果演示设备并非同步设备,则 RV 3.12.12 将显示一个消息框 (Linux)。
 
另请参见:V-Sync 文章
关注

0 评论

登录写评论。