장치 리소스 관리
업데이트: 2007년 11월
관리되는 모바일 Direct3D 프로그래밍에는 두 가지 기본 리소스 유형이 있습니다. 하나는 장치를 다시 설정할 때 다시 만들어야 하는 리소스이고 다른 하나는 다시 만들 필요가 없는 리소스입니다. 장치를 다시 설정할 때 다양한 개체 형식이 데이터로 채워지거나 채워지지 않을 수 있습니다. 데스크톱 컴퓨터 응용 프로그램의 Direct3D와 달리, 리소스를 만드는 데 사용되는 메모리 풀은 장치를 다시 설정할 때 리소스를 다시 만들어야 하는지 여부를 결정하는 데 영향을 주지 않습니다.
메모리 풀링
관리되는 모바일 Direct3D 프로그래밍에서 사용할 수 있는 메모리 풀에는 세 가지가 있습니다.
시스템
일반적으로 비디오 메모리를 사용하는 것보다 느린 모바일 장치의 일반 시스템 메모리에서 할당합니다.
비디오
주로 모바일 장치의 비디오 하드웨어에 사용할 메모리 영역을 할당합니다. 일부 장치에서는 비디오 메모리가 매우 제한된 리소스일 수 있습니다.
관리되는 메모리
시스템 메모리 캐시로 비디오 메모리를 할당합니다. 드라이버는 LRU(Least Recently Used) 대체 알고리즘을 비롯한 여러 알고리즘을 사용하여 캐싱 체계를 구현합니다.
관리되는 풀에 질감이나 기타 리소스를 만들면 시스템 메모리에 질감을 위한 공간이 할당됩니다. SetTexture 메서드를 사용하여 질감 단계에 할당된 질감은 비디오 메모리 풀로 업로드된 후 사용 빈도가 가장 낮은 항목이 될 때까지 보유되었다가 다른 리소스를 위한 공간을 제공하기 위해 제거됩니다. 관리되는 화면을 업로드하기 위해 비디오 메모리의 공간을 확보해야 하고 LRU 정의를 만족하는 항목이 없을 경우 드라이버는 Priority 속성을 사용하여 비디오 메모리에서 제거할 관리되는 메모리 리소스를 결정해야 합니다.
VertexBuffer, IndexBuffer 및 Texture 리소스를 관리되는 풀에 만들 수 있지만 프런트 및 백 버퍼, 깊이 버퍼 및 이미지 화면은 만들 수 없습니다.
SurfaceCaps 구조체의 인스턴스를 사용하여 리소스를 만들 때 액세스할 수 있는 메모리 풀을 결정할 수 있습니다.
모바일 장치는 다른 유형의 리소스에 대한 다른 메모리 풀을 지원할 수 있습니다. 디스플레이 드라이버는 SurfaceCaps의 SupportsManagedPool 속성을 사용하여 관리되는 리소스 풀에 대한 지원 여부를 나타냅니다. 이 속성이 true이면 장치는 VertexBuffer, IndexBuffer 및 Texture 리소스에 대해 관리되는 풀을 지원합니다. 응용 프로그램은 드라이버가 관리되는 풀을 지원하지 않을 경우 관리되는 풀에서 화면을 만들 수 없습니다. 장치가 질감에 대한 시스템 및 비디오 메모리 풀을 모두 지원하는 경우 응용 프로그램이 UpdateTexture 메서드를 사용하여 고유한 메모리 캐싱 체계를 구현할 수 있습니다.
또한 응용 프로그램은 Resource의 PreLoad 메서드를 사용하여 강제로 화면을 비디오 메모리로 미리 로드할 수 있습니다. 이 메서드를 사용하면 필요한 바이트가 삭제되고 화면이 즉시 로드됩니다.
마지막으로 응용 프로그램은 Device의 ResourceManagerDiscardBytes 메서드를 사용하여 관리되는 리소스가 지정된 바이트 수를 강제로 삭제하도록 할 수 있습니다. 이 메서드는 삭제할 바이트 수를 인수로 받아들입니다. 응용 프로그램이 이 인수로 0을 전달하면 비디오 메모리에서 관리되는 모든 바이트가 삭제됩니다.
리소스 관리자를 제어하는 모든 메서드가 즉시 작동됩니다. 이 메서드는 명령 버퍼에 버퍼링되지 않으며 장치에서 관리되는 풀을 지원하지 않을 경우 실패합니다.
개체 인스턴스 및 수명
장치 다시 설정 작업을 관리하고 인덱스 버퍼나 꼭지점 버퍼를 사용할 경우 개체가 적절한 수명으로 만들어지도록 알맞은 생성자를 사용해야 합니다.
Windows Mobile Direct3D에서는 Smartphone이나 Pocket PC에서 한 번에 하나의 Device 인스턴스만 지원합니다. 동일한 Pocket PC 또는 Smartphone에서 다른 Windows Mobile Direct3D 응용 프로그램을 시작할 수 있도록 Manager의 ReleaseD3DMobile 정적 메서드를 사용하여 모든 Direct3D 장치 리소스를 제거할 수 있습니다.
다음 개체는 Device가 다시 설정될 때 다시 만들어야 합니다. 이 작업은 DeviceReset 이벤트에 대한 이벤트 처리기에서 수행할 수 있습니다.
Texture 개체
Mesh 개체
Surface 개체
VertexBuffer(Device, Int32, Usage, VertexFormats, Pool) 생성자를 사용하여 만든 VertexBuffer 개체
IndexBuffer(Device, Int32, Usage, Pool, Boolean) 생성자를 사용하여 만든 IndexBuffer 개체
다음 개체는 Device가 다시 설정될 때 다시 만들 필요가 없습니다.
Font 개체
Sprite 개체
VertexBuffer(Type, Int32, Device, Usage, VertexFormats, Pool) 생성자를 사용하여 만든 VertexBuffer 개체
IndexBuffer(Type, Int32, Device, Usage, Pool) 생성자를 사용하여 만든 IndexBuffer 개체
Font 및 Sprite 개체는 장치가 다시 설정될 때 필요한 모든 작업을 자동으로 수행합니다.
IndexBuffer 및 VertexBuffer 개체는 장치가 다시 설정될 때 자체적으로 다시 만들어지지만 데이터를 포함하지는 않습니다. IndexBuffer.Created 이벤트 또는 VertexBuffer.Created 이벤트에 대한 이벤트 처리기를 정의하여 장치가 다시 설정된 후에 인덱스 또는 꼭지점 버퍼를 데이터로 채울 수 있습니다.