麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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
操縱桿、鼠標、鍵盤和游戲鍵盤的使用

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三级国产三级在线 | 99麻豆久久久国产精品免费 | 99国内精品 | 国产福利不卡一区二区三区 | 免费一级特黄欧美大片勹久久网 | 国产精品99久久久久久董美香 | 久久精品亚洲一区二区三区观看模式 | 欧洲成人一区 | 久久精品日产第一区二区三区 | 国产精品刺激对白麻豆99 | 欧美视频在线一区二区三区 | 欧美成人黄色片 | 密室逃脱第一季免费观看完整在线 | 国产一级毛片高清视频 | 精品一区二区三区免费 | 1级片在线观看 | 97人人草 | 国产一区免费视频 | 蜜桃精品视频 | 日本高清视频网站www | 精品成人免费一区二区在线播放 | 亚洲精品午夜视频 | 91美女视频在线 | 久久久久一区二区三区四区五区 | 免费看国产视频 | 欧美男女爱爱视频 | 免费永久看羞羞片网站入口 | 线观看免费完整aaa 一二区成人影院电影网 | 干少妇av| 成人一区二区在线观看视频 | 亚洲第一视频在线 | 国产资源在线播放 | 美女羞羞视频网站 | 99综合视频 | 黄色特级| 国产黄色网页 | 美女色影院 | 二区视频| 欧美一级高潮片免费的 | 免费中文视频 | 精品一区二区久久久久久久网精 |