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

📄 topitem.htm

📁 DirectX 编程初级教程中文版。只要有C++基础和一点三维知识即可。
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  FACE="Arial" SIZE="3">320x200x8</font><font face="宋体" size="3">加速的显示卡很可能会使用不同的宽矩值。</p>
  </font><hr>
</blockquote>

<blockquote>
  <b><font FACE="黑体" SIZE="3"><p></font><a name="从DMA中获益"><font color="#FF8000"><font
  FACE="黑体" size="4">从</font><font FACE="Arial" size="4">DMA</font><font FACE="宋体"
  size="4">中获益</font></font></a></b><font FACE="宋体" SIZE="3"></p>
  </font><font size="4"><p align="right"></font><font FACE="宋体" SIZE="3"><a
  href="#目录">返回目录</a></font></p>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">本节的内容是关于如何从设备对</font><font
  FACE="Arial" SIZE="3">DMA</font><font FACE="宋体" SIZE="3">(直接内存访问)的支持中获得好处,以提高应用程序的运行效果。探讨了以下几个主题。</p>
  </font>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="宋体" SIZE="3"><ol>
      <li>关于</font><font FACE="Arial" SIZE="3">DMA</font><font FACE="宋体" SIZE="3">设备支持</li>
      <li>对</font><font FACE="Arial" SIZE="3">DMA</font><font FACE="宋体" SIZE="3">支持的检测</li>
      <li>典型的</font><font FACE="Arial" SIZE="3">DMA</font><font FACE="宋体" SIZE="3">方案</li>
      <li>利用</font><font FACE="Arial" SIZE="3">DMA</font></li>
    </ol>
  </blockquote>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><b><font FACE="黑体" SIZE="3"><p><a
  name="关于DMA设备支持">关于</font><font FACE="Arial" SIZE="3">DMA</font>设备支持</a></p>
  </b></font><font size="4"><p align="right"></font><font FACE="宋体" SIZE="3"><a
  href="#目录">返回目录</a></font></p>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">某些显示卡可以完成在系统<font
  FACE="Arial" SIZE="3">RAM</font>页面中的<font FACE="Arial" SIZE="3">Blit</font>或其它操作,这些操作一般被称为“直接内存访问(<font
  FACE="Arial" SIZE="3">DMA</font>:<font FACE="Arial" SIZE="3">Direct Memory Access</font>)”。你可以利用<font
  FACE="Arial" SIZE="3">DMA</font>支持来加速某些集合操作。举例来说,你可以利用系统设备对<font
  FACE="Arial" SIZE="3">DMA</font>的支持,完成一次从系统<font FACE="Arial"
  SIZE="3">RAM</font>到显示<font FACE="Arial" SIZE="3">RAM</font>的<font FACE="Arial"
  SIZE="3">Blit</font>操作,而与此同时,处理器正在准备下一帧。为了使用这个功能,你必须承担一些责任,以下将对此进一步详细探讨。</p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><b><font FACE="黑体" SIZE="3"><p><a
  name="对DMA支持的检测">对</font><font FACE="Arial" SIZE="3">DMA</font><font
  FACE="黑体" SIZE="3">支持的检测</a></p>
  </font></b></font><font size="4"><p align="right"></font><font FACE="宋体" SIZE="3"><a
  href="#目录">返回目录</a></font></p>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">在使用<font FACE="Arial" SIZE="3">DMA</font>操作之前,你必须检测系统设备是否支持<font
  FACE="Arial" SIZE="3">DMA</font>操作,如果支持的话,支持的程度如何。首先调用<font
  FACE="Arial" SIZE="3">IDirectDraw2::GetCaps</font>函数查询设备能力,然后检查相应<font
  FACE="Arial" SIZE="3">DDCAPS </font>结构的<font FACE="Arial" SIZE="3">dwCaps </font>成员中是否存在<font
  FACE="Arial" SIZE="3">DDCAPS_CANBLTSYSMEM</font>标志。如果该标志存在的话,表示显示设备支持<font
  FACE="Arial" SIZE="3">DMA</font>。</p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">如果你已知道显示设备支持<font
  FACE="Arial" SIZE="3">DMA</font>,你还需要知道显示设备支持的程度如何。这可以通过检查另一些结构成员来完成,它们提供了有关从系统<font
  FACE="Arial" SIZE="3">RAM</font>到视频<font FACE="Arial" SIZE="3">RAM</font>,视频<font
  FACE="Arial" SIZE="3">RAM</font>到系统<font FACE="Arial" SIZE="3">RAM</font>,以及系统<font
  FACE="Arial" SIZE="3">RAM</font>到系统<font FACE="Arial" SIZE="3">RAM</font>的<font
  FACE="Arial" SIZE="3">Blit</font>操作的<font FACE="Arial" SIZE="3">DMA</font>特性。这些特性由<font
  FACE="Arial" SIZE="3">12</font>个<font FACE="Arial" SIZE="3">DDCAPS</font>结构的成员提供,它们依照<font
  FACE="Arial" SIZE="3">Blit</font>操作的<font FACE="Arial" SIZE="3">DMA</font>方式来命名。下面的表展示了这些成员。</p>
  </font>
</blockquote>
<font FACE="宋体" SIZE="3"><div align="center"><center>

<table BORDER="1" CELLSPACING="1" CELLPADDING="7" WIDTH="518">
  <tr>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><b>系统<font FACE="Arial" SIZE="3">RAM</font>到视频<font
    FACE="Arial" SIZE="3">RAM</font></b></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><b>视频<font FACE="Arial" SIZE="3">RAM</font>到系统<font
    FACE="Arial" SIZE="3">RAM</font></b></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><b>系统<font FACE="Arial" SIZE="3">RAM</font>到系统<font
    FACE="Arial" SIZE="3">RAM</font></b></td>
  </tr>
  <tr>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwSVBCaps</font></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwVSBCaps</font></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwSSBCaps </font></td>
  </tr>
  <tr>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwSVBCKeyCaps</font></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwVSBCKeyCaps</font></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwSSBCKeyCaps </font></td>
  </tr>
  <tr>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwSVBFXCaps</font></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwVSBFXCaps</font></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwSSBFXCaps </font></td>
  </tr>
  <tr>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwSVBRops</font></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwVSBRops</font></td>
    <td WIDTH="33%" VALIGN="MIDDLE" HEIGHT="25"><font FACE="Arial" SIZE="3">dwSSBRops </font></td>
  </tr>
</table>
</center></div>

<blockquote>
  <p ALIGN="JUSTIFY">举例来说,系统<font FACE="Arial" SIZE="3">RAM</font>到视频<font
  FACE="Arial" SIZE="3">RAM</font>的<font FACE="Arial" SIZE="3">Blit</font>特性标志由<font
  FACE="Arial" SIZE="3">dwSVBCaps</font>、<font FACE="Arial" SIZE="3">dwSVBCKeyCaps</font>、<font
  FACE="Arial" SIZE="3">dwSVBFXCaps</font>和<font FACE="Arial" SIZE="3">dwSVBRops</font>成员提供。类似的,视频<font
  FACE="Arial" SIZE="3">RAM</font>到系统<font FACE="Arial" SIZE="3">RAM</font>的<font
  FACE="Arial" SIZE="3">Blit</font>特性是由“<font FACE="Arial" SIZE="3">dwVSB</font>”打头的成员提供;系统<font
  FACE="Arial" SIZE="3">RAM</font>到系统<font FACE="Arial" SIZE="3">RAM</font>的<font
  FACE="Arial" SIZE="3">Blit</font>特性是由“<font FACE="Arial" SIZE="3">dwSSB</font>”打头的成员提供。检查存在于这些成员中的标志,可以确定硬件对<font
  FACE="Arial" SIZE="3">Blit</font>操作的<font FACE="Arial" SIZE="3">DMA</font>方式的支持程度。</p>
  <p ALIGN="JUSTIFY">就这些成员的<font FACE="Arial" SIZE="3">Blit</font>类型来说,这些成员中的标志与在<font
  FACE="Arial" SIZE="3">dwCaps</font>、<font FACE="Arial" SIZE="3">dwCKeyCaps</font>和<font
  FACE="Arial" SIZE="3">dwFXCaps</font>成员中<font FACE="Arial" SIZE="3">Blit</font>相关的标志是一致的。例如,<font
  FACE="Arial" SIZE="3">dwSVBCaps</font>成员中包含了常规的<font FACE="Arial"
  SIZE="3">Blit</font>操作特性,你可以在<font FACE="Arial" SIZE="3">dwCaps</font>成员中找到同样的标志。同样,<font
  FACE="Arial" SIZE="3">dwSVBRops</font>、<font FACE="Arial" SIZE="3">dwVSBRops</font>和<font
  FACE="Arial" SIZE="3">dwSSBRops</font>成员中也提供了有关特定类型的<font
  FACE="Arial" SIZE="3">Blit</font>的光栅操作(<font FACE="Arial" SIZE="3">Raster 
  operation</font>)的光栅操作码。</p>
  <p ALIGN="JUSTIFY">从这些成员可以检测到的特性中,有一个关键的特性,用来表明系统对异步<font
  FACE="Arial" SIZE="3">DMA Blit</font>操作的支持。如果显示设备支持页面间的异步<font
  FACE="Arial" SIZE="3">DMA Blit</font>操作,那么<font FACE="Arial" SIZE="3">DDCAPS_BLTQUEUE</font>标志会被设置在<font
  FACE="Arial" SIZE="3">dwSVBCaps</font>、<font FACE="Arial" SIZE="3">dwVSBCaps</font>或<font
  FACE="Arial" SIZE="3">dwSSBCaps</font>成员中(一般来说,你将看到的是从系统<font
  FACE="Arial" SIZE="3">RAM</font>到视频<font FACE="Arial" SIZE="3">RAM</font>页面的最好的支持)。如果该标志不存在,表明系统并不报告支持异步<font
  FACE="Arial" SIZE="3">DMA Blit</font>操作。</p>
</blockquote>

<blockquote>
  <b><font FACE="黑体" SIZE="3"><p><a name="典型的DMA方案">典型的</font><font
  FACE="Arial" SIZE="3">DMA</font><font FACE="黑体" SIZE="3">方案</a></p>
  </font></b><font size="4"><p align="right"></font><a href="#目录">返回目录</a></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">从系统<font FACE="Arial" SIZE="3">RAM</font>到视频<font
  FACE="Arial" SIZE="3">RAM</font>的<font FACE="Arial" SIZE="3">SRCCOPY</font>(光栅操作码之一,表示“复制”)传送是被硬件支持的最基本的<font
  FACE="Arial" SIZE="3">Blit</font>操作类型。因此,该操作最典型的用法是将系统<font
  FACE="Arial" SIZE="3">RAM</font>页面中的数据传送到视频<font FACE="Arial"
  SIZE="3">RAM</font>的页面中,以备后用。系统<font FACE="Arial" SIZE="3">RAM</font>到视频<font
  FACE="Arial" SIZE="3">RAM</font>的<font FACE="Arial" SIZE="3">DMA</font>传送与<font
  FACE="Arial" SIZE="3">CPU</font>控制的传送(比如:<font FACE="Arial" SIZE="3">HEL</font>的<font
  FACE="Arial" SIZE="3">Blit</font>)一样快速,但是又具有极大的利用价值,因为它们可以与主<font
  FACE="Arial" SIZE="3">CPU</font>进行并行的操作。</p>
</blockquote>

<blockquote>
  <b><font FACE="黑体" SIZE="3"><p><a name="利用DMA">利用</font><font FACE="Arial"
  SIZE="3">DMA</font></a></b></p>
  <font size="4"><p align="right"></font><a href="#目录">返回目录</a></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">硬件的<font FACE="Arial" SIZE="3">Blit</font>操作使用的是物理内存地址,而不是虚拟地址,后者是应用程序的本地地址。某些设备驱动要求你提供页面的物理内存地址。这种机制是由<font
  FACE="Arial" SIZE="3">IDirectDrawSurface3::PageLock</font>函数实现的。如果设备驱动不需要进行页锁定(<font
  FACE="Arial" SIZE="3">Page locking</font>),当你调用<font FACE="Arial" SIZE="3">IDirectDraw2::GetCaps</font>函数以测定硬件特性时,返回值中将会被设置<font
  FACE="Arial" SIZE="3">DDCAPS2_NOPAGELOCKREQUIRED</font>标志。</p>
  <p ALIGN="JUSTIFY">锁定一个页面可以阻止系统将该页面的物理内存给其它的进程使用,并且保证该页面的物理内存地址始终保持不变,直到调用了相应的<font
  FACE="Arial" SIZE="3">IDirectDrawSurface3::PageUnlock</font>函数。如果设备驱动需要进行页锁定,那么,<font
  FACE="Arial" SIZE="3">DirectDraw</font>将只能允许系统<font FACE="Arial" SIZE="3">RAM</font>中页面的<font
  FACE="Arial" SIZE="3">DMA</font>操作,该页面是被应用程序锁定的。如果在这种情况下,你不调用<font
  FACE="Arial" SIZE="3">IDirectDrawSurface3::PageLock</font>函数,<font FACE="Arial"
  SIZE="3">DirectDraw</font>将会使用软件仿真的方式来完成<font FACE="Arial"
  SIZE="3">Blit</font>操作。应该注意的是:锁定大块的系统<font FACE="Arial"
  SIZE="3">RAM</font>将会导致<font FACE="Arial" SIZE="3">Windows</font>系统运行阻塞。因此强烈建议,如果你的应用程序不是运行于全屏独占模式,那么,不要调用<font
  FACE="Arial" SIZE="3">IDirectDrawSurface3::PageLock</font>函数以锁定大块的系统<font
  FACE="Arial" SIZE="3">RAM</font>,而且,当应用程序最小化时,必须及时将这些页面解锁,当然,当应用程序恢复最大化时,你可以再次锁定页面。</p>
  <p ALIGN="JUSTIFY">管理页锁定的任务完全落在应用程序开发者手中,<font
  FACE="Arial" SIZE="3">DirectDraw</font>绝不会来插手来锁定或解锁一个页面。而且,决定究竟将多少页面内存锁定才不会对系统运行产生严重的负面影响,也是对开发者的一项考验。</p>
  <hr>
</blockquote>

⌨️ 快捷键说明

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