⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 surface.htm

📁 这是用C++实现语音识别的一个插件。大家一起分享一下!
💻 HTM
📖 第 1 页 / 共 5 页
字号:
    FACE="宋体" SIZE="3"></p>
    </font><font FACE="宋体" size="4"><p ALIGN="JUSTIFY"></font><font FACE="宋体" SIZE="3"><br>
    在<font FACE="Arial" SIZE="3">DirectX</font>以前的版本中,离屏页面的宽度的最大值被限制于主页面的宽度值之内。而在<font
    FACE="Arial" SIZE="3">DirectX 5.0</font>版中,你可以随心所欲的创建任何宽度的离屏页面,如果显示硬件能够承受的话。在请求一个超宽离屏页面时,要小心的是,如果显卡上的内存不能够容纳该页面,页面将被置于系统<font
    FACE="Arial" SIZE="3">RAM</font>中。如果你明确的指定在视频<font FACE="Arial"
    SIZE="3">RAM</font>中创建超宽页面,而硬件又无法承受的话,调用失败。要得到更多关于超宽页面的信息,请参阅“创建超宽页面”。</p>
    <hr>
    <font FACE="黑体" SIZE="3"><b><p><a name="创建复杂页面和换页链">创建复杂页面和换页链</a></p>
    </b></font><font SIZE="3"><p align="right"></font><a href="#目录">返回目录</a></p>
    <p ALIGN="JUSTIFY">除了上面介绍的由单独的一个页面组成的主页面和离屏页面之外,你还可以创建由若干个页面组成的复杂页面(<font
    FACE="Arial" SIZE="3">complex surfaces</font>),它同样也是由一步调用<font
    FACE="Arial" SIZE="3">IDirectDraw2::CreateSurface</font>函数所创建的。如果你在页面描述中设置了<font
    FACE="Arial" SIZE="3">DDSCAPS_COMPLEX</font>标志符,那么在调用<font FACE="Arial"
    SIZE="3">CreateSurface</font>函数后,<font FACE="Arial" SIZE="3">DirectDraw</font>除了创建你所明确要创建的页面之外,还将暗中的为你创建一个或多个附加页面。对复杂页面的管理与对单页面的管理基本上是没有区别的:一步调用<font
    FACE="Arial" SIZE="3">IDirectDraw::Release</font>函数将释放复杂页面中所有的页面,并且一步调用<font
    FACE="Arial" SIZE="3">IDirectDrawSurface3::Restore</font>函数将恢复所有页面。然而,这些暗中创建的页面不能被脱离,即解除隶属关系,要得到更多的信息,请参阅“<font
    FACE="Arial" SIZE="3">DirectDraw</font>参考手册”中关于<font FACE="Arial" SIZE="3">IDirectDrawSurface3::DeleteAttachedSurface</font>函数的帮助。</p>
    <p ALIGN="JUSTIFY">你所能创建的最常用的复杂页面之一就是换页链(<font
    FACE="Arial" SIZE="3">flipping chain</font>)。通常,一个换页链是由一个主页面以及隶属于它的若干个后台缓存组成。<font
    FACE="Arial" SIZE="3">DDSCAPS_FLIP</font>标志符表明页面是一个换页链的一部分。创建一个换页链的页面描述中,同样必须包含进<font
    FACE="Arial" SIZE="3">DDSCAPS_COMPLEX</font>标志符。</p>
    <p ALIGN="JUSTIFY">下面的例程片段展示了要创建一个换页链结构,如何填充页面描述的各成员。</p>
    <font FACE="宋体" SIZE="1"><p
    style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font></font><font
    FACE="宋体" color="#FFFFFF" size="3">DDSURFACEDESC ddsd; </font><font FACE="宋体"
    size="3"></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
    FACE="宋体" color="#FFFFFF" size="3">ddsd.dwSize = sizeof(ddsd); </font><font
    FACE="宋体" size="3"></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
    FACE="宋体" color="#FFFFFF" size="3">// 告诉DirectDraw哪些成员是可用的</font><font
    FACE="宋体" size="3"></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
    FACE="宋体" color="#FFFFFF" size="3">ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; </font><font
    FACE="宋体" size="3"></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
    FACE="宋体" color="#FFFFFF" size="3">// 
    请求一个主页面,以及后台缓存数量为1</font><font FACE="宋体" size="3"></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
    FACE="宋体" color="#FFFFFF" size="3">ddsd.ddsCaps.dwCaps = DDSCAPS_COMPLEX | 
    DDSCAPS_FLIP | DDSCAPS_PRIMARYSURFACE; </font><font FACE="宋体" size="3"></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
    FACE="宋体" color="#FFFFFF" size="3">ddsd.dwBackBufferCount = 1; </font><font
    FACE="宋体" size="3"></p>
    </font><font FACE="宋体" size="4"><p ALIGN="JUSTIFY"></font><font FACE="宋体" size="3"><br>
    上面的例程构造了一个双缓冲区换页(<font FACE="Arial" SIZE="3">double-buffered 
    flip</font>)环境:单步调用<font FACE="Arial" SIZE="3">IDirectDrawSurface3::Flip</font>函数可以交换主页面和后台缓存。如果给<font
    FACE="Arial" SIZE="3">DDSURFACEDESC </font>结构的<font FACE="Arial" SIZE="3">dwBackBufferCount</font>成员设置了<font
    FACE="Arial" SIZE="3">2</font>,将会创建两个后台缓存,在每次调用<font
    FACE="Arial" SIZE="3">Flip</font>函数时,主页面将在三个页面间循环,这就构成了一个三缓冲区换页(<font
    FACE="Arial" SIZE="3">triple-buffered flip</font>)环境。</p>
    <hr>
    </font>
  </blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><font FACE="黑体" SIZE="3"><b><p><a
    name="创建超宽页面">创建超宽页面</a></b></font></p>
    </font>
  </blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><font SIZE="3"><p align="right"></font><a href="#目录">返回目录</a></p>
    </font>
  </blockquote>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">DirectDraw</font><font FACE="宋体"
    SIZE="3">允许你在显卡内存中创建超宽离屏页面(页面的宽度大于主页面)。这只在显示设备支持超宽页面的情况下才能实现。</p>
    <p ALIGN="JUSTIFY">要判断</font><font FACE="Arial" SIZE="3">DirectDraw</font><font
    FACE="宋体" SIZE="3">是否支持超宽页面,调用</font><font FACE="Arial" SIZE="3">IDirectDraw2::GetCaps</font><font
    FACE="宋体" SIZE="3">函数,检查你所提供的第一个</font><font FACE="Arial"
    SIZE="3">DDCAPS</font><font FACE="宋体" SIZE="3">结构的</font><font FACE="Arial"
    SIZE="3">dwCaps2</font><font FACE="宋体" SIZE="3">成员中是否存在</font><font
    FACE="Arial" SIZE="3">DDCAPS2_WIDESURFACES</font><font FACE="宋体" SIZE="3">标志。如果存在,表明你的</font><font
    FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">支持超宽页面。</p>
    <p ALIGN="JUSTIFY">如果你试图在视频</font><font FACE="Arial" SIZE="3">RAM</font><font
    FACE="宋体" SIZE="3">中创建一个宽度大于主页面的页面,而</font><font
    FACE="Arial" SIZE="3">DDCAPS2_WIDESURFACES</font><font FACE="宋体" SIZE="3">标志并不存在,函数调用将失败,并且返回一个</font><font
    FACE="Arial" SIZE="3">DDERR_INVALIDPARAMS</font><font FACE="宋体" SIZE="3">错误。</p>
    <p ALIGN="JUSTIFY">超宽页面通常被系统</font><font FACE="Arial" SIZE="3">RAM</font><font
    FACE="宋体" SIZE="3">页面、视频端口页面、和可执行缓存所支持。</p>
    </font>
  </blockquote>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><hr>
  </font>
</blockquote>
<font FACE="宋体" SIZE="3">

<p> </p>

<blockquote>
  <p></font><a name="换页"><font FACE="宋体" size="5" color="#FF8000"><b>换页</b></font></a><font
  FACE="宋体" SIZE="3"></p>
  <font SIZE="3"><p align="right"></font><a href="#目录">返回目录</a></p>
</blockquote>
</font>

<blockquote>
  <font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">DirectDraw</font><font FACE="宋体"
  SIZE="3">里的任何页面都可以构造为换页页面(</font><font FACE="Arial"
  SIZE="3">Flipping surface</font><font FACE="宋体" SIZE="3">)。一个换页页面是位于内存里的任何一个可以在前台缓存(</font><font
  FACE="Arial" SIZE="3">front buffer</font><font FACE="宋体" SIZE="3">)和后台缓存(</font><font
  FACE="Arial" SIZE="3">back buffer</font><font FACE="宋体" SIZE="3">)之间交换的页面,这个换页环境就是我们所称的换页链(</font><font
  FACE="Arial" SIZE="3">flipping chain</font><font FACE="宋体" SIZE="3">)。通常,前台缓存指的就是主页面,当然,这并不是绝对的。</p>
  <p ALIGN="JUSTIFY">典型的,当你调用</font><font FACE="Arial" SIZE="3">IDirectDrawSurface3::Flip</font><font
  FACE="宋体" SIZE="3">函数以请求一次换页操作,指向主页面和后台缓存的指针相互交换。这就是说,换页的操作,是通过交换显示设备用来代表页面内存的指针,而不是通过相互复制页面的实际内存来完成的。但是,也有例外的时候,那就是当</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">以仿真的方式进行换页操作时,在这种情况下,它所做的就是简单的相互复制页面内存。只有在后台缓存不能容纳进视频</font><font
  FACE="Arial" SIZE="3">RAM</font><font FACE="宋体" SIZE="3">,或硬件不支持</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">的时候,</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">才会以仿真的方式进行换页操作,当然,这只是极其少见的情况。</p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">当换页链中包含了一个主页面和一个以上的后台缓存时,在换页操作中,指向它们的指针将按前后顺序依次转换。如下图所示:</p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">隶属到<font FACE="Arial" SIZE="3">DirectDraw</font>对象上的其它类型的页面,只要不是换页链中的一部分,在换页过程中都不会受到任何影响。</p>
  <p ALIGN="JUSTIFY">请牢记,<font FACE="Arial" SIZE="3">DirectDraw</font>进行换页,是通过交换指向<font
  FACE="Arial" SIZE="3">DirectDrawSurface</font>对象的指针。而不是交换<font
  FACE="Arial" SIZE="3">DirectDrawSurface</font>对象本身。这意味着,在任何类型的换页方案中,如果你想将图象<font
  FACE="Arial" SIZE="3">Blit</font>到后台缓存,你所使用的始终是同一个<font
  FACE="Arial" SIZE="3">DirectDrawSurface</font>对象,而不用去考虑原先的后台缓存已经换页到哪儿了。同样的,你应该始终使用主页面作为<font
  FACE="Arial" SIZE="3">Flip</font>函数的调用者,以完成一次换页操作,而不用去管最开始的主页面换页到哪儿了。</p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">当换页对象是可见的页面,比如主页面换页链或一个可见的覆盖页面换页链,进行换页的<font
  FACE="Arial" SIZE="3">Flip</font>函数与系统<font FACE="Arial" SIZE="3">CPU</font>是异步执行的。这就是说,在这些可见的页面上,调用<font
  FACE="Arial" SIZE="3">Flip</font>函数,它只是简单的告诉显示硬件该进行换页了,并不需要等待换页操作在硬件设备中实际完成后才返回。这是因为显示硬件(显示器)只有在完成一次垂直刷新后才能进行一次换页。所以,<font
  FACE="Arial" SIZE="3">Flip</font>函数调用成功,并不意味着换页已经完成,在实际的换页操作进行之前,对即将成为主页面的后台缓存是不能锁定和进行<font
  FACE="Arial" SIZE="3">Blit</font>操作的,如果在这时调用以下这些函数,调用将失败,并且返回<font
  FACE="Arial" SIZE="3">DDERR_WASSTILLDRAWING</font>的错误,如<font FACE="Arial"
  SIZE="3">IDirectDrawSurface3::Lock</font>、<font FACE="Arial" SIZE="3">IDirectDrawSurface3::Blt</font>、<font
  FACE="Arial" SIZE="3">IDirectDrawSurface3::BltFast</font>和<font FACE="Arial" SIZE="3">IDirectDrawSurface3::GetDC</font>。但是,对于三缓冲区换页环境,最后一个后台缓存仍是可用的。</p>
  <p ALIGN="JUSTIFY">要让<font FACE="Arial" SIZE="3">Flip</font>函数成为与系统<font
  FACE="Arial" SIZE="3">CPU</font>同步的操作,在调用时指定<font FACE="Arial"
  SIZE="3">DDFLIP_WAIT</font>标志即可。</p>
  </font><hr>
</blockquote>

<blockquote>
  <b><font FACE="黑体"><p></font><a name="页面丢失"><font color="#FF8000"
  face="宋体"><big>页面丢失</big></font></a><font FACE="黑体"></p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -