다음을 통해 공유


Surface 메모리 직접 액세스(Direct3D 9)

IDirect3DSurface9::LockRect 메서드를 사용하여 표면 메모리에 직접 액세스할 수 있습니다. 이 메서드를 호출할 때 pRect 매개 변수는 직접 액세스하기 위해 표면의 사각형을 설명하는 RECT 구조체에 대한 포인터입니다. 전체 표면이 잠기도록 요청하려면 pRect를 NULL로 설정합니다. 또한 표면의 일부만 포함하는 RECT 를 지정할 수 있습니다. 두 개의 사각형이 겹치지 않으면 두 스레드 또는 프로세스가 동시에 표면의 여러 사각형을 잠글 수 있습니다. 다중 샘플 백 버퍼는 잠글 수 없습니다.

IDirect3DSurface9::LockRect 메서드는 표면 메모리에 제대로 액세스하기 위한 모든 정보로 D3DLOCKED_RECT 구조를 채웁니다. 구조체에는 피치에 대한 정보가 포함되며 잠긴 비트에 대한 포인터가 있습니다. Surface 메모리에 대한 액세스를 마치면 IDirect3DSurface9::UnlockRect 메서드를 호출하여 잠금을 해제합니다.

표면이 잠겨 있는 동안 내용을 직접 조작할 수 있습니다. 다음 목록에서는 표면 메모리를 직접 렌더링하는 일반적인 문제를 방지하기 위한 몇 가지 팁을 설명합니다.

  • 상수 디스플레이 피치를 가정하지 마세요. IDirect3DSurface9::LockRect 메서드에서 반환된 피치 정보를 항상 검사합니다. 이 피치는 표면 메모리의 위치, 디스플레이 카드 유형 또는 Direct3D 드라이버 버전 등 다양한 이유로 달라질 수 있습니다. 자세한 내용은 너비 및 피치(Direct3D 9)를 참조하세요.
  • 잠금 해제된 표면에 복사해야 합니다. 잠긴 표면에서 호출되면 Direct3D 복사 메서드가 실패합니다.
  • 표면이 잠겨 있는 동안 애플리케이션의 활동을 제한합니다.
  • 항상 메모리를 표시하도록 정렬된 데이터를 복사합니다. Windows 98은 페이지 오류 처리기인 Vflatd.386을 사용하여 뱅크 스위치 메모리가 있는 디스플레이 카드에 대한 가상 플랫 프레임 버퍼를 구현합니다. 처리기를 사용하면 이러한 디스플레이 디바이스가 Direct3D에 선형 프레임 버퍼를 표시할 수 있습니다. 메모리를 표시하도록 정렬되지 않은 데이터를 복사하면 복사가 메모리 뱅크에 걸쳐 있는 경우 시스템이 작업을 일시 중단할 수 있습니다.
  • IDirect3DDevice9::CreateOffscreenPlainSurface를 사용하여 만든 동적 텍스처 또는 표면이 아니면 D3DPOOL_DEFAULT 메모리 풀에 할당된 리소스에 속하는 표면은 잠기지 않을 수 있습니다. IDirect3DDevice9::GetBackBufferIDirect3DSwapChain9::GetBackBuffer 메서드를 사용하여 액세스할 수 있는 백 버퍼 표면은 D3DPRESENTFLAG_LOCKABLE_BACKBUFFER 포함하기 위해 D3DPRESENT_PARAMETERS Flags 멤버를 사용하여 스왑 체인을 만든 경우에만 잠글 수 있습니다.

Direct3D Surface