執行 Windows 的電腦百分比很高,具有 DVD 磁碟驅動器,而且許多遊戲都隨附於 DVD 上。 因此,我們建議您確保遊戲使用 DVD 光碟機充分發揮其優勢。 藉由了解數據如何從 DVD 讀取,以及數據的位置如何影響其讀取時間,您可以減少載入時間,並改善遊戲期間的整體效能。 本文討論如何優化 Windows 遊戲的 DVD 效能。
DVD 的基本版面配置
此圖顯示 DVD 的基本版面配置。
DVD 上的數據會以連續螺旋的形式儲存,例如在CD上;不過,檔案會分成區塊和扇區。 檔案會分散在錯誤更正碼 (ECC) 區塊上,而每個區塊會分成 16 個 2 KB 扇區(也就是每個區塊中 32 KB 的數據)。 檔案會沿著扇區界限對齊,且扇區中的任何未使用空間會保留空白。 如果檔案只有 10 個字節,則會浪費該 2 KB 扇區中的其餘空間;因此,盡可能將檔案組合成 2 KB 遞增,以取得最佳的數據密度。 請注意,這些規格僅適用於 DVD,而 CD 和 HD-DVD 有不同的規格。
從 DVD 讀取
以下是 DVD 磁碟驅動器在收到從 DVD 讀取的要求時執行的序列:
- 視需要變更圖層
- 尋求
- 重新聚焦光學拾音器單元 (OPU) 以讀取資料
- 檢查實際位置
- 調整並重複,直到找到正確的數據為止
磁碟讀取作業的量化方式會根據是邏輯磁碟讀取還是實體磁碟讀取而有所不同。 邏輯磁碟驅動器讀取只能讀取 DVD 扇區整數數量,而實體磁碟驅動器讀取要求只能讀取 ECC 區塊的整數數量。 一般而言,實體磁碟驅動器會收到讀取要求;它會嘗試填滿其快取。 DVD 磁碟驅動器快取大小取決於個別磁碟驅動器的規格。
當 DVD 磁碟驅動器收到超過快取大小的讀取要求時,會將要求分解成多個符合快取大小的要求。 磁碟驅動器會搜尋包含要求第一個扇區的 ECC 區塊,並讀取整個 ECC 區塊。 磁碟驅動器韌體會譯碼 ECC 區塊,然後讀取下一個 ECC 區塊。 此程式會重複執行,直到已填滿磁碟驅動器快取或完成所有要求為止。 然後,核心會從磁碟驅動器快取讀取已解碼的資料。 然後,它會清空快取,並在仍有讀取要求時啟動下一個讀取作業。
注意
每個未快取的讀取都會清空磁碟驅動器快取。
讀取錯誤
DVD 和 DVD 磁碟驅動器並不完美,而且讀取期間可能會發生錯誤。 和CD一樣,DVD 的部分可以從灰塵或劃痕中變得無法讀取。 如果區塊的任何部分無法讀取,則會將整個區塊視為無法讀取。 如果發生讀取錯誤,磁碟驅動器會嘗試重新讀取 ECC 區塊。 如果區塊仍然無法讀取,磁碟驅動器會中止讀取作業,並將值傳回至核心,指出區塊無法讀取。 然後核心會決定接下來要採取的步驟。 核心可以重新發出要求、完全中止讀取,或將磁碟驅動器向下旋轉並重新發出要求。
數據輸送量
DVD 磁碟驅動器的數據輸送量取決於多個因素:要求數據的位置、磁碟的清理或劃痕程度、從磁碟讀取的數據流數目、與這些數據流相關聯的緩衝區大小,以及個別磁碟驅動器的規格。 輸送量也取決於磁碟驅動器是否具有常數角度速度 (CAV) 或常數線性速度 (CLV)。 如果磁碟驅動器使用 CAV 旋轉,光碟會以相同的速度旋轉,而不論光取單位 (OPU) 位於何處。 這意味著當 OPU 接近光碟外緣時,數據軌會以更快的速度超過 OPU。使用 CLV 時,隨著 OPU 向外移動,光碟旋轉速度變慢,使數據軌以固定的速度通過 OPU。 大部分計算機中的 DVD 磁碟驅動器都使用 CLV。
當磁碟驅動器正在搜尋和變更圖層時,無法從光碟讀取數據。最好將這些作業降到最低,尤其是在讀取初始載入畫面的數據時。
浪費輸送量的範例
若要瞭解如何浪費數據輸送量,請考慮假設的硬碟和 DVD。 假設需要讀取光碟中間的檔案。 從那個磁碟區域的輸送量大約為8.25 MB/秒。如果尋道行程是一個完整行程的一半或三分之一,則平均尋道時間為150毫秒。 在此範例中,在 OPU 移動到可以讀取的時間內,原本可以讀取 1.2 MB(150 毫秒 × 8.25 MB/秒)。 新增圖層變更會將浪費的輸送量提高到 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