矩形内存分配

每当给定堆中所有图面的间距固定为特定大小时,显示内存都被视为 矩形

使用矩形显示内存时,布局是二维的,宽度和高度有限。 此宽度并不总是与屏幕宽度相同。 由于显示内存必须考虑不同的显示分辨率和设计注意事项,因此实际水平宽度可能比监视器上当前显示的区域要大得多。 如内存堆分配中所述,间距值基于要添加到显示内存列的字节数,以便访问以下扫描行上的同一列显示内存。

例如,即使屏幕可能跨度为 640 像素,如果矩形显示内存为 1280 字节,8 位像素,则间距为 1280 (不是 640) 。 具有 16 位像素的 1280 像素水平内存段的间距为 2560。 32 位像素的间距是 8 位像素的四倍,因此,如果显示器的间距为 1280 32 位像素,则间距为 5120。

与线性内存相比,应用程序通常使用矩形内存的效率较低,因为在应用程序存储大图面后可能会保留小片段。 即使剩余空间中的可用字节数大于任何新图面所需的数目,应用程序也可能无法将其他图面存储在剩余空间中。 应用程序可以先到先得的方式访问此空间,并且只能存储适合剩余片段的小图面。

矩形堆的大小可以与可用内存的连续区域一样大,但它不能为 L 形,因为它的大小以 X 和 Y 坐标度量。 如果矩形堆不够高,不够宽,不足以容纳主图面,则它不能是后台缓冲区。 如果主图面的间距不等于主图面的显示宽度,则显示概念右侧的矩形内存块将保留在下图) (堆 1 上。 此块的宽度与间距减去显示器宽度一样。 如果现有显示驱动程序采用固定间距,则右侧的剩余内存也可能出现在线性卡中。 矩形或线性内存也可能保留在主图面 (下方,但在此示例中) 。

下图演示了矩形内存分配。

说明使用主图面、堆和剩余内存分配矩形内存的关系图。

在上图中,矩形堆的 VIDEOMEMORY 结构的 fpStart 成员) 的起始点 (通过将主图面的宽度添加到主图面的起始地址来计算。 宽度和高度也进行计算,以给出矩形堆的尺寸。 如果任何内存保留在 Windows 缓存下方,则可在那里创建一个堆。

以下伪代码演示如何为矩形内存设置 VIDEOMEMORY 结构:

/*
 * video memory pool usage
 */
static VIDEOMEMORY vidMem [] = {
    { VIDMEM_ISRECTANGULAR, 0x00000000, 0x00000000,
           { 0 }, { 0 } },
};

矩形内存的代码与其线性对应项之间的唯一区别是VIDMEM_ISRECTANGULAR标志,它指示这是矩形内存

以下伪代码演示如何设置矩形内存堆:

/*
 * video memory pool information
 */

/* set up the pointer to the first available video memory after the primary surface */
    ddHALInfo.vmiData.pvmList      = vidMem;

/* this is set to zero because there may only be one heap depending on the pitch 
    ddHALInfo.vmiData.dwNumHeaps      = 0; 


/*
 *  Compute the Pitch here ...
 */


    vidMem[0].fpStart  = ddHALInfo.vmiData.fpPrimary + dwPrimarySurfaceWidth;
    vidMem[0].dwWidth  = dwPitch - dwPrimarySurfaceWidth;
    vidMem[0].dwHeight = dwPrimarySurfaceHeight;
    vidMem[0].ddsCaps.dwCaps = 0;      // surface has no use restrictions

内存堆起点设置为主图面的起始地址加上主图面的宽度。 宽度由间距减去主图面的宽度决定。 高度设置为主图面的高度。 图面功能设置为零,表示 (没有施加的图面使用限制,因此,图面可用于子画面或任何其他类型的表面) 。