次の方法で共有


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 ブロックを読み取ります。 このプロセスは、ドライブ キャッシュが入力されるか、すべての要求が満たされるまで繰り返されます。 その後、カーネルはドライブ キャッシュからデコードされたデータを読み取ります。 その後、キャッシュがフラッシュされ、読み取り要求が残っている場合は、次の読み取り操作が開始されます。

Note

キャッシュされていない読み取りはすべて、ドライブ キャッシュをフラッシュします。

 

エラーの読み取り

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 ミリ秒です。 この例では、1.2 MB (150 ms × 8.25 MB/秒) が読み取られた時点で、OPU を読み取ることができる場所に取得するだけで済みます。 レイヤーの変更を追加すると、無駄なスループットが 1.8 MB (8.25 MB/秒× 225 ミリ秒) に上がります。

無駄なスループットを示すもう 1 つの例は、レイヤーを変更しない CAV ドライブから 20 個の不適切な場所にあるファイルを読み込む場合です。 各ファイルのシーク時間とデータを読み取る前の待機時間が約 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 関数では、非同期 I/O を実行するために、有効な 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 のリリースを避ける