혼합 메모리 할당
하드웨어에서 지원하는 경우 선형 및 사각형 메모리 힙을 혼합하여 어떤 방식으로든 일치시킬 수 있습니다. 예를 들어 프런트 버퍼에 고정 피치가 있는 경우 DirectDraw 지원 드라이버는 직사각형 힙을 오른쪽에 할당할 수 있습니다.
다음 그림과 같이 충분한 메모리가 주 표면 아래에 남아 있으면 이 영역을 백 버퍼에 사용할 수 있는 선형 힙으로 만들 수 있습니다.

앞의 그림은 기본 표면(힙 1) 아래의 선형 메모리 조각과 DirectDraw가 주 표면 오른쪽(힙 2)에 의해 회수되는 사각형 메모리 부분을 보여 줍니다.
다음 의사 코드는 선형 및 사각형 메모리의 혼합을 위해 VIDEOMEMORY 구조가 설정되는 방법을 보여 줍니다.
/*
* video memory pool usage
*/
static VIDEOMEMORY vidMem [] =
{
{ VIDMEM_ISRECTANGULAR, 0x00000000, 0x00000000,
{ 0 }, { 0 } },
{ VIDMEM_ISLINEAR, 0x00000000, 0x00000000,
{ 0 }, { 0 } },
};
이 인스턴스에서는 디스플레이 메모리의 두 영역을 할당할 수 있습니다. 기본 표면의 개념적 오른쪽 영역은 반드시 직사각형이며 VIDMEM_ISRECTANGULAR 플래그로 표시됩니다. 주 표면 아래의 영역은 개념적으로 선형일 수 있으며 VIDMEM_ISLINEAR 플래그로 표시됩니다.
다음 의사 코드는 선형 및 사각형 메모리 힙을 혼합하여 설정하는 방법을 보여 줍니다.
/*
* video memory pool information
*/
/* set up the pointer to the first available video memory after the primary surface */
ddHALInfo.vmiData.pvmList = vidMem;
/* how many heaps are there
ddHALInfo.vmiData.dwNumHeaps = 2;
/* The linear piece: */
/*
* remainder of screen memory
*/
VideoHeapBase = ddHALInfo.vmiData.fpPrimary + dwPrimarySurfaceSize
+ dwCacheSize;
VideoHeapEnd = VideoHeapBase + dwDDOffScreenSize - 1;
vidMem[0].fpStart = VideoHeapBase;
vidMem[0].fpEnd = VideoHeapEnd;
/* The rectangular piece: */
/* set up the pointer to the next available video memory */
ddHALInfo.vmiData.pvmList = vidMem[1];
/*
* Compute the Pitch here ...
*/
vidMem[1].fpStart = ddHALInfo.vmiData.fpPrimary +
dwPrimarySurfaceWidth;
vidMem[1].dwWidth = dwPitch - dwPrimarySurfaceWidth;
vidMem[1].dwHeight = dwPrimarySurfaceHeight;
vidMem[1].ddsCaps.dwCaps = 0; // surface has no use restrictions
선형 메모리 힙은 선형 VIDEOMEMORY 구조체(vidMem[0])의 fpStart 및 fpEnd 멤버로 표시된 기본 표면 아래의 스크래치 영역의 시작점과 끝점을 결정하여 설정됩니다. 사각형 조각은 직사각형 VIDEOMEMORY 구조체(vidMem[1])의 fpStart 멤버로 표시된 시작점, dwWidth 멤버로 표시된 너비 및 주 표면의 dwHeight 멤버로 표시된 높이를 사용하여 설정됩니다. 사각형 조각을 설정하려면 먼저 피치( dwPitch 멤버)를 계산해야 합니다. 이는 이전 사각형 예제와 동일합니다. 단, 이 경우 피치는 첫 번째가 아닌 VIDEOMEMORY 구조체의 두 번째 요소입니다. 각 새 힙에는 새 VIDEOMEMORY 구조가 필요합니다.
경우에 따라 대칭 이동 레지스터는 256KB 경계만 처리할 수 있습니다. 이러한 경우 작은 힙은 캐시의 아래쪽과 백 버퍼의 시작 사이의 공간을 사용하여 백 버퍼가 256KB 경계에서 시작되도록 할 수 있습니다. 이 예제는 표시되지 않지만 VIDEOMEMORY 구조에 다른 요소를 추가하고 256KB 경계 바로 앞의 캐시 및 끝점 바로 앞의 시작점을 설정하여 구현할 수 있습니다. 이러한 힙은 힙 관리자가 백 버퍼를 검색할 때 건너뛸 수 있도록 DDSCAPS_BACKBUFFER 플래그를 지정해야 합니다. 이 백 버퍼 힙(정렬된 버퍼 힙)도 DDSCAPS_OFFSCREENPLAIN 표시되어 스프라이트와 텍스처가 이 힙을 사용하지 못하게 하며, 다른 힙에서는 오프스크린 일반 표면용으로 다른 메모리를 사용할 수 없습니다.