矩形内存分配
每当给定堆中所有图面的间距固定为特定大小时,显示内存都被视为 矩形 。
使用矩形显示内存时,布局是二维的,宽度和高度有限。 此宽度并不总是与屏幕宽度相同。 由于显示内存必须考虑不同的显示分辨率和设计注意事项,因此实际水平宽度可能比监视器上当前显示的区域要大得多。 如内存堆分配中所述,间距值基于要添加到显示内存列的字节数,以便访问以下扫描行上的同一列显示内存。
例如,即使屏幕可能跨度为 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
内存堆起点设置为主图面的起始地址加上主图面的宽度。 宽度由间距减去主图面的宽度决定。 高度设置为主图面的高度。 图面功能设置为零,表示 (没有施加的图面使用限制,因此,图面可用于子画面或任何其他类型的表面) 。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈