精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

雙緩沖原理在awt和swing中實(shí)現(xiàn)消除閃爍的方法

開發(fā) 后端
對(duì)于雙緩沖的分析是在坦克大戰(zhàn)游戲的設(shè)計(jì)時(shí)開始的,由于當(dāng)時(shí)忙于游戲的整體設(shè)計(jì),所以對(duì)這一個(gè)問題沒有進(jìn)行詳細(xì)的研究,現(xiàn)在就這個(gè)問題來談?wù)勛约旱囊恍┛捶ā?/div>

對(duì)于雙緩沖的分析是在坦克大戰(zhàn)游戲的設(shè)計(jì)時(shí)開始的,由于當(dāng)時(shí)忙于游戲的整體設(shè)計(jì),所以對(duì)這一個(gè)問題沒有進(jìn)行詳細(xì)的研究,現(xiàn)在就這個(gè)問題來談?wù)勛约旱囊恍┛捶ā?/P>

分析前提出幾個(gè)問題:

1、為什么當(dāng)想屏幕上添加圖片之后會(huì)有明顯的閃爍現(xiàn)象?

2、在awt中如何實(shí)現(xiàn)雙緩沖?

3、如何理解swing內(nèi)置雙緩沖以及比較他與awt中消除閃爍的方法區(qū)別在哪里?

首先我們來解答第一個(gè)問題:

我們?cè)谄聊簧献岳L圖形或者是添加圖片都是要通過所在畫布的重繪來實(shí)現(xiàn)的,因此閃爍的出現(xiàn)必然與重繪機(jī)制有著一些關(guān)聯(lián)。在awt中對(duì)于窗體畫布的重繪其條用順序是repaint() —>update()—>paint();我們來看看update()的源碼:

Java代碼

  1. /**     
  2.      * Updates the container.  This forwards the update to any lightweight    
  3.      * components that are children of this container.  If this method is    
  4.      * reimplemented, super.update(g) should be called so that lightweight    
  5.      * components are properly rendered.  If a child component is entirely    
  6.      * clipped by the current clipping setting in g, update() will not be    
  7.      * forwarded to that child.    
  8.      *    
  9.      * @param g the specified Graphics window    
  10.      * @see   Component#update(Graphics)    
  11.      */    
  12.     public void update(Graphics g) {     
  13.         if (isShowing()) {     
  14.             if (! (peer instanceof LightweightPeer)) {     
  15.                 g.clearRect(00, width, height);     
  16.             }     
  17.             paint(g);     
  18.         }     
  19. }    

 

從這里我們可以清晰的看到,update中有一個(gè)清屏的作用,即g.clearRect(0, 0, width, height);然后再在下面調(diào)用paint(g),函數(shù)進(jìn)行重繪。因此到這里的話我們可以在一定程度上對(duì)底層的重繪機(jī)制有一個(gè)了解了。

現(xiàn)在我們明白了,屏幕上之所以出現(xiàn)閃爍是因?yàn)樵趗pdate()方法內(nèi)先要嘩嘩的清空屏幕上原有的東西,然后又嘩嘩的往上畫,所以在我們需要不斷重繪的屏幕上出現(xiàn)閃爍是必然的了,哪怕CPU的速度快之又快。

通過上述的分析,在awt中我們解決閃爍問題的思路也因該隨之產(chǎn)生,即重寫update()函數(shù)的代碼,改變它的工作原理。于是我們引進(jìn)一段在坦克大戰(zhàn)中已經(jīng)重寫了的update()方法。其中通過改變重繪函數(shù)paint(g)重繪的畫布對(duì)象,由窗體的畫布變?yōu)榻厝〉膱D片上的畫布gImage,這樣的話就很大程度上改善這個(gè)問題了。具體如下

Java代碼

  1. // 重寫update方法,先將窗體上的圖形畫在圖片對(duì)象上,再一次性顯示     
  2.     public void update(Graphics g) {     
  3.         if (offScreenImage == null) {     
  4.             // 截取窗體所在位置的圖片     
  5.             offScreenImage = this.createImage(WIDTH, HEIGHT);     
  6.         }     
  7.         // 獲得截取圖片的畫布     
  8.         Graphics gImage = offScreenImage.getGraphics();     
  9.         // 獲取畫布的底色并且使用這種顏色填充畫布(默認(rèn)的顏色為黑色)     
  10. Color c = Color.BLACK;     
  11.         gImage.setColor(c);     
  12.         gImage.fillRect(00, WIDTH, HEIGHT); // 有清除上一步圖像的功能,相當(dāng)于gImage.clearRect(0, 0, WIDTH, HEIGHT)     
  13.         // 將截下的圖片上的畫布傳給重繪函數(shù),重繪函數(shù)只需要在截圖的畫布上繪制即可,不必在從底層繪制     
  14.         paint(gImage);     
  15.         //將接下來的圖片加載到窗體畫布上去,才能考到每次畫的效果     
  16.         g.drawImage(offScreenImage, 00null);     
  17.     }    

 

其實(shí)一言以蔽之就是通過重寫update()方法改變重繪函數(shù)paint(g)重繪的畫布對(duì)象g。

以上的討論我們都是在awt中進(jìn)行,然后大家就想將繼承Frame改為JFrame試試,結(jié)果一試就傻眼了,屏幕上居然又是嘩嘩的閃了,真是辛辛苦苦去改變,一下回到解放前,我們不是在update()中實(shí)現(xiàn)雙緩沖機(jī)制了嗎?請(qǐng)看下面的一個(gè)對(duì)比測(cè)試:

(1)在awt中測(cè)試update():

Java代碼

  1. // 重寫update方法,先將窗體上的圖形畫在圖片對(duì)象上,再一次性顯示     
  2.     public void update(Graphics g) {     
  3.              
  4.         System.out.println("awt的update()在此...");     
  5.              
  6.         if (offScreenImage == null) {     
  7.             // 截取窗體所在位置的圖片    

 

看看結(jié)果:

 

 

要是沒覺得意外的話就繼續(xù)往下看

在swing中測(cè)試update():

Java代碼

  1. // 重寫update方法,先將窗體上的圖形畫在圖片對(duì)象上,再一次性顯示     
  2.     public void update(Graphics g) {     
  3.              
  4.         System.out.println("Swing的update()在此...");     
  5.              
  6.         if (offScreenImage == null) {     
  7.             // 截取窗體所在位置的圖片    

 

結(jié)果是:

 

 

是不是有點(diǎn)吃驚了,在我沒有故意編出這個(gè)東西忽悠大伙的前提下我們可以得知,在swing中update()方法并沒有像awt的update()那樣隨時(shí)被調(diào)用,所以就很好解釋為什么該為繼承JFrame之后屏幕重繪閃爍了。就是你認(rèn)為自己改寫了update()方法就會(huì)解決這個(gè)問題是一廂情愿的,系統(tǒng)并不買你的帳,調(diào)都沒去調(diào)用吶!

那么怎么通過其他的方法消除swing中的閃爍問題呢,我們此時(shí)再回到出發(fā)點(diǎn),雙緩沖的核心就是改變paint(g)中的畫布,那么好了,我直接在paint(g)函數(shù)里實(shí)現(xiàn)不就得了,下面再來看這一段代碼:

Java代碼

  1. public void paint(Graphics g) {     
  2.         // 在重繪函數(shù)中實(shí)現(xiàn)雙緩沖機(jī)制     
  3.         offScreenImage = this.createImage(WIDTH, HEIGHT);     
  4.         // 獲得截取圖片的畫布     
  5.         gImage = offScreenImage.getGraphics();     
  6.         // 獲取畫布的底色并且使用這種顏色填充畫布,如果沒有填充效果的畫,則會(huì)出現(xiàn)拖動(dòng)的效果     
  7.         gImage.setColor(gImage.getColor());     
  8.         gImage.fillRect(00, WIDTH, HEIGHT); // 有清楚上一步圖像的功能,相當(dāng)于gImage.clearRect(0, 0, WIDTH, HEIGHT)     
  9.     
  10.         // 調(diào)用父類的重繪方法,傳入的是截取圖片上的畫布,防止再?gòu)淖畹讓觼碇乩L     
  11.         super.paint(gImage);     
  12.     
  13.         // 當(dāng)游戲沒有結(jié)束的時(shí)候繪出對(duì)戰(zhàn)雙方     
  14.         if (!getGameOver()) {     
  15.             // 畫出自己的坦克     
  16.             paintMyTank(gImage);     
  17.             // 畫出自己坦克發(fā)射的子彈     
  18.             paintMyBullet(gImage);     
  19.             // 畫出敵方坦克     
  20.             paintEnemyTank(gImage);     
  21.             // 畫出敵方坦克發(fā)射的子彈     
  22.             paintEnemyBullet(gImage);     
  23.         }     
  24.     
  25.         // 畫出草地     
  26.         paintGrass(gImage);     
  27.         // 畫出小河     
  28.         paintRiver(gImage);     
  29.         // 畫出石頭     
  30.         paintStone(gImage);     
  31.         // 畫出各種道具     
  32.         paintTool(gImage);     
  33.     
  34.         // 將接下來的圖片加載到窗體畫布上去,才能考到每次畫的效果     
  35.         g.drawImage(offScreenImage, 00null);     
  36.     }   

 

有一些相似的部分吧,其中最重要的是super.paint(gImage)這句,改變畫布在這里,消除閃爍也是在這里!!!

下面我們?cè)偬接懽詈笠粋€(gè)問題,即如何理解swing中內(nèi)置雙緩沖,我們首先從繼承體系來看,JFrame->Frame->Window->Container->Component,在Frame中的update()方法是從Container中繼承而來的,而JFrame中卻重寫了update()方法如下

Java代碼

  1. /**     
  2.  * Just calls paint(g).  This method was overridden to     
  3.  * prevent an unnecessary call to clear the background.    
  4.  *    
  5.  * @param g the Graphics context in which to paint    
  6.  */    
  7. public void update(Graphics g) {     
  8.     paint(g);     
  9. }   

 

與之前的同名方法相比,這里直接調(diào)用了paint()函數(shù)而沒有clearRect(),也就是清屏的方法,這里他試圖不通過清屏來阻止閃爍的發(fā)生。這也就是JFrame本身的一種處理方法。

以上是通過自己對(duì)雙緩沖的一些理解,其中還有很多問題,希望牛人們能夠積極指出來,并且一起討論這個(gè)問題。

【編輯推薦】

  1. 探秘JDK 7之二:半透明和任意形狀的窗口
  2. 探秘JDK 7:將會(huì)出現(xiàn)新的語言特性
  3. 我們真的能沒有Java嗎?
  4. 探秘Java 7:JVM動(dòng)態(tài)語言支持詳解
  5. 探秘Java 7新增垃圾回收器G1特性
責(zé)任編輯:金賀 來源: ITEYE博客
相關(guān)推薦

2009-07-14 15:01:02

AWT和Swing

2009-07-17 09:36:14

SWT和Swing的區(qū)

2009-07-17 10:11:55

AWT和Swing

2009-07-17 09:07:20

2009-07-17 11:13:46

AWT和SwingSwing組件

2009-07-10 17:20:38

Swing構(gòu)件AWT構(gòu)件

2009-07-15 16:39:51

AWT和Swing

2009-07-10 17:03:17

AWT組件Swing組件

2009-07-16 13:37:33

Swing和AWT

2009-07-14 12:58:49

AWT和Swing

2009-07-16 13:50:28

AWT和Swing

2009-07-17 15:30:30

JFaceAWT和SWTSwing

2009-07-14 15:12:36

SwingSWT和AWT

2009-07-17 10:01:14

Swing和AWT

2009-07-10 15:41:27

Swing AWT

2009-07-17 10:25:41

AWT和SwingSWT

2009-07-15 15:57:28

AWT或Swing

2009-07-15 10:06:54

Swing實(shí)現(xiàn)MDI

2009-07-16 08:53:03

Swing任務(wù)Swing線程

2011-04-15 17:33:39

SWINGAWT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩黄色影院| 久久久久性色av无码一区二区| 中文字幕影音在线| 国产三级精品在线| 99高清视频有精品视频| 日韩精品久久久久久久酒店| 成人看的羞羞网站| 亚洲国产古装精品网站| 激情视频免费网站| √天堂8资源中文在线| 国产清纯美女被跳蛋高潮一区二区久久w| 国产精品香蕉国产| 久久高清免费视频| 午夜av一区| 国产偷国产偷亚洲清高网站| 亚欧美在线观看| 国产在线精彩视频| 亚洲人成精品久久久久久| 精品亚洲欧美日韩| 国产日韩欧美中文字幕| 狂野欧美性猛交xxxx巴西| 久久av在线看| 亚欧精品视频一区二区三区| 久久1电影院| 91精品婷婷国产综合久久| 久久婷婷国产精品| bl视频在线免费观看| 国产精品免费视频网站| 久久精品国产99精品国产亚洲性色| 中文字幕永久在线观看| 999亚洲国产精| 色综合色综合久久综合频道88| 无码人妻aⅴ一区二区三区69岛| av成人综合| 欧美一区二区三区婷婷月色 | 欧美成熟视频| 中文字幕自拍vr一区二区三区| 一边摸一边做爽的视频17国产| 国产一区二区三区精品在线观看 | 国际精品欧美精品| 日韩av网站导航| 亚洲国产精品第一页| 日韩欧乱色一区二区三区在线| 色婷婷综合中文久久一本| 免费拍拍拍网站| 免费在线看污片| 亚洲精品乱码久久久久久久久| 亚洲欧洲日夜超级视频| 国产在线视频网站| 国产欧美日韩激情| 亚洲电影网站| av在线播放免费| 日本一区二区综合亚洲| 日本一区二区三区精品视频| 久久国产精品高清一区二区三区| 91久色porny| 免费电影一区| 免费理论片在线观看播放老| 91视频观看视频| 久99久在线| 欧美在线一卡| 国产欧美一区二区在线| 日本一区美女| 国产www.大片在线| 国产精品色眯眯| 亚洲一区二区三区精品动漫| 香蕉视频在线播放| 亚洲婷婷综合久久一本伊一区| 亚洲精品成人a8198a| 在线免费黄色| 一区二区三区 在线观看视频| 91免费版看片| 国产在线观看www| 在线欧美一区二区| 亚洲图片 自拍偷拍| 精品一区二区三区免费看| 日韩欧美一区二区久久婷婷| 成人啪啪18免费游戏链接| 高潮按摩久久久久久av免费| 日韩高清av在线| 国产亚洲精品熟女国产成人| 91亚洲国产高清| 欧美高清性猛交| 国产精品久久久久久久妇| 久久久久久一区二区| 国产精品久久久久久久av电影| 中文字幕在线观看欧美| 国产精品中文有码| 麻豆av一区| 欧美尤物美女在线| 亚洲午夜av在线| 欧美一级黄色片视频| 日韩成人一区| 亚洲国产精品人久久电影| 国产黄片一区二区三区| 在线国产一区二区| 欧美在线欧美在线| 国产裸体永久免费无遮挡| 成人激情黄色小说| 亚洲免费不卡| 黄在线观看免费网站ktv| 欧美视频自拍偷拍| 91精品又粗又猛又爽| 欧美精品一二| 97在线免费观看| 国产又粗又猛又黄又爽| 99久免费精品视频在线观看| 伊人久久大香线蕉综合75| 国产福利电影在线播放| 91精品免费观看| 女人又爽又黄免费女仆| 欧美久久视频| 成人妇女免费播放久久久| 色鬼7777久久| 亚洲一区日韩精品中文字幕| 国内自拍视频网| 日本一区福利在线| 色综合久久88| 国产又爽又黄又嫩又猛又粗| 成人毛片视频在线观看| 中文字幕一区二区三区四区五区| 美女100%一区| 亚洲精品mp4| 草视频在线观看| 麻豆高清免费国产一区| 欧美日韩精品一区| 黄视频免费在线看| 欧美精品一区二区三区在线播放| 在线观看亚洲网站| 日本欧美韩国一区三区| 久久大片网站| av2020不卡| 精品久久久久久久久久久久久久久久久| 97人妻人人揉人人躁人人| 国产日韩免费| 精品国产乱码久久久久软件| 亚洲资源一区| 3d成人h动漫网站入口| 亚洲毛片亚洲毛片亚洲毛片| 视频一区二区国产| 欧美日韩一区在线视频| 黄色污网站在线观看| 亚洲国产成人精品久久久国产成人一区 | 欧美大尺度激情区在线播放| 国产精品亚洲lv粉色| 国产精品污网站| 一区二区三区网址| 久久社区一区| 成人写真福利网| 黄色动漫在线观看| 日韩丝袜美女视频| 麻豆亚洲av熟女国产一区二| 国产精品一区二区在线播放| 在线看成人av电影| 国产免费av国片精品草莓男男 | 操人在线观看| 亚洲精品一区中文字幕乱码| 久久亚洲精品国产| 久久久久99精品国产片| 久久久久狠狠高潮亚洲精品| 国产99久久| 国产精品久久久久久久av电影| 自拍视频在线播放| 正在播放一区二区| 久久久美女视频| 99九九99九九九视频精品| 能在线观看的av| 狠狠色狠狠色综合婷婷tag| 国产精品第一页在线| 免费的黄网站在线观看| 日韩一二三区不卡| 日韩xxx高潮hd| 久久久久久久综合狠狠综合| 孩娇小videos精品| 欧美日本在线| 免费一区二区三区在在线视频| 国产日韩另类视频一区| 色哟哟入口国产精品| 性生交生活影碟片| 欧美日韩国产精品一区| 懂色av蜜桃av| 国产91在线看| 国产精品亚洲二区在线观看| 久久美女视频| 国产丝袜不卡| 99re久久| 国内精品小视频在线观看| 国产一二三区在线| 日韩欧美三级在线| 51国产偷自视频区视频| 综合精品久久久| 亚洲av无码成人精品国产| 免费视频最近日韩| 成人免费在线网| 大胆日韩av| 国外成人在线视频网站| 欧美黄页免费| 91成品人片a无限观看| 色开心亚洲综合| 亚洲国产精彩中文乱码av| 亚洲精品国产欧美在线观看| 亚洲蜜桃精久久久久久久| aa一级黄色片| 国产福利电影一区二区三区| 欧美 日韩精品| 欧美不卡视频| 亚洲国产精品久久久久婷婷老年| 成人动漫视频| 国产在线观看精品| 自拍在线观看| 久久久久一本一区二区青青蜜月| 午夜视频在线观看网站| 精品亚洲永久免费精品| 国产青青草视频| 色偷偷88欧美精品久久久| 日韩精品视频播放| 伊人色综合久久天天| 亚洲精品成人av久久| 99久久精品国产毛片| 亚洲熟女一区二区三区| 久久激情五月激情| 激情网站五月天| 国产精品久久久免费| 99热这里只有精品免费| 国产精品7m凸凹视频分类| 欧美动漫一区二区| 露出调教综合另类| 岛国视频一区免费观看| 成人av在线播放| 国产伦精品一区二区三区精品视频| 色一区二区三区| 性日韩欧美在线视频| 色女人在线视频| 久久国产精品电影| 久草免费在线观看| 久久激情视频久久| 色网站免费在线观看| 在线观看91久久久久久| 男人天堂网在线观看| 日韩精品免费在线| 五月激情婷婷综合| 日韩av影视综合网| 欧美日韩伦理片| 亚洲午夜性刺激影院| 欧美一区二区少妇| 亚洲精品一区中文| 男女视频在线观看免费| 亚洲欧美另类自拍| 久久精品国产亚洲a∨麻豆| 亚洲欧美综合区自拍另类| 欧美老女人性开放| 国产亚洲精品va在线观看| 黄色在线播放| 久久精品91久久久久久再现| 国产福利视频在线观看| 久国内精品在线| 国产高清视频色在线www| 欧美在线免费观看| 成人在线视频免费看| 成人国产精品av| 久久综合给合| 精品产品国产在线不卡| 最新亚洲精品| 一区二区三区国| 欧美a级一区| 久久久噜噜噜www成人网| 日韩综合一区二区| 91在线第一页| 99久久精品国产一区| 少妇av片在线观看| 亚洲免费资源在线播放| 成年人免费看毛片| 欧美亚洲综合色| 国产成人久久精品77777综合| 亚洲第一区中文字幕| 免费动漫网站在线观看| 超薄丝袜一区二区| 免费毛片b在线观看| 国产精品久久久久久av下载红粉| 欧美成年网站| 欧美亚洲精品日韩| 亚洲最大av| 日韩avxxx| 国产毛片精品视频| 蜜桃传媒一区二区亚洲av| 国产精品美女久久久久aⅴ国产馆| 人妻人人澡人人添人人爽| 亚洲永久精品国产| 五月天婷婷激情| 欧美日免费三级在线| 黄色一级大片在线免费看国产一 | 色窝窝无码一区二区三区| 国产视频欧美视频| 在线免费av电影| 26uuu亚洲伊人春色| 日韩精品第一| 91传媒在线免费观看| 欧美精选一区二区三区| 亚洲第一综合网站| 欧美福利电影在线观看| 色综合久久久久无码专区| 久久精品日产第一区二区 | 国产福利不卡视频| www.日本高清视频| 亚洲高清免费在线| 国产精品视频a| 日韩av网址在线| 美女隐私在线观看| 国产激情视频一区| 亚洲精品一区在线| 夜夜爽www精品| 亚洲欧美日韩国产一区二区| 小早川怜子一区二区三区| 国产日韩欧美在线一区| 久久久久久久久精| 欧美一级免费观看| 国产有码在线| 国内精品模特av私拍在线观看| 日韩成人精品| 日韩高清在线播放| 性感少妇一区| 精品伦一区二区三区| 国产精品免费看片| 一级久久久久久| 亚洲精品第一页| 2024最新电影免费在线观看| 国产成人高清激情视频在线观看| 无人区乱码一区二区三区| 色呦呦网站入口| 日韩一区精品字幕| 亚洲天堂资源在线| 天天操天天干天天综合网| 国产不卡av在线播放| 久久av在线播放| 巨大黑人极品videos精品| 国产一区二区高清不卡| 在线日韩视频| 伊人av在线播放| 亚洲精品第一国产综合野| 在线免费观看一级片| 亚洲人成在线观看网站高清| 英国三级经典在线观看| 国产精品一区二区三区观看| 亚洲激情影院| 波多野吉衣在线视频| 亚洲欧美一区二区三区孕妇| 一级黄色免费看| 在线丨暗呦小u女国产精品| 国产原创一区| 色一情一乱一伦一区二区三区 | 久久久久久久久久一区二区| 久久久国产午夜精品 | 欧美精品自拍| 91传媒理伦片在线观看| 亚洲精品成人悠悠色影视| 韩国av电影在线观看| 欧美美最猛性xxxxxx| 日韩精品免费视频一区二区三区 | 亚洲高清免费一级二级三级| 国产日韩一级片| 久久精品欧美视频| 欧美日韩亚洲国产| 伊人久久av导航| 国产一区不卡精品| 国产精品免费av一区二区| 亚洲精品不卡在线| 亚洲欧美一区二区三区| 久久福利电影| 亚洲精品字幕| 国产调教在线观看| 91精品欧美福利在线观看| aa视频在线观看| 久久99精品久久久久久三级| 久久久久国产一区二区| 日韩av片在线免费观看| 67194成人在线观看| 色图在线观看| 久久久久天天天天| 蜜桃精品视频在线观看| 国产三级国产精品国产国在线观看| 日韩欧美一区二区在线视频| 日本不卡网站| 日韩免费一区二区三区| 免费看日韩精品| 色婷婷在线视频观看| 亚洲成**性毛茸茸| 久久91视频| 99久久免费观看| 欧美国产日韩精品免费观看| 国产一区二区网站| 欧美一级成年大片在线观看 | 亚洲最新免费视频| 国产高清亚洲一区| 欧美一区二区三区四| 久久精品视频在线播放| 成人看片爽爽爽| 岛国毛片在线播放| 亚洲午夜一二三区视频| 色三级在线观看| 久久精品国产精品国产精品污|