표면 메모리에 직접 액세스하기
표면 메모리에 직접 액세스 하려면 ,IDirect3DSurface9::LockRect 메서드를 사용한다. 이 메서드를 호출하는 경우,pRect 파라미터는, 직접 액세스 하려고 하는 표면 위에의 직사각형을 기술하는 RECT 구조체의 포인터로 한다. 표면 전체를 잠그려면 ,pRect 를 NULL 로 설정한다. 또, 표면의 일부만을 커버하는 RECT 를 지정할 수도 있다. 2 개의 직사각형이 겹치지 않으면, 2 개의 thread 또는 2 개의 프로세스는, 표면의 복수의 직사각형을 동시에 잠글 수가 있다. 멀티 샘플 백 버퍼는 잠글 수 없는 것에 주의 해야 한다.
IDirect3DSurface9::LockRect 메서드는, 표면 메모리에 올바르고 액세스 하기 위해서 필요한 모든 정보를,D3DLOCKED_RECT 구조체에 저장 한다. 이 구조체에는,피치에 관한 정보가 포함되어 있어 잠금 되고 있는 비트의 포인터가 있다. 표면 메모리에의 액세스가 종료 하면,IDirect3DSurface9::UnlockRect 메서드를 호출해, 잠금을 해제한다.
표면을 잠그고 있는 동안, 그 컨텐츠를 직접 조작할 수 있다. 표면 메모리를 직접 렌더링 할 때의 일반적인 문제를 피하기 위한 힌트를, 이하의 리스트로 가리킨다.
- 일정한 디스플레이 피치를 가정하지 않는다. 항상,IDirect3DSurface9::LockRect 메서드가 돌려주는 피치 정보를 조사하는 것. 이 피치는, 표면 메모리의 위치, 디스플레이 카드의 타입, Microsoft® Direct3D® 드라이버의 버전 등, 다양한 이유에 의해 변화한다. 더 자세한 정보는, 「폭과 피치」를 참조할것.
- 복사 할 때는, 복사처의 표면의 잠금이 해제되고 있는 것을 확인하는 것. 잠금 되고 있는 표면에 대해서 Direct3D 의 복사 메서드를 호출하면 실패한다.
- 표면이 잠금 되고 있는 동안, 애플리케이션의 동작은 제한된다.
- 반드시, 디스플레이 메모리에 대해서 연속하는 데이터를 복사 하는 것. Microsoft Windows® 98 에서는, 페이지 폴트 핸들러 Vflatd. 386 을 사용해, 뱅크 스위치 메모리를 사용한 디스플레이 카드에 대한 가상 플랫 frame buffer를 처리 한다. 이 핸들러에 의해, 이러한 디스플레이 장치는 Direct3D 에 연속한 frame buffer를 건네줄 수가 있다. 디스플레이 메모리에 대해서 불연속의 데이터를 복사 하면, 복사가 메모리 뱅크에 스팬 하는 경우에, 시스템이 일시정지를 일으킬 가능성이 있다.
- 동적 텍스처 및 IDirect3DDevice9::CreateOffscreenPlainSurface 를 사용해 생성 된 표면을 제외해, D3DPOOL_DEFAULT 메모리 풀에 할당된 리소스에 속하는 표면은, 잠글 수 없는 경우가 있다. 백 버퍼 표면 (IDirect3DDevice9::GetBackBuffer 및 IDirect3DSwapChain9::GetBackBuffer 메서드를 사용해 액세스 할 수 있다)를 잠글 수 있는 것은, 스왑 체인이 D3DPRESENTFLAG_LOCKABLE_BACKBUFFER 를 포함하도록(듯이) D3DPRESENT_PARAMETERS 구조체의 Flags 멤버를 사용해 생성 되고 있는 경우 뿐이다.