다음을 통해 공유


Windows 게임용 DVD 성능 최적화

Windows를 실행하는 컴퓨터의 높은 비율은 DVD 드라이브를 가지고 있으며, 많은 게임은 DVD로 제공됩니다. 따라서 게임에서 DVD 드라이브를 최대한 활용하는 것이 좋습니다. DVD에서 데이터를 읽는 방법과 데이터의 위치가 읽기 시간에 미치는 영향을 이해하면 로드 시간을 줄이고 게임 플레이 중에 전반적인 성능을 향상시킬 수 있습니다. 이 문서에서는 Windows 게임의 DVD 성능을 최적화하는 방법을 설명합니다.

DVD의 기본 레이아웃

이 그림은 DVD의 기본 레이아웃을 보여줍니다.

dvd 레이아웃

DVD의 데이터는 CD와 같이 연속 나선형으로 저장됩니다. 그러나 파일은 블록 및 섹터로 나뉩니다. 파일은 ECC(오류 수정 코드) 블록에 분산되고 각 블록은 16개의 2KB 섹터(즉, 각 블록에 32KB의 데이터)로 나뉩니다. 파일은 섹터 경계를 따라 정렬되고 섹터에서 사용되지 않는 모든 공간은 비워 집니다. 파일에 10바이트만 있으면 해당 2KB 섹터의 나머지 공간이 낭비됩니다. 따라서 가능한 경우 최상의 데이터 밀도를 얻기 위해 파일을 2KB 단위로 번들합니다. 이러한 사양은 DVD 전용이며 CD 및 HD-DVD의 사양은 서로 다릅니다.

DVD에서 읽기

DVD에서 읽는 요청을 받으면 DVD 드라이브가 실행되는 시퀀스는 다음과 같습니다.

  1. 필요한 경우 레이어 변경
  2. Seek
  3. OPU(광학 픽업 장치)에 다시 초점을 맞추어 데이터를 읽습니다.
  4. 실제 위치 확인
  5. 올바른 데이터를 찾을 때까지 조정하고 반복합니다.

드라이브 읽기 작업은 논리적 드라이브 읽기 또는 실제 드라이브 읽기인지에 따라 다르게 정량화됩니다. 논리적 드라이브 읽기는 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.25MB/초입니다. 검색 스트로크가 전체의 절반 또는 3분의 1인 경우 평균 검색 시간은 150ms입니다. 이 예제에서는 OPU를 읽을 수 있는 위치로 가져오는 데 걸리는 시간에 1.2MB(150ms × 8.25MB/초)를 읽을 수 있었습니다. 계층 변경을 추가하면 낭비된 처리량이 1.8MB(225ms× 8.25MB/초)로 증가합니다.

낭비된 처리량을 보여 주는 또 다른 예는 계층 변경 없이 CAV 드라이브에서 제대로 배치되지 않은 20개의 파일을 로드하는 것입니다. 각 파일에 대한 검색 시간과 데이터를 읽을 수 있는 대기 시간이 약 200ms인 경우 4초(20개 파일 × 200ms)는 데이터 검색에만 사용됩니다. 파일이 외부 지름에 있고 11× 속도로 읽는 경우 처리량은 평균 15.2MB/초(11 속도/12 속도 × 16MB/초)입니다. 이 예제에서 낭비되는 처리량은 약 60.8MB(15.2MB/초 × 4초)입니다.

동기적으로 읽기 및 비동기식 읽기

비동기 읽기는 동기 읽기보다 더 효율적입니다. 동기적으로 읽을 때 애플리케이션 메모리에 복사되기 전에 하나 이상의 ECC 데이터 블록이 시스템 메모리로 읽혀집니다. 반면, 비동기 읽기는 디코딩된 ECC 블록을 애플리케이션 메모리에 직접 복사하여 L2 캐시를 방지하고 CPU 오버헤드를 줄입니다. 비동기적으로 읽으려면 CreateFile 함수를 사용하여 파일을 열 때 FILE_FLAG_OVERLAPPED 플래그를 사용합니다. 또한 ReadFile 함수에는 비동기 I/O를 수행하기 위해 전달된 유효한 OVERLAPPED 구조체가 필요합니다.

비동기 I/O에 대한 자세한 내용은 동기 및 비동기 I/O에서 찾을 수 있습니다.

최적으로 읽기

DVD에서 읽는 가장 좋은 원칙은 소량의 데이터를 찾고 읽지 않는 것입니다. 읽은 데이터 양이 ECC 블록의 용량(32KB 미만)보다 작으면 나머지 블록이 낭비됩니다. 캐시 크기는 드라이브마다 다르므로 개발자는 읽기 요청에 대한 최소 데이터 양을 결정해야 하며 그보다 작게 만들지 않아야 합니다. 사용되지 않는 데이터를 읽고 디코딩하는 데 시간이 낭비되지 않도록 하려면 최소 크기는 ECC 블록의 정수 배수여야 합니다. 검색에 소요된 시간은 데이터를 읽지 않는 데 소요되는 시간이기 때문에 어떤 희생을 치르더라도 검색하지 않는 것이 중요합니다.

DVD 호환성

DVD로 릴리스할 때 알아야 할 몇 가지 중요한 호환성 문제가 있습니다. 첫째, Windows 기반 컴퓨터의 DVD 드라이브는 성능이 다를 수 있으므로 DVD에 처리량에 대한 특정 요구 사항이 있는 경우 사용자의 하드웨어가 이러한 요구 사항을 충족하는지 확인하는 것이 중요합니다. 또한 다중 계층 DVD는 일부 DVD 드라이브에서 호환성 문제를 일으킬 수 있습니다. 이러한 문제를 방지하려면 단일 레이어 DVD를 제공하거나 릴리스 전에 대부분의 드라이브에서 다중 계층 DVD를 철저히 테스트하는 것이 좋습니다.

요약

DVD 성능을 향상시키기 위해 몇 가지 일반적인 규칙을 적용할 수 있습니다. 다음 기술은 처리량을 최대화하고 낭비되는 데이터를 줄이는 데 도움이 될 수 있습니다.

  • 32KB보다 작은 읽기 방지
  • 검색을 줄이거나 제거하기 위한 데이터 배치
  • ECC 블록 경계에 데이터 배치
  • 작은 파일을 2KB 블록으로 묶어 용량을 최대화하고 DVD 섹터의 안쪽 여백 공간을 줄입니다.
  • 비동기적으로 읽어 CPU 로드 및 과도한 메모리 사용량 줄이기
  • 다층 DVD 해제 방지