java硬件加速

java硬件加速

ID:38192468

大?。?6.00 KB

頁數(shù):3頁

時間:2019-05-24

java硬件加速_第1頁
java硬件加速_第2頁
java硬件加速_第3頁
資源描述:

《java硬件加速》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。

1、小弟玩Java這幾年,總有一件揮之不去地煩惱。你說吧這玩意兒啥都好,偏偏就是慢。尤其是實時繪制大塊圖片,一卡一卡地那是相當?shù)芈Q郯桶统蛑切┩鍰irectDraw的把圖像載到OffScreenSurface里去輕輕松松就能讓FPS上百。那時候,我就瞅著啊,哪天Java也能玩顯存操作呢?終于,我們盼星星盼月亮終于盼來了Java2D和java.awt.image.VolatileImage~以前,要繪制一副圖片,尤其是帶部分透明度的大幅圖像,要花上10ms級的時間(我是指在我的爛機器上,嗯),這在游戲這樣要求高速圖像更新的應用里根本是不能容忍的。為什么這么慢

2、?一般計算機數(shù)字圖像的繪制其實是圖像從一塊存儲區(qū)域轉(zhuǎn)移到系統(tǒng)顯存(VRAM)中某個位置的過程,在圖像轉(zhuǎn)移完成后再由顯卡負責整個屏幕信號的轉(zhuǎn)換和輸出,然后經(jīng)過顯示器將模擬或數(shù)字信號轉(zhuǎn)換成人眼能分辨的圖像。只有第一個階段是被應用程序控制的,圖像轉(zhuǎn)移過程的好壞決定了整個圖像的渲染速度。一般,圖像的轉(zhuǎn)移分為以下幾種:內(nèi)存到顯存的匹配格式圖片轉(zhuǎn)移;顯存到顯存的圖片轉(zhuǎn)移;內(nèi)存到顯存的不匹配格式圖片轉(zhuǎn)移;圖像轉(zhuǎn)移的速度,取決于兩個因素:格式和位置;所謂位置,便是指圖像的源和目的,一般從內(nèi)存到顯存比較從顯存到顯存慢。要提高渲染速度,除盡量把圖片擱顯存里以外,還要盡量減少其

3、中傳輸次數(shù)和總的傳輸數(shù)據(jù)量;所謂格式,是指源和目的的圖像格式是否匹配,如果不匹配,會造成轉(zhuǎn)換時間等損失。諸位有沒有看過《東方快車謀殺案》?東方快車入俄羅斯邊境后要停車一晚上……換輪子,因為此國的鐵路寬度與領國不同……這個道理是一樣的,使用匹配格式繪圖,能大大增加渲染速度。小弟我根據(jù)實驗,得出了三種轉(zhuǎn)移方式的比較:內(nèi)存到顯存的不匹配格式圖片轉(zhuǎn)移,慢~到~爆~;內(nèi)存到顯存的匹配格式圖片轉(zhuǎn)移,較快;顯存到顯存的圖片轉(zhuǎn)移,貝戒~快~口阿~;下面講講實現(xiàn)上述三者的方法:先講慢到爆的那個。如果不用任何加速手段,僅采用往awt組件上drawImage(),結果就是慢到爆

4、,因為格式不匹配,屬于第三種。既然已經(jīng)這么慢了,于是這種渲染方法又附帶一個缺點:閃爍;接下來,一般最常用的手段是用Swing來繪圖,因為它內(nèi)建了自動顯存緩沖,因此渲染速度大大增加而且不用擔心閃爍問題,轉(zhuǎn)移方式屬于第一種,且是懶人的首選。當然,我們也可以在AWT里手動實現(xiàn)顯存內(nèi)緩沖,畢竟Swing就是構造在AWT之上的;最后一種最最王道的方法,需要手動把圖片轉(zhuǎn)移進顯存咱們分成3步走:首先,下面這個巨長的語句可以申請一塊與顯存圖像格式相容的內(nèi)存,它可以用來1離屏緩存和2存儲圖像:Imagebuffer=GraphicsEnvironment.getLocalG

5、raphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(w,h,Transparency.BITMASK);//最后一個參數(shù)指定透明方式類似的,加上幾個字母后這個語句能夠制造一塊可以用的顯存Imagebuffer=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createC

6、ompatibleVolatileImage(w,h);(對了,上述方法可以用Component的createImage和createVolatileImage代替,效果一樣,缺點是不能手動指定透明方式而且代碼不夠華麗,不能用來嚇唬小朋友)接著用ImageIO載入圖像文件Graphics2Dg=buffer.createGraphics();g.drawImage(ImageIO.read("c:/pic.png"),null,0,0);g.dispose();這樣一次性地把內(nèi)存圖像以匹配格式的形式轉(zhuǎn)移入內(nèi)存/顯存那么接下來使用緩存的過程就非常簡單了,只要

7、將欲繪制的圖像畫在離屏緩沖里,然后這么覆蓋Component的繪制方法:publicvoidupdate(Graphicsg){paint(g);}publicvoidpaint(Graphicsg){if(offScreenBuffer==null)return;g.drawImage(offScreenBuffer,0,0,null);//顯存到顯存的Blitting}這樣你就可以用幾乎接近C++的速度來繪制圖像啦說到這里VolatileImage是千好萬好,但是它其實有兩個致命的缺點:第一,apidoc里這么說:Thedrawingsurfaceof

8、animage(thememorywheretheimagecon

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。