Re: [問題] 關於雙重緩衝區(應該是這麼稱呼)的問題

看板java作者 (十年~)時間13年前 (2012/05/26 20:53), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《livil80101 (Weil)》之銘言: : 問題一、 : paint() 與 update() 平時的作用是在做什麼? : ....這麼問好像怪怪的? : 我是在練習圖片轉換時發現有閃爍的問題,經GOOGLE所得知必須要用「雙重緩衝區」 : 而結果是一成功一失敗,看來只要再多練習便會成功 : 但是 : 僅僅只是一連串的程式碼是無法解決我的無知,我想知道的是更直接的東西 : 也就是原理 : 具網路上的說法,是在圖片的後面放了接下來的圖片,藉此迴避切換時所產生的閃爍 : 不過卻沒解釋為何要再宣告一個Image(這個我大概猜的到)還有一個 Graphics : 我所練習的版本一個是在 update() 裡面設置 paint(g) ,然後再改寫paint()的內容 : 另一個卻是改寫 update() ,然後在裡面使用 paint(宣告的Graphics) : 請問這兩個原理一樣嗎? : 原理為何? : 在我改寫 update() 之前,這個方法的作用是? 如果不針對程式碼來說,double-buffering 的原理是這樣: 1. 沒有使用 double-buffering 時,程式 GUI 在變換外觀時,就好像你要在一塊 白板上畫上多畫面連續的漫畫,你每畫上一個畫面(四格漫畫的一格)之後需要把白板 擦拭乾淨後,再畫上下一個(格)畫面。對觀賞的人來說看起來不是很舒服,因為會看 到白板擦拭乾淨後的畫面(一片空白)。(實際上所呈現的連續畫面是:漫畫格1->空白 畫面->漫畫格2->空白畫面->漫畫格3->空白畫面->...) 2. 使用 double-buffering 時,作法類似你先把漫畫的內容,每一個畫面都分別先畫 在一張紙上,然後一張接著一張地貼在白板上(後來貼上的直接蓋掉前一張),觀賞起來 就會有連續的效果。 實際上在程式裡實現 double-buffering 時倒是不必準備那麼多張紙,最基本是只準備 一張紙(image),總是把想要呈現的畫面(影像)先畫在紙上,然後把整張紙貼到白板( drawImage)。這裡用「貼」只是比喻,實際上程式對 off-screen image 所做的更動 並不會時時反映在 GUI component 上。一般常見的寫法是 GUI component 的 paint routine 單純畫出 off-screen image,這樣子的做法不能保證在更動(繪製) off- screen image 的過程中,該 image 的畫面不會繪製到 component 上,使用兩個 off- screen image 來輪流呈現會是比較妥當的做法。 heavy-weight component 的 update method 預設是負責以背景色塗滿整個 component(所謂的清空),在實作 double-buffering 時最基本就是先取消這個清空 component 的行為,順便把要呈現的畫面畫在 off-screen image 上,由 paint method 負責把 off-screen image 畫在 component。也可以讓 update method 直接 invoke paint method,由 paint method 負責在 off-screen image 上準備要呈現的 畫面與繪出 off-screen image。不管哪一種做法背後原理都相同。 有心要好好瞭解 painting 方面的東西,花點時間閱讀: http://java.sun.com/products/jfc/tsc/articles/painting/index.html -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.30.205

05/27 23:50, , 1F
又是英文!?
05/27 23:50, 1F

05/28 05:50, , 2F
英文得罪你什麼了!?
05/28 05:50, 2F

05/28 10:00, , 3F
哀號一下不犯法,只是... 認命吧..... [淚目]
05/28 10:00, 3F
文章代碼(AID): #1FmD9Xzv (java)
文章代碼(AID): #1FmD9Xzv (java)