선형 메모리 할당
디스플레이 메모리는 다음 그림과 같이 맞춤 요구 사항을 고려하여 표면 너비에 맞게 피치를 변경할 수 있을 때마다 선형 으로 간주됩니다. 예를 들어 Blitter가 8비트 보폭에만 도달할 수 있고 31픽셀 스프라이트를 사용하는 경우 각 디스플레이 줄을 1씩 조정하여 다음 줄을 8 바이트 경계에 맞춥니다.
피치는 맞춤 요구 사항을 고려하여 픽셀 깊이(바이트)를 표면 너비로 곱하여 결정됩니다. 디스플레이가 640 8비트 픽셀인 경우 피치는 640입니다. 픽셀이 16비트(2바이트)이고 640 X 480 화면이 있는 경우 피치는 1280(640 * 2)입니다. 마찬가지로 너비 640, 32비트(4바이트) 픽셀 화면의 피치는 선형 디스플레이 메모리에서 2560(640 * 4)입니다.
다음 다이어그램에서는 기본 표면 하나와 스크래치 영역 1개를 사용하여 선형 메모리 힙 할당을 보여 줍니다.

기본 표면의 시작 부분에 대한 포인터는 VIDEOMEMORYINFO 구조체의 멤버인 fpPrimary입니다. VIDEOMEMORY 구조체의 fpStart 멤버가 나타내는 스크래치 영역의 시작 부분에 대한 포인터를 제공하기 위해 기본 표면 및 다양한 Windows 캐시의 크기가 여기에 추가됩니다. VIDEOMEMORY 구조의 fpEnd 멤버로 표시된 끝점은 나머지 메모리의 크기를 1에서 뺀 값을 추가하여 계산됩니다.
VIDEOMEMORY 구조는 디스플레이 메모리 힙을 관리하는 정보를 보유합니다. 이 샘플에는 하나의 힙만 있기 때문에 VIDEOMEMORY 구조 배열에 하나의 요소만 있습니다. videoMEMORY 구조체의 dwFlags 멤버에 있는 플래그인 VIDMEM_ISLINEAR 이를 선형 메모리로 표시합니다.
다음 의사 코드는 선형 메모리에 대해 VIDEOMEMORY 구조가 설정되는 방법을 보여 줍니다.
/*
* video memory pool usage
*/
static VIDEOMEMORY vidMem [] = {
{ VIDMEM_ISLINEAR, 0x00000000, 0x00000000,
{ 0 }, { 0 } },
};/*
다음 의사 코드는 선형 메모리 힙을 설정하는 방법을 보여 줍니다.
/*
* video memory pool information
*/
/* Calculate the number of video memory heaps */
ddHALInfo.vmiData.dwNumHeaps = sizeof ( vidMem ) / sizeof ( vidMem [ 0 ] );
/* set up the pointer to the first available video memory after the primary surface */
ddHALInfo.vmiData.pvmList = vidMem;
/*
* remainder of screen memory
*/
VideoHeapBase = ddHALInfo.vmiData.fpPrimary + dwPrimarySurfaceSize + dwCacheSize;
VideoHeapEnd = VideoHeapBase + dwDDOffScreenSize - 1;
vidMem[ 0 ].fpStart = VideoHeapBase;
vidMem[ 0 ].fpEnd = VideoHeapEnd;
사용 가능한 첫 번째 스크래치 영역의 시작은 기본 표면의 크기와 Windows 브러시, 펜 및 VDD 캐시의 크기에 GDI 기본 표면의 시작을 추가하여 계산됩니다. 결과는 VIDEOMEMORY 구조체의 첫 번째 요소에서 시작점을 스크래치 영역의 시작 부분으로 설정하는 데 사용됩니다.
스크래치 영역의 끝은 스크래치 영역의 크기에 스크래치 영역의 시작을 추가하고 포함되도록 1을 빼서 발견됩니다. 결과는 VIDEOMEMORY 구조체의 첫 번째 요소(및 이 경우만 해당) 요소의 끝점을 스크래치 영역의 끝으로 설정하는 데 사용됩니다. 둘 이상의 힙이 있는 경우 끝점은 이 힙의 끝으로 설정되고 다음 힙은 이 힙이 종료되는 위치에서 시작됩니다.