亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java中使用DirectDraw

2019-11-18 13:58:09
字體:
來源:轉載
供稿:網友

  注釋:DirectDraw®是微軟DirectX® SDK的一個組成部分。java版的DirectX包含在Java 2.0 SDK中。Java中通過同DirectX一起安裝的com.ms.directX包中的一套類訪問DirectDraw。

介紹

本文將探討用于Java的DirectDraw SDK的一些優點、結構和使用。過去,使用動畫的程序需要用C++編寫(或者匯編語言),原因是動畫需要很快的處理速度。動畫是通過快速連續地顯示一系列畫面(或者叫做幀)實現的。為了使用戶觀看動畫時沒有閃爍感,至少需要達到每秒12幀的速率。更高的幀速率會產生更平滑的動畫:例如,動畫片的幀速率通常為每秒24幀。要達到最低的每秒12幀要求,在640´480,256色模式下每秒需要處理3.6M字節的圖象數據。處理如此數量的視頻數據是非常困難的。DirectDraw現在為Java開發人員提供了這種視頻數據處理能力。

開始使用DirectDraw API需要一些基本步驟。現將其列舉如下,并且將會在后面的部分中解釋:

創建DirectDraw對象。
設置協作級別。
創建需要的表面。
裝入需要的位圖。
顯示表面。
DirectDraw對象

要在Java中使用DirectDraw,必須先創建DirectDraw對象:

dd = new DirectDraw();

一旦創建了DirectDraw對象,就需要設置協作級別。

協作級別

必須要設置DirectDraw在最高層窗口上擁有的控制級別。在最簡單的級別上,DirectDraw的功能同其他程序相同,限制在Windows® 95或者Windows NT®窗口內。這是DirectDraw的正常級別操作。正常協作級別可以通過下面的語句設置:

dd.setCoOperativeLevel(hwnd, DDSCL_NORMAL);

注重 為了使程序能夠利用更高級的DirectDraw特性,如改變顯示模式或者修改DirectDraw的表面的行為,需要使用獨占模式。然而,使用高級特性超出了本文的范圍。要得到關于使用高級特性的更多信息,請參考DirectX文檔。

創建表面

DirectDraw使用術語表面(surface)代表顯示內容。表面既可以放在顯示內存中,也可以放在系統內存中。然而,假如顯示硬件沒有足夠的內存存放表面,DirectDraw會在系統內存中模擬表面。DirectDraw表面的最大優點是它總是以線性內存區域的形式提供給開發者。即使程序設置的顯示模式不是線性的,表面為開發者提供的仍然是線性內存區域??紤]下面的例子,ModeX中顯示內存是以一系列位面(plane)配置的(圖1)。為了畫一個點,必須防衛適當的內存位面以及正確的地址。DirectDrawSurface對象處理了所有這些細節。



圖 1. Mode X中的顯示內存組織。

一個DirectDraw表面可以包含多個內存緩沖區,答應構建可以切換的表面。切換表面使程序可以利用雙緩沖技術的優點。在雙緩沖方法中,程序在后臺緩沖區中繪制一些內容,畫完后,快速地將后臺緩沖區切換或者復制到前臺緩沖區,使該畫面顯示出來。雙緩沖方法速度非???,尤其是當前臺和后臺緩沖區都在顯示內存中時。此時,切換操作甚至不消耗任何CPU時間。

基于DirectDraw程序的用戶看到的總是原始表面(PRimary surface)。為了改變用戶看到的內容,可以簡單地改變原始表面的內容。通常,需要創建一個或多個后臺表面,這些表面中包含不同時間顯示的畫面。圖2說明了一個復雜的雙緩沖原始表面。該原始表面由一個后臺緩沖區、一個前臺緩沖區和四個后臺表面組成。每個后臺表面包含一個不同旋轉階段的位圖。要使圓柱體動起來,程序將每個位圖從后臺表面中復制到原始表面的后臺緩沖區中的一個位置。每當每個圓柱體的復制完成時,程序將后臺緩沖區切換到前臺緩沖區。



圖2. 雙緩沖表面之間的關系

DirectDraw在Java中的實現包括兩個為表面工作而非凡設計的類。DDSurfaceDesc類用來描述所創建表面的屬性。DirectDrawSurface類包含為DirectDraw表面工作所做的定義、方法和變量。

要創建DirectDraw表面,不管是原始表面還是后臺表面,必須先創建DDSurfaceDesc對象,設置表面屬性,并且把表面描述結構傳遞給DirectDraw對象的CreateSurface()方法。下面的語句創建了一個由一個緩沖區組成的原始表面:

// Create a primary surface containing a single buffer.

ddsd = new DDSurfaceDesc();

ddsd.flags = DDSD_CAPS ;

ddsd.ddsCaps = DDSCAPS_PRIMARYSURFACE;

pdds = dd.createSurface( ddsd );

下面的語句創建了一個雙緩沖原始表面:

//Create a primary surface containing a back //buffer for double buffering.

ddsd = new DDSurfaceDesc();

ddsd.flags = DDSD_CAPS DDSD_BACKBUFFERCOUNT;

ddsd.ddsCaps = DDSCAPS_PRIMARYSURFACE DDSCPAS_FLip DDSCAPS_COMPLEX;

ddsd. BackBufferCount = 1;

pdds = dd.createSurface( ddsd );

下面的語句說明了如何創建一個320象素寬200行高的后臺表面:

Ddsd = new DDSurfaceDesc();

ddsd.flags = DDSD_CAPS DDSD_HEIGHT DDSD_WIDTH;

ddsd.ddsCaps = DDSCAPS_OFFSCREENPLAIN;

ddsd.width = 320;

ddsd.height = 200;

pdds = dd.createSurface( ddsd );

將位圖裝入到DirectDraw表面中

位圖是程序可以用來顯示圖形內容的圖片。圖2中的四個圓柱體每一個都是一張位圖。Java中的DirectDraw為操作位圖文件提供了DirectDrawBitmap類。DirectDrawBitmap對象創建后,可以復制到DirectDraw表面。下面的語句將一個叫作Frntback.bmp的位圖文件讀入到DirectDraw表面:

//Read the bitmap file.

Bm = new DirectDrawBitmap();

bm.filename(“Frntback.bmp”);

bm.initWidth(dx);

bm.initHeight(dy);

if( bm.loaded() != 0 )

{

// Create a DirectDrawSurface for

// this bitmap.

ddsd = new DDSurfaceDesc();

ddsd.flags = DDSD_CAPS

DDSD_HEIGHT DDSD_WIDTH;

ddsd.ddsCaps = DDSCAPS_OFFSCREENPLAIN;

ddsd.width = bm.width();

ddsd.height = bm.height();

pdds = dd.createSurface( ddsd );

pdds.copyBitmap(bm, 0, 0, 0, 0);

}

//Off-screen surface pdds now contains the

//bitmap data.

顯示表面

當所有表面都創建并初始化(例如將位圖復制到表面中)以后,程序需要顯示它們時就可以將它們復制到原始表面。這種表面復制通過DirectDrawSurface對象的blt方法完成。在缺省的操作模式下,假如切換程序忙(正在進行切換),DDS.blt()方法立即返回一個錯誤碼。因此,應該以某種循環的形式使用DDS.blt()方法,或者指定DDS.blt()方法的DDBLT_WAIT標志。第二個選項改變了DDS.blt()的行為,使得此方法等待,直到切換可以進行或者出現另一個錯誤。

下面的代碼說明了如何使用DirectDrawSurface的blt方法。首先,有兩點需要闡明。假如顯示卡的模式改變或者程序使用對顯示卡的獨占訪問而釋放了當前在顯卡上分配的所有表面內存,DirectDrawSurface就會丟失。當表面丟失時,需要恢復?;謴涂梢酝ㄟ^兩個步驟完成。首先調用DirectDrawSurface對象的Restore方法重新分配表面內存以及重新添加DirectDrawSurface對象。然后,重建相關表面的內容。

rc.Left = 0;

rc.Top = 0;

rc.Right = bm.width();

rc.Bottom = bm.height();

// Show the off-screen surface on the

//primary surface.

done = 0;

do

{

int retval;

retval = ddsPrimary.blt( rc, ddsOne, rc, 0);

if( retval == DD_OK )

{

//If the bitmap has been sUCcessfully

//copied, exit loop.

done = 1;

}

else if ( retval == DDERR_SURFACELOST )

{

while( ddsPrimary.Restore() != DD_OK &&

ddsOne.Restore() != DD_OK )

{

ReloadBitmap(ddsOne, szBitmap);

}

}

else if( retval != DDERR_WASSTILLDRAWING)

{

// Undetermined error; quit the loop.

done = 1;

}

} while( done == 0);

其他信息

本文提供了初始化和使用Java中DirectDraw SDK的背景和基本步驟。要獲得Java的DirectX SDK以及相關文檔,可以從http://www.microsoft.com/java/下載Microsoft SDK for Java 2.0(其中包含DirectX SDK)。其中還包括幾個示例程序,對于使用DirectX for Java創建動畫非常有用。這些例子列舉如下:

示例
目錄
示例內容

Ddex3
DDrawddex3ddraw.Html
DirectDraw的基本使用

Flipcube
d3dflipcubeD3D.html
3D立即模式的基本使用

Viewer
d3drmViewerdirect3dRM.html
Direct3D保持模式的完整使用

Castle
d3drmCastleCastle.html
Direct3D保持模式的高性能

DirectInput
dInputddex3dinput.html
操縱桿、鼠標、鍵盤和游戲鍵盤的使用

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩精品久久| 欧美日韩综合视频网址| 欧美性极品xxxx娇小| 国产精品看片资源| 亚洲精品国产美女| 欧美在线激情视频| 一本色道久久88综合亚洲精品ⅰ| 久久久国产精品免费| 日本久久久久亚洲中字幕| 久久高清视频免费| 欧美另类第一页| 亚洲欧美国产精品久久久久久久| 亚洲欧洲xxxx| 亚洲偷熟乱区亚洲香蕉av| 久久夜色精品亚洲噜噜国产mv| 日韩成人小视频| 久久免费在线观看| 亚洲欧美精品伊人久久| 国产一区欧美二区三区| 亚洲国产日韩欧美在线动漫| 欧美大片大片在线播放| 欧美激情精品久久久久久久变态| 亚洲一二在线观看| 91色在线观看| 久久国产精彩视频| 97超级碰碰人国产在线观看| 日韩激情片免费| 一区二区国产精品视频| 91av中文字幕| 日韩欧美国产中文字幕| 亚洲天堂网站在线观看视频| 亚洲va欧美va在线观看| 亚洲字幕在线观看| 久久视频在线免费观看| 日韩在线视频中文字幕| 色哟哟网站入口亚洲精品| 国产精品一区二区在线| www.亚洲成人| 欧美激情视频在线| 日韩精品在线观| 精品网站999www| 91中文字幕一区| 黑人狂躁日本妞一区二区三区| 亚洲国产毛片完整版| 国产视频丨精品|在线观看| 亚洲精品之草原avav久久| www欧美xxxx| 最近2019中文字幕第三页视频| 亚洲最大福利视频网站| 精品国产乱码久久久久酒店| 日本韩国欧美精品大片卡二| 亚洲成色777777女色窝| 欧美俄罗斯性视频| 国产三级精品网站| 国产黑人绿帽在线第一区| 欧美激情亚洲另类| 精品一区二区三区三区| 亚洲第一av网| 亚洲在线第一页| 日本免费久久高清视频| 日韩电影免费观看在线| 2019最新中文字幕| 欧美成人在线影院| 国产精品老女人精品视频| 欧美成人网在线| 热久久视久久精品18亚洲精品| 欧美性猛交xxxx免费看| 亚洲成人国产精品| 成人在线观看视频网站| 伊人伊成久久人综合网小说| 国产精品99久久久久久久久久久久| 5566日本婷婷色中文字幕97| 欧美精品videosex极品1| 久久精品91久久久久久再现| 欧美精品在线免费播放| 久久久www成人免费精品| 国产精品视频自拍| 日韩一区视频在线| 亚洲国产美女久久久久| 亚洲欧美日韩在线高清直播| 九九精品视频在线观看| 日韩欧美在线中文字幕| 国产精品视频免费观看www| 91精品国产综合久久香蕉922| 亚洲a成v人在线观看| 欧美激情视频一区| 欧美国产日本在线| 永久免费毛片在线播放不卡| 91wwwcom在线观看| 最近2019年好看中文字幕视频| 日韩精品中文字| 国产精品成人播放| 欧美精品aaa| 日韩精品视频免费在线观看| 成人美女av在线直播| 色婷婷综合久久久久中文字幕1| 国产精品成人aaaaa网站| 51ⅴ精品国产91久久久久久| 久久国产精品久久久久久久久久| 国产亚洲精品91在线| 日本久久久久久久久| 国产精品永久在线| 国产精品99久久久久久久久久久久| 亚洲国产精品久久91精品| 欧美在线视频a| 日韩激情av在线免费观看| 欧美一区二粉嫩精品国产一线天| 韩国精品美女www爽爽爽视频| 91性高湖久久久久久久久_久久99| 国产欧美一区二区三区视频| 亚洲欧美日韩区| 欧美有码在线观看视频| 日韩中文第一页| 欧美日韩ab片| 久久久久久久激情视频| 亚洲精品成人久久电影| 欧美精品免费在线观看| 九九久久久久99精品| 在线激情影院一区| 午夜免费久久久久| 日韩精品在线观看一区二区| 欧美精品第一页在线播放| 亚洲精品不卡在线| 91最新在线免费观看| 欧美日韩国产成人高清视频| 按摩亚洲人久久| 亚洲精品视频中文字幕| 欧美大片va欧美在线播放| 亚洲欧美另类在线观看| 日韩精品久久久久久久玫瑰园| 日韩精品有码在线观看| 精品女同一区二区三区在线播放| 欧美一区二三区| 国产日韩av在线| 2019中文字幕在线| 亚洲女人天堂网| 国产精品久久久久999| 亚洲成人黄色在线观看| 97色在线视频| 欧美日韩国产中文字幕| 国产99视频精品免视看7| 中文字幕精品—区二区| 日韩亚洲精品电影| 日韩亚洲欧美中文在线| 国产日韩欧美中文| 久久精品国产v日韩v亚洲| 久久夜色精品亚洲噜噜国产mv| 国产福利精品在线| 欧美另类交人妖| 欧美成人在线免费| 成人黄色免费网站在线观看| 欧美视频在线免费| 国产一区二区三区在线播放免费观看| 精品亚洲永久免费精品| 久久久视频在线| 亚洲综合中文字幕在线| 国a精品视频大全| 国产精品丝袜久久久久久高清| 欧美性猛交xxxxx水多| 欧美成人在线免费视频| 久久久在线观看| 国产精品自产拍在线观看中文| 中文字幕成人精品久久不卡| 久久精品中文字幕|