?? surface.htm
字號(hào):
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>以前的版本中,離屏頁(yè)面的寬度的最大值被限制于主頁(yè)面的寬度值之內(nèi)。而在<font
FACE="Arial" SIZE="3">DirectX 5.0</font>版中,你可以隨心所欲的創(chuàng)建任何寬度的離屏頁(yè)面,如果顯示硬件能夠承受的話。在請(qǐng)求一個(gè)超寬離屏頁(yè)面時(shí),要小心的是,如果顯卡上的內(nèi)存不能夠容納該頁(yè)面,頁(yè)面將被置于系統(tǒng)<font
FACE="Arial" SIZE="3">RAM</font>中。如果你明確的指定在視頻<font FACE="Arial"
SIZE="3">RAM</font>中創(chuàng)建超寬頁(yè)面,而硬件又無(wú)法承受的話,調(diào)用失敗。要得到更多關(guān)于超寬頁(yè)面的信息,請(qǐng)參閱“創(chuàng)建超寬頁(yè)面”。</p>
<hr>
<font FACE="黑體" SIZE="3"><b><p><a name="創(chuàng)建復(fù)雜頁(yè)面和換頁(yè)鏈">創(chuàng)建復(fù)雜頁(yè)面和換頁(yè)鏈</a></p>
</b></font><font SIZE="3"><p align="right"></font><a href="#目錄">返回目錄</a></p>
<p ALIGN="JUSTIFY">除了上面介紹的由單獨(dú)的一個(gè)頁(yè)面組成的主頁(yè)面和離屏頁(yè)面之外,你還可以創(chuàng)建由若干個(gè)頁(yè)面組成的復(fù)雜頁(yè)面(<font
FACE="Arial" SIZE="3">complex surfaces</font>),它同樣也是由一步調(diào)用<font
FACE="Arial" SIZE="3">IDirectDraw2::CreateSurface</font>函數(shù)所創(chuàng)建的。如果你在頁(yè)面描述中設(shè)置了<font
FACE="Arial" SIZE="3">DDSCAPS_COMPLEX</font>標(biāo)志符,那么在調(diào)用<font FACE="Arial"
SIZE="3">CreateSurface</font>函數(shù)后,<font FACE="Arial" SIZE="3">DirectDraw</font>除了創(chuàng)建你所明確要?jiǎng)?chuàng)建的頁(yè)面之外,還將暗中的為你創(chuàng)建一個(gè)或多個(gè)附加頁(yè)面。對(duì)復(fù)雜頁(yè)面的管理與對(duì)單頁(yè)面的管理基本上是沒(méi)有區(qū)別的:一步調(diào)用<font
FACE="Arial" SIZE="3">IDirectDraw::Release</font>函數(shù)將釋放復(fù)雜頁(yè)面中所有的頁(yè)面,并且一步調(diào)用<font
FACE="Arial" SIZE="3">IDirectDrawSurface3::Restore</font>函數(shù)將恢復(fù)所有頁(yè)面。然而,這些暗中創(chuàng)建的頁(yè)面不能被脫離,即解除隸屬關(guān)系,要得到更多的信息,請(qǐng)參閱“<font
FACE="Arial" SIZE="3">DirectDraw</font>參考手冊(cè)”中關(guān)于<font FACE="Arial" SIZE="3">IDirectDrawSurface3::DeleteAttachedSurface</font>函數(shù)的幫助。</p>
<p ALIGN="JUSTIFY">你所能創(chuàng)建的最常用的復(fù)雜頁(yè)面之一就是換頁(yè)鏈(<font
FACE="Arial" SIZE="3">flipping chain</font>)。通常,一個(gè)換頁(yè)鏈?zhǔn)怯梢粋€(gè)主頁(yè)面以及隸屬于它的若干個(gè)后臺(tái)緩存組成。<font
FACE="Arial" SIZE="3">DDSCAPS_FLIP</font>標(biāo)志符表明頁(yè)面是一個(gè)換頁(yè)鏈的一部分。創(chuàng)建一個(gè)換頁(yè)鏈的頁(yè)面描述中,同樣必須包含進(jìn)<font
FACE="Arial" SIZE="3">DDSCAPS_COMPLEX</font>標(biāo)志符。</p>
<p ALIGN="JUSTIFY">下面的例程片段展示了要?jiǎng)?chuàng)建一個(gè)換頁(yè)鏈結(jié)構(gòu),如何填充頁(yè)面描述的各成員。</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">//
請(qǐng)求一個(gè)主頁(yè)面,以及后臺(tái)緩存數(shù)量為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>
上面的例程構(gòu)造了一個(gè)雙緩沖區(qū)換頁(yè)(<font FACE="Arial" SIZE="3">double-buffered
flip</font>)環(huán)境:?jiǎn)尾秸{(diào)用<font FACE="Arial" SIZE="3">IDirectDrawSurface3::Flip</font>函數(shù)可以交換主頁(yè)面和后臺(tái)緩存。如果給<font
FACE="Arial" SIZE="3">DDSURFACEDESC </font>結(jié)構(gòu)的<font FACE="Arial" SIZE="3">dwBackBufferCount</font>成員設(shè)置了<font
FACE="Arial" SIZE="3">2</font>,將會(huì)創(chuàng)建兩個(gè)后臺(tái)緩存,在每次調(diào)用<font
FACE="Arial" SIZE="3">Flip</font>函數(shù)時(shí),主頁(yè)面將在三個(gè)頁(yè)面間循環(huán),這就構(gòu)成了一個(gè)三緩沖區(qū)換頁(yè)(<font
FACE="Arial" SIZE="3">triple-buffered flip</font>)環(huán)境。</p>
<hr>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" size="3"><font FACE="黑體" SIZE="3"><b><p><a
name="創(chuàng)建超寬頁(yè)面">創(chuàng)建超寬頁(yè)面</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">允許你在顯卡內(nèi)存中創(chuàng)建超寬離屏頁(yè)面(頁(yè)面的寬度大于主頁(yè)面)。這只在顯示設(shè)備支持超寬頁(yè)面的情況下才能實(shí)現(xiàn)。</p>
<p ALIGN="JUSTIFY">要判斷</font><font FACE="Arial" SIZE="3">DirectDraw</font><font
FACE="宋體" SIZE="3">是否支持超寬頁(yè)面,調(diào)用</font><font FACE="Arial" SIZE="3">IDirectDraw2::GetCaps</font><font
FACE="宋體" SIZE="3">函數(shù),檢查你所提供的第一個(gè)</font><font FACE="Arial"
SIZE="3">DDCAPS</font><font FACE="宋體" SIZE="3">結(jié)構(gòu)的</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">標(biāo)志。如果存在,表明你的</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">支持超寬頁(yè)面。</p>
<p ALIGN="JUSTIFY">如果你試圖在視頻</font><font FACE="Arial" SIZE="3">RAM</font><font
FACE="宋體" SIZE="3">中創(chuàng)建一個(gè)寬度大于主頁(yè)面的頁(yè)面,而</font><font
FACE="Arial" SIZE="3">DDCAPS2_WIDESURFACES</font><font FACE="宋體" SIZE="3">標(biāo)志并不存在,函數(shù)調(diào)用將失敗,并且返回一個(gè)</font><font
FACE="Arial" SIZE="3">DDERR_INVALIDPARAMS</font><font FACE="宋體" SIZE="3">錯(cuò)誤。</p>
<p ALIGN="JUSTIFY">超寬頁(yè)面通常被系統(tǒng)</font><font FACE="Arial" SIZE="3">RAM</font><font
FACE="宋體" SIZE="3">頁(yè)面、視頻端口頁(yè)面、和可執(zhí)行緩存所支持。</p>
</font>
</blockquote>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><hr>
</font>
</blockquote>
<font FACE="宋體" SIZE="3">
<p> </p>
<blockquote>
<p></font><a name="換頁(yè)"><font FACE="宋體" size="5" color="#FF8000"><b>換頁(yè)</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">里的任何頁(yè)面都可以構(gòu)造為換頁(yè)頁(yè)面(</font><font FACE="Arial"
SIZE="3">Flipping surface</font><font FACE="宋體" SIZE="3">)。一個(gè)換頁(yè)頁(yè)面是位于內(nèi)存里的任何一個(gè)可以在前臺(tái)緩存(</font><font
FACE="Arial" SIZE="3">front buffer</font><font FACE="宋體" SIZE="3">)和后臺(tái)緩存(</font><font
FACE="Arial" SIZE="3">back buffer</font><font FACE="宋體" SIZE="3">)之間交換的頁(yè)面,這個(gè)換頁(yè)環(huán)境就是我們所稱的換頁(yè)鏈(</font><font
FACE="Arial" SIZE="3">flipping chain</font><font FACE="宋體" SIZE="3">)。通常,前臺(tái)緩存指的就是主頁(yè)面,當(dāng)然,這并不是絕對(duì)的。</p>
<p ALIGN="JUSTIFY">典型的,當(dāng)你調(diào)用</font><font FACE="Arial" SIZE="3">IDirectDrawSurface3::Flip</font><font
FACE="宋體" SIZE="3">函數(shù)以請(qǐng)求一次換頁(yè)操作,指向主頁(yè)面和后臺(tái)緩存的指針相互交換。這就是說(shuō),換頁(yè)的操作,是通過(guò)交換顯示設(shè)備用來(lái)代表頁(yè)面內(nèi)存的指針,而不是通過(guò)相互復(fù)制頁(yè)面的實(shí)際內(nèi)存來(lái)完成的。但是,也有例外的時(shí)候,那就是當(dāng)</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">以仿真的方式進(jìn)行換頁(yè)操作時(shí),在這種情況下,它所做的就是簡(jiǎn)單的相互復(fù)制頁(yè)面內(nèi)存。只有在后臺(tái)緩存不能容納進(jìn)視頻</font><font
FACE="Arial" SIZE="3">RAM</font><font FACE="宋體" SIZE="3">,或硬件不支持</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">的時(shí)候,</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">才會(huì)以仿真的方式進(jìn)行換頁(yè)操作,當(dāng)然,這只是極其少見(jiàn)的情況。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">當(dāng)換頁(yè)鏈中包含了一個(gè)主頁(yè)面和一個(gè)以上的后臺(tái)緩存時(shí),在換頁(yè)操作中,指向它們的指針將按前后順序依次轉(zhuǎn)換。如下圖所示:</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">隸屬到<font FACE="Arial" SIZE="3">DirectDraw</font>對(duì)象上的其它類型的頁(yè)面,只要不是換頁(yè)鏈中的一部分,在換頁(yè)過(guò)程中都不會(huì)受到任何影響。</p>
<p ALIGN="JUSTIFY">請(qǐng)牢記,<font FACE="Arial" SIZE="3">DirectDraw</font>進(jìn)行換頁(yè),是通過(guò)交換指向<font
FACE="Arial" SIZE="3">DirectDrawSurface</font>對(duì)象的指針。而不是交換<font
FACE="Arial" SIZE="3">DirectDrawSurface</font>對(duì)象本身。這意味著,在任何類型的換頁(yè)方案中,如果你想將圖象<font
FACE="Arial" SIZE="3">Blit</font>到后臺(tái)緩存,你所使用的始終是同一個(gè)<font
FACE="Arial" SIZE="3">DirectDrawSurface</font>對(duì)象,而不用去考慮原先的后臺(tái)緩存已經(jīng)換頁(yè)到哪兒了。同樣的,你應(yīng)該始終使用主頁(yè)面作為<font
FACE="Arial" SIZE="3">Flip</font>函數(shù)的調(diào)用者,以完成一次換頁(yè)操作,而不用去管最開(kāi)始的主頁(yè)面換頁(yè)到哪兒了。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">當(dāng)換頁(yè)對(duì)象是可見(jiàn)的頁(yè)面,比如主頁(yè)面換頁(yè)鏈或一個(gè)可見(jiàn)的覆蓋頁(yè)面換頁(yè)鏈,進(jìn)行換頁(yè)的<font
FACE="Arial" SIZE="3">Flip</font>函數(shù)與系統(tǒng)<font FACE="Arial" SIZE="3">CPU</font>是異步執(zhí)行的。這就是說(shuō),在這些可見(jiàn)的頁(yè)面上,調(diào)用<font
FACE="Arial" SIZE="3">Flip</font>函數(shù),它只是簡(jiǎn)單的告訴顯示硬件該進(jìn)行換頁(yè)了,并不需要等待換頁(yè)操作在硬件設(shè)備中實(shí)際完成后才返回。這是因?yàn)轱@示硬件(顯示器)只有在完成一次垂直刷新后才能進(jìn)行一次換頁(yè)。所以,<font
FACE="Arial" SIZE="3">Flip</font>函數(shù)調(diào)用成功,并不意味著換頁(yè)已經(jīng)完成,在實(shí)際的換頁(yè)操作進(jìn)行之前,對(duì)即將成為主頁(yè)面的后臺(tái)緩存是不能鎖定和進(jìn)行<font
FACE="Arial" SIZE="3">Blit</font>操作的,如果在這時(shí)調(diào)用以下這些函數(shù),調(diào)用將失敗,并且返回<font
FACE="Arial" SIZE="3">DDERR_WASSTILLDRAWING</font>的錯(cuò)誤,如<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>。但是,對(duì)于三緩沖區(qū)換頁(yè)環(huán)境,最后一個(gè)后臺(tái)緩存仍是可用的。</p>
<p ALIGN="JUSTIFY">要讓<font FACE="Arial" SIZE="3">Flip</font>函數(shù)成為與系統(tǒng)<font
FACE="Arial" SIZE="3">CPU</font>同步的操作,在調(diào)用時(shí)指定<font FACE="Arial"
SIZE="3">DDFLIP_WAIT</font>標(biāo)志即可。</p>
</font><hr>
</blockquote>
<blockquote>
<b><font FACE="黑體"><p></font><a name="頁(yè)面丟失"><font color="#FF8000"
face="宋體"><big>頁(yè)面丟失</big></font></a><font FACE="黑體"></p>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -