创建和销毁 DirectDraw 图面

直接绘制图面是在四阶段过程中创建的。 这些阶段包括:

  1. DdCanCreateSurface。 运行时调用驱动程序的 DdCanCreateSurface ,以查看驱动程序是否允许创建此类型、大小和格式的图面。 驱动程序可以返回传播到应用程序的失败代码。

  2. DdCreateSurface。 驱动程序创建图面,可能为图面的内容分配内存。 只需调用 DdCreateSurface 即可一次性创建复杂图面。 因此,驱动程序可能需要在一次调用中创建多个图面。

  3. 内存分配。 DirectDraw 运行时为驱动程序未分配的任何图面分配内存以响应 DdCreateSurface 调用。 以下部分更详细地介绍了此过程。

  4. D3dCreateSurfaceEx. 此函数将句柄与有问题的图面相关联,供以后在 DirectXD3dDrawPrimitives2 令牌流中使用。 驱动程序还会创建自己的由 DirectDraw 维护的图面结构的副本。 有关 D3dCreateSurfaceEx 的详细信息,请参阅 DirectX 驱动程序开发工具包 (DDK) 文档。

注意 DirectDraw 驱动程序不得直接为 surface (分配用户模式内存,例如,) 调用 EngAllocUserMem 函数。 相反,驱动程序可以让 DirectDraw 运行时为图面分配用户模式内存。 如果驱动程序直接分配内存,则后续请求通过创建图面的进程以外的进程更改视频模式可能会导致操作系统崩溃或内存泄漏。 若要让 DirectDraw 运行时分配用户模式内存,驱动程序应从其 DdCreateSurface 函数返回DDHAL_PLEASEALLOC_USERMEM值。 有关详细信息,请参阅 DdCreateSurface 参考页上的“备注”部分。

仅当驱动程序在创建图面期间分配或涉及为图面分配内存时,才会通过对驱动程序的 DdDestroySurface 入口点的单个调用销毁 Surface。 如果 DirectDraw 运行时分配了内存,而驱动程序未涉及,则运行时不会调用 DdDestroySurface

仅当创建它们的模式保持时,Surface 才会保留。 如果发生模式更改,则驱动程序控制下的所有表面都将被销毁(就驱动程序而言)。 还有一些其他事件可能导致以这种方式销毁所有表面。 驱动程序无需确定 DdDestroySurface 调用的原因。