DirectX5.0最新游戏编程指南 DirectDraw篇 三、DirectDraw的要素(三)(1)
4.4、创建表面 DirectDrawSurface对象表征了驻留在显示内存中的一个表面。如果显示内存用完了或者是显式地创建,该表面也可存在于系统内存中。你可以使用IDirectDraw2::CreateSurface方法创建一个或多个表面。调用CreateSurface时,必须指定表面的大小、表面类型(是单一表面还是复杂表面)、像素格式(如果表面不使用索引的调色板)。所有的这些特性都包含在DDSURFACEDESC结构中,在调用时需要将该结构的地址传送过去。如果硬件不支持请求的特性或者此前已经将那些资源分配给了另一个DirectDrawSurface对象,调用就会失败。 创建单一的表面或多表面只需要几行简单的代码。创建表面有四个主要的步骤。每一个步骤都需要比前一个步骤更多的准备工作,不过并不太难,它们是: (1). 创建主表面 (2). 创建一个屏外表面 (3). 创建复杂表面和翻转链 (4). 创建宽表面 在缺省的情况下,DirectDraw在本地视频内存创建一个表面,如果足够的本地视频内存保存该表面,DirectDraw就尝试利用非本地视频内存(仅在一些AGP设备系统中)。你可以在调用CreateSurface时对DDSCAPS结构赋以适当的标志来显式地指明在哪类内存中创建表面。4.4.1、创建主表面 主表面是当前在显示器上可见的并且由DDSCAPS_PRIMARYSURFACE标志指明的表面,每一个DirectDraw对象只能有一个主表面。当你创建一个主表面时,其大小应该同当前的显示模式匹配。因此,在这种情况下你不需要指明表面的大小。事实上,如果你指明了表面的大小,即使同当前的显示模式匹配,也会导致创建过程的失败。 下面的例子显示了如何设置DDSURFACEDESC结构的相关成员来创建主表面:DDSURFACEDESC ddsd; ddsd.dwSize = sizeof(ddsd); // Tell DirectDraw which members are valid. ddsd.dwFlags = DDSD_CAPS; // Request a primary surface. ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; 4.4.2、创建屏外表面 屏外表面通常用于位图的缓存,该位图将被位块传输到主表面或后台缓冲区中。你必须设定包含DDSC_WIDTH和DDSD_HEIGHT标志并设定dwWidth和dwHeight成员 为适当的值来说明屏外表面的大小。另外,还必须在DDSCAPS结构中包含DDSCAPS_OFFSCREENPLAIN标志。 当没有足够的显示内存使用时,DirectDraw就使用系统内存来创建表面。你可以在DDSCAPS结构中的dwCaps成员包含DDSCAPS_SYSTEMMEMORY或 DDSCAPS_VIDEOMEMORY标志来显式地指明是在显示内存还是在系统内存中创建表面。下面的例子显示了创建一个屏外表面之前的准备工作:DDSURFACEDESC ddsd; ddsd.dwSize = sizeof(ddsd); // Tell DirectDraw which members are valid. ddsd.dwFlags = DDSD_CAPS DDSD_HEIGHT DDSD_WIDTH; // Request a simple off-screen surface, sized // 100 by 100 pixels. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; dwHeight = 100; dwWidth = 100; 在DirectX以前的版本中,屏外表面的最大宽度不能超过主表面的宽度。在DirectX 5中,你可以创建任意宽度的屏外表面,只要显示设备指出就行。需要注意的是,当声明了屏外表面的宽度时,如果显示内存容不下请求的表面的宽度,该表面将换在系统内存中创建。如果显式地声明使用视频内存,而视频内存又不够时,创建表面的工作就会失败。