IDirect3DSurface9::LockRect 메서드를 사용하여 표면 메모리에 직접 액세스할 수 있습니다. 이 메서드를 호출할 때 pRect 매개 변수는 직접 액세스하기 위해 표면의 사각형을 설명하는 RECT 구조체에 대한 포인터입니다. 전체 표면을 잠그도록 요청하려면 pRect를 NULL설정합니다. 또한 표면의 일부만 포함하는 RECT 지정할 수 있습니다. 두 개의 사각형이 겹치지 않는 경우 두 개의 스레드 또는 프로세스가 동시에 표면의 여러 사각형을 잠글 수 있습니다. 다중 샘플 백 버퍼는 잠글 수 없습니다.
IDirect3DSurface9::LockRect 메서드는 표면 메모리에 제대로 액세스하기 위해 모든 정보로 D3DLOCKED_RECT 구조를 채웁니다. 구조체는 피치에 대한 정보를 포함하고 있으며, 잠긴 비트에 대한 포인터를 가지고 있습니다. Surface 메모리에 대한 액세스를 마치면 IDirect3DSurface9::UnlockRect 메서드를 호출하여 Surface 메모리의 잠금을 해제하십시오.
화면이 잠겨 있는 동안 내용을 직접 조작할 수 있습니다. 다음 목록에서는 Surface 메모리를 직접 렌더링하는 일반적인 문제를 방지하기 위한 몇 가지 팁을 설명합니다.
- 상수 디스플레이 피치를 가정하지 마세요. 항상 IDirect3DSurface9::LockRect 메서드에서 반환된 피치 정보를 검사합니다. 이 피치는 표면 메모리의 위치, 디스플레이 카드 유형 또는 Direct3D 드라이버의 버전을 포함하여 여러 가지 이유로 달라질 수 있습니다. 자세한 내용은 Width와 피치(Direct3D 9)참조하세요.
- 잠금 해제된 표면에 복사해야 합니다. 잠긴 화면에서 호출되는 경우 Direct3D 복사 메서드가 실패합니다.
- 표면이 잠겨 있는 동안 애플리케이션의 작업을 제한합니다.
- 항상 디스플레이 메모리에 맞게 정렬된 데이터를 복사합니다. Windows 98에서는 페이지 오류 처리기인 Vflatd.386을 사용하여 뱅크 전환 메모리가 있는 디스플레이 카드에 대한 가상 플랫 프레임 버퍼를 구현합니다. 이 처리기를 사용하면 이러한 디스플레이 디바이스가 Direct3D에 선형 프레임 버퍼를 표시할 수 있습니다. 메모리를 표시하도록 정렬되지 않은 데이터를 복사하면 복사가 메모리 뱅크에 걸쳐 있는 경우 시스템이 작업을 일시 중단할 수 있습니다.
- 동적 텍스처 또는 IDirect3DDevice9::CreateOffscreenPlainSurface사용하여 만든 표면이 아니면 D3DPOOL_DEFAULT 메모리 풀에 할당된 리소스에 속하는 경우 표면이 잠글 수 없습니다. IDirect3DDevice9::GetBackBuffer 및 IDirect3DSwapChain9::GetBackBuffer 메서드를 사용하여 액세스할 수 있는 백 버퍼 표면은 D3DPRESENT_PARAMETERS의 Flags 멤버에 D3DPRESENTFLAG_LOCKABLE_BACKBUFFER를 포함하는 경우에만 스왑 체인을 생성하여 잠글 수 있습니다.
관련 항목