活动
优化 Windows 游戏的 DVD 性能
运行 Windows 的计算机有 DVD 驱动器的百分比很高,并且许多游戏都以 DVD 形式提供。 因此,我们建议确保游戏充分利用 DVD 驱动器。 通过了解从 DVD 读取数据的方式以及数据的位置如何影响其读取时间,可以减少加载时间并提高游戏期间的整体性能。 本文讨论如何优化 Windows 游戏的 DVD 性能。
下图显示了 DVD 的基本布局。
DVD 上的数据以连续螺旋的形式存储,就像在 CD 上一样;但是,这些文件分为块和扇区。 文件分布在 ECC) 块 (纠错代码中,每个块分为 16 个 2 KB 扇区, (即每个块) 32 KB 的数据。 文件沿扇区边界对齐,扇区中的任何未使用空间都留空。 如果文件只有 10 个字节,则浪费该 2 KB 扇区中的其余空间;因此,如果可能,请将文件捆绑成 2 KB 的增量以获得最佳数据密度。 请注意,这些规范仅适用于 DVD,CD 和 HD-DVD 具有不同的规格。
下面是 DVD 驱动器在收到从 DVD 读取的请求时执行的序列:
- 如有必要,更改层
- Seek
- 将光学拾取单元重新聚焦 (OPU) 以读取数据
- 检查实际位置
- 调整并重复,直到找到正确的数据
驱动器读取操作的量化方式不同,具体取决于它们是逻辑驱动器读取还是物理驱动器读取。 逻辑驱动器读取只能读取整数数量的 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 上发布时,需要注意一些重要的兼容性问题。 首先,基于 Windows 的计算机中的 DVD 驱动器的性能可能会有所不同,因此,如果 DVD 对吞吐量有特定的要求,请务必确保用户的硬件满足这些要求。 此外,多层 DVD 可能会导致某些 DVD 驱动器上的兼容性问题。 为避免这些问题,建议在发布前交付单层 DVD 或在大多数驱动器上全面测试多层 DVD。
为了提高 DVD 性能,可以应用一些常规规则。 以下技术有助于最大化吞吐量并减少浪费的数据:
- 避免小于 32 KB 的读取
- 对数据进行布局以减少或消除寻道
- 在 ECC 块边界上布局数据
- 通过将小文件捆绑到 2 KB 块中来最大化容量,并减少 DVD 扇区中的填充空间
- 异步读取以减少 CPU 负载和过度内存使用量
- 避免发布多层 DVD