Share via


Windows ゲームの DVD パフォーマンスの最適化

ゲーム ディベロッパー グループ

2006 年 4 月

はじめに

今日では、Microsoft® Windows® を実行しているコンピューターのほとんどに DVD ドライブが搭載されており、多くの新作ゲームが DVD でリリースされています。このため、開発者は DVD ドライブを十分に活用するゲームを作成することが重要です。DVD からデータがどのように読み取られて、データの位置によってどのように読み取り時間が変化するのかを理解することで、データの読み込み時間を短縮して、ゲーム プレイ中の全体的なパフォーマンスを向上させることができます。

DVD の基本的なレイアウト

Bb147246.DVDsector(ja-jp,VS.85).png

DVD 上のデータは、CD と同様にらせん状に連続して記録されていますが、ファイルはブロックとセクターに分割されています。ファイルは、複数のエラー訂正コード (ECC) ブロックにまたがっており、各ブロックは 16 個の 2 KB セクターに分割されます (したがって各ブロック内のデータは 32 KB)。ファイルはセクター境界に沿って配置され、セクター内の未使用スペースは空き状態のままになります。ファイルが 10 バイトしかない場合は、その 2 KB セクターの残りのスペースは無駄になるため、小さいファイルどうしをできる限り 2 KB の単位にまとめて、データ密度を最大限に高めてください。なお、これらの仕様は DVD 専用であり、CD や HD-DVD の仕様は異なっています。

DVD からの読み取り

DVD ドライブが DVD の読み取り要求を受け取ると、次の順序で処理が実行されます。

  1. 必要に応じてレイヤーを変更します。
  2. シークします。
  3. データを読み取る光ピックアップ装置 (OPU) の焦点を合わせ直します。
  4. 実際の位置を確認します。
  5. 正しいデータが見つかるまで調整を繰り返します。

ドライブの読み取り処理は、論理ドライブ読み取りなのか物理ドライブ読み取りなのかに応じて、異なる形で量子化されます。論理ドライブ読み取りでは整数の数の DVD セクターしか読み取れないのに対して、物理 DVD 読み取りでは整数の数の ECC ブロックしか読み取れません。一般に、物理ドライブは読み取り要求を受け取り、そのキャッシュを埋めようとします。DVD ドライブのキャッシュ サイズは、個々のドライブの仕様によって異なります。

DVD ドライブがキャッシュ サイズを超える読み取り要求を受け取ると、その要求はキャッシュと同じサイズの複数の要求に分割されます。ドライブは、要求の最初のセクターが含まれた ECC ブロックをシークして、この ECC ブロック全体を読み取ります。ドライブのファームウェアは、ECC ブロックをデコードしてから、次の ECC ブロックを読み取ります。このプロセスは、ドライブ キャッシュがいっぱいになるかすべての要求が処理されるまで繰り返されます。その後でカーネルが、デコードされたデータをドライブ キャッシュから読み取ります。次に、キャッシュをフラッシュして、読み取り要求が残っている場合は次の読み取り操作を開始します。

    キャッシュされない読み取りが発生するたびに、ドライブ キャッシュがフラッシュされます。

読み取りエラー

DVD や DVD ドライブは完全ではないため、読み取り時にエラーが発生することがあります。CD と同様に、DVD の一部が、ほこりやキズが原因で読み取り不能になることがあります。ブロックの一部が読み取り不能になった場合は、そのブロック全体が読み取り不能と見なされます。読み取りエラーが発生した場合、ドライブは ECC ブロックの再読み取りを試行します。ブロックが依然として読み取り不能な場合は、ドライブは読み取り操作を中止して、そのブロックが読み取り不能であったことを示す値をカーネルに渡します。カーネルは、次に実行する処理を決定します。カーネルは、同じ要求を再発行するか、読み取り全体を中止するか、ドライブの回転速度を下げてから同じ要求を再発行することができます。

データ スループット

DVD ドライブのデータ スループットは、複数の要因によって左右されます。これらの要因としては、要求されたデータの位置、ディスク面の汚れやキズの程度、ディスクから読み取られるストリームの数、ストリームに関連付けられたバッファーのサイズ、個々のドライブの仕様などが挙げられます。スループットは、ドライブが角速度一定 (CAV) 方式なのか線速度一定 (CLV) 方式なのかによっても左右されます。ドライブが CAV 方式の場合は、光ピックアップ装置 (OPU) の位置にかかわらず、ディスクは同じ速度で回転します。つまり、OPU がディスクの外周に近づくほど、OPU がデータ トラック上を移動する速度は高まります。CLV 方式の場合は、OPU が外周に近づくほどディスクの回転速度は低下するため、OPU がデータ トラック上を移動する速度は一定に保たれます。ほとんどの PC の DVD ドライブは CLV 方式を採用しています。

ドライブがシーク中やレイヤー変更中のときは、データをディスクから読み取ることはできません。したがって、特に初期読み込み画面のデータの読み取りでは、これらの操作を最小限に抑えることが望まれます。

スループットの損失の例

データ スループットの損失が生じる原因を理解するために、仮想ドライブと DVD について考えてみます。ディスクの中ほどにあるファイルを読み取る必要があると想定しましょう。そのディスク領域からの読み取りスループットは、約 8.25 MB/秒です。シーク ストロークが全長の半分または 3 分の 1 の場合は、平均シーク時間は 150 ミリ秒です。この例では、OPU を読み取り可能な位置に移動するだけの時間で、1.2 MB (150 ミリ秒 × 8.25 MB/秒) を読み取れていたことになります。レイヤー変更を行う場合は、スループットの損失は 1.8 MB に増えます (225 ミリ秒 × 8.25 MB/秒)。

スループットの損失のもう 1 つの例として、ばらばらに配置された 20 個のファイルをレイヤー変更なしで CAV 方式のドライブから読み込む場合を考えてみましょう。各ファイルのシーク時間と、データが読み取り可能になるまでの待ち時間の合計が約 200 ミリ秒の場合は、データをシークするだけで約 4 秒 (20 ファイル × 200 ミリ秒) かかることになります。これらのファイルが外周付近に配置されており、11 倍の速度で読み取られる場合は、平均スループットは 15.2 MB/秒になります (11 倍速/12 倍速 × 16 MB/秒)。この例では、スループットの損失は約 60.8 MB (15.2 MB/秒 × 4 秒) になります。

同期読み取りと非同期読み取り

非同期読み取りは、同期読み取りより効率的です。同期読み取りでは、1 つまたは複数の ECC データ ブロックがシステム メモリーに読み込まれてから、アプリケーション メモリーにコピーされます。これに対して、非同期読み取りでは、デコードされた ECC ブロックがアプリケーション メモリーに直接コピーされるため、L2 キャッシュが使用されず CPU の負担が軽減されます。非同期読み取りを行うには、CreateFile 関数を使用してファイルを開く際に、FILE_FLAG_OVERLAPPED フラグを使用します。非同期入出力を実行するためには、ReadFile 関数にも有効な OVERLAPPED 構造体を渡す必要があります。

非同期入出力の詳細については、Synchronous and Asynchronous I/O を参照してください。

読み取りの効率化

DVD の読み取りを効率化するために重要なことは、シーク操作および少量データの読み取りを避けることです。読み取るデータ量が ECC ブロックの容量 (32 KB) より少ない場合は、ブロックの残り部分は無駄になります。キャッシュ サイズはドライブごとに異なるため、ゲームの開発者は、読み取り要求できる最小データ量を決定して、それを下回らないようにする必要があります。この最小サイズは ECC ブロック容量の整数倍にする必要があります。これにより、使用しないデータの読み取りやデコードに時間を費やすのを防止できます。もう 1 つの重要な点として、シーク操作はできる限り排除してください。シーク時間中にはデータを読み取ることができません。

DVD の互換性

DVD でリリースする場合は、いくつかの重要な互換性問題について認識しておく必要があります。1 つ目に、Windows ベース コンピューターの DVD ドライブはパフォーマンスにばらつきがあるため、リリースする DVD に特定のスループット要件がある場合は、ユーザーのハードウェアがこれらの要件を満たしていることを確認する必要があります。また、多層式 DVD は、一部の DVD ドライブで互換性問題をもたらす可能性があります。このような問題を回避するには、単層式 DVD を採用するか、多層式 DVD をリリース前に大部分のドライブで十分にテストしてください。

まとめ

DVD のパフォーマンスを高めるには、いくつかの原則に従う必要があります。次の技法は、スループットを最大化して無駄なデータを低減するのに役立ちます。

  • 32 KB 未満のデータの読み取りは避けます。
  • シーク操作を削減または省略できるようにデータを配置します。
  • データを ECC ブロックの境界に沿って配置します。
  • 小さいファイルどうしを 2 KB のブロックにまとめることで容量の浪費をなくして、DVD セクター内のパディング スペースを縮小します。
  • 非同期読み取りを行うことで、CPU の負荷や過剰なメモリー使用を低減します。
  • 多層式 DVD でリリースすることは避けます。