优化 Windows 游戏的 DVD 性能

运行 Windows 的计算机有 DVD 驱动器的百分比很高,并且许多游戏都以 DVD 形式提供。 因此,我们建议确保游戏充分利用 DVD 驱动器。 通过了解从 DVD 读取数据的方式以及数据的位置如何影响其读取时间,可以减少加载时间并提高游戏期间的整体性能。 本文讨论如何优化 Windows 游戏的 DVD 性能。

DVD 的基本布局

下图显示了 DVD 的基本布局。

dvd 布局

DVD 上的数据以连续螺旋的形式存储,就像在 CD 上一样;但是,这些文件分为块和扇区。 文件分布在 ECC) 块 (纠错代码中,每个块分为 16 个 2 KB 扇区, (即每个块) 32 KB 的数据。 文件沿扇区边界对齐,扇区中的任何未使用空间都留空。 如果文件只有 10 个字节,则浪费该 2 KB 扇区中的其余空间;因此,如果可能,请将文件捆绑成 2 KB 的增量以获得最佳数据密度。 请注意,这些规范仅适用于 DVD,CD 和 HD-DVD 具有不同的规格。

从 DVD 读取

下面是 DVD 驱动器在收到从 DVD 读取的请求时执行的序列:

  1. 如有必要,更改层
  2. Seek
  3. 将光学拾取单元重新聚焦 (OPU) 以读取数据
  4. 检查实际位置
  5. 调整并重复,直到找到正确的数据

驱动器读取操作的量化方式不同,具体取决于它们是逻辑驱动器读取还是物理驱动器读取。 逻辑驱动器读取只能读取整数数量的 DVD 扇区,而物理驱动器读取请求只能读取整数数量的 ECC 块。 通常,物理驱动器接收读取请求;它将尝试填充其缓存。 DVD 驱动器缓存大小取决于各个驱动器的规格。

当 DVD 驱动器获取超过缓存大小的读取请求时,该请求将细分为缓存大小的请求。 驱动器查找包含请求的第一个扇区的 ECC 块,并读取整个 ECC 块。 驱动器固件解码 ECC 块,然后读取下一个 ECC 块。 此过程将重复,直到驱动器缓存已满或满足所有请求。 然后,内核从驱动器缓存中读取解码的数据。 然后,如果有任何读取请求仍然存在,它将刷新缓存并启动下一个读取操作。

注意

每个未缓存的读取都会刷新驱动器缓存。

 

读取错误

DVD 和 DVD 驱动器并不完美,在读取过程中可能会出现错误。 与光盘一样,DVD 的某些部分可能会因灰尘或划痕而变得不可读。 如果块的任何部分不可读,则整个块被视为不可读。 如果发生读取错误,驱动器会尝试重新读取 ECC 块。 如果块仍然不可读,驱动器会中止读取操作,并将一个值返回给内核,该值指示该块不可读。 然后,内核决定下一步要执行的步骤。 内核可以重新发出请求、完全中止读取,或者关闭驱动器并重新发出请求。

数据吞吐量

DVD 驱动器的数据吞吐量取决于多种因素:请求的数据位置、磁盘的清理或暂存程度、从磁盘读取的流数、与这些流关联的缓冲区大小以及单个驱动器的规格。 吞吐量还取决于驱动器是否具有固定角速度 (CAV) 或 CLV) (恒定的线性速度。 如果驱动器使用 CAV 旋转,则光盘以相同的速度旋转,而不考虑 OPU) (光学拾取单元的位置。 这意味着,随着 OPU 离光盘的外边缘越来越近,数据轨迹越过 OPU 的速度会更快。使用 CLV 时,当 OPU 向外移动时,光盘的旋转速度会更慢,因此数据轨迹以恒定的速度通过 OPU。 大多数电脑中的 DVD 驱动器都使用 CLV。

当驱动器正在查找和更改层时,无法从光盘读取数据。最好尽量减少这些操作,尤其是在读取初始加载屏幕的数据时。

浪费吞吐量的示例

若要了解如何浪费数据吞吐量,请考虑假设驱动器和 DVD。 假设需要读取光盘中间的文件。 光盘该区域的吞吐量约为 8.25 MB/秒。如果寻道笔划为满的一半或三分之一,则平均寻道时间为 150 毫秒。 在此示例中,读取 1.2 MB (150 毫秒× 8.25 MB/秒) ,只需将 OPU 获取到可读取位置的时间。 添加层更改会将浪费的吞吐量提高到 1.8 MB (225 毫秒× 8.25 MB/秒) 。

另一个演示吞吐量浪费的示例是从 CAV 驱动器加载 20 个位置不佳的文件,且没有层更改。 如果每个文件的查找时间加上读取数据前的延迟大约为 200 毫秒,则 4 秒 (20 个文件× 200 毫秒) 只用于查找数据。 如果文件位于外径上,以 11× 速度读取,则吞吐量平均为 15.2 MB/秒 (11 速度/12 速度× 16 MB/秒) 。 此示例中浪费的吞吐量约为 60.8 MB (15.2 MB/秒× 4 秒) 。

同步读取与异步读取

异步读取比同步读取更有效。 同步读取时,一个或多个 ECC 数据块在复制到应用程序内存之前将读取到系统内存中。 相比之下,异步读取将解码的 ECC 块直接复制到应用程序内存,从而避免 L2 缓存并降低 CPU 开销。 若要异步读取,请在使用 CreateFile 函数打开文件时使用 FILE_FLAG_OVERLAPPED 标志。 ReadFile 函数还需要传入的有效 OVERLAPPED 结构来执行异步 I/O。

有关异步 I/O 的详细信息,请参阅 同步和异步 I/O

以最佳方式阅读

从 DVD 读取时的最佳原则是避免查找和读取少量数据。 当读取的数据量小于 ECC 块的容量(小于 32 KB)时,将浪费该块的其余部分。 由于缓存大小因驱动器而异,开发人员必须决定读取请求的最小数据量,而不是小于此大小。 最小大小应为 ECC 块的整数倍,以避免在读取和解码不会使用的数据时浪费时间。 避免不一切代价查找也很重要,因为任何查找时间都是不读取数据所花费的时间。

DVD 兼容性

在 DVD 上发布时,需要注意一些重要的兼容性问题。 首先,基于 Windows 的计算机中的 DVD 驱动器的性能可能会有所不同,因此,如果 DVD 对吞吐量有特定的要求,请务必确保用户的硬件满足这些要求。 此外,多层 DVD 可能会导致某些 DVD 驱动器上的兼容性问题。 为避免这些问题,建议在发布前交付单层 DVD 或在大多数驱动器上全面测试多层 DVD。

总结

为了提高 DVD 性能,可以应用一些常规规则。 以下技术有助于最大化吞吐量并减少浪费的数据:

  • 避免小于 32 KB 的读取
  • 对数据进行布局以减少或消除寻道
  • 在 ECC 块边界上布局数据
  • 通过将小文件捆绑到 2 KB 块中来最大化容量,并减少 DVD 扇区中的填充空间
  • 异步读取以减少 CPU 负载和过度内存使用量
  • 避免发布多层 DVD