Re: [請益] 請問如何共用圖片或動畫

看板GameDesign (遊戲設計)作者 (謊言接線生)時間16年前 (2008/09/22 18:01), 編輯推噓7(700)
留言7則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《jijuan (雞卷)》之銘言: : 假設我有A B C三個物件 : 它們都會用到同一張(同一組)圖片(動畫) : 假設物件的建構式必須傳入圖片(動畫) : Img A = new Img("D://test.gif"); : Img B = new Img("D://test.gif"); : Img C = new Img("D://test.gif"); : 類似這樣 因為A一開始已經載入test.gif這張圖了 : 有沒有辦法B跟C使用跟A同一份就好了 : 而不用多載兩次到記憶體裡面 本來如果單單修改你這個架構,最簡單就是你多做一個建構式,如: Img A = new Img("D://test.gif"); Img B = new Img(A); // 直接去A裡面挖指標設給B 但這樣會發生依賴性的問題,A被delete掉時解構式要不要把那圖清掉呢?清的 話B再去用原本的指標就爛掉了,可是不清的話A跟B都清掉後沒人去清,你也沒任何 辦法去追蹤誰是最後一個該清的。 比較好的方法可能都是要更動架構,比如你要另外維護一個ImgPool,它裡面只 存了一張接一張會用到的圖,並給每一張圖一個Unique的id。而Img物件本身不提供 存圖的空間,它只拿著它需要圖的id,在需要時持id去跟ImgPool討指標來處理自己 的行為。 ○ImgPool [基本功能] 1.可以讀入一張圖進Pool裡並給予Unique id(可由使用者指定,只要保持Unique) 2.可以清掉Pool裡的一張圖 3.可以讓其它(特定)物件用id取得圖的內容,id若不存在就傳回NULL [進階功能] 1.可以記錄每張圖被使用的時間點或使用頻率等等資訊,並可以設定Pool的大小,若 發現Pool滿又讀入圖時自動以某些規則(最久遠、使用頻率、特殊設定)挑選可以 被清掉的圖先清掉 2.可以給予一個並未真正讀入的圖id,當其它物件要求的id存在但並未讀入時就主動 去讀進來 這樣你要讓A跟B用同一張圖,只要給他們拿一樣的id就好了。而不用的時候你把 A跟B砍光光也不會發生Memory Leak,因為真正管圖的是ImgPool,只要ImgPool被砍 時會去清光所有它管的圖就好了。 利用這種模式除了管理以外,還有一些靈活的好處。比如說你可以直觀用改Img 中持有的id讓它去取到ImgPool的另一張圖,但其實你也可以讓ImgPool用某一個id在 不同情況下去讀不同的圖。前者用在切換快速且頻繁,所以你預先把每張圖都先讀進 Pool以空間換時間減少讀取的情況,後者則可以用在切換一次後不會很快又再切換, 因此每次都只讀眼前要用的這張圖以精簡id對應的情況。 -- 「如果你還知道牆壁或地板是硬的,就不該老是去用頭撞啊!」 「妳在說什麼,為什麼我會沒事去用頭撞牆撞地板啊!」 「不然,還有什麼理由能解釋你怎麼這麼笨啊!」 --蘭娜.席斯塔 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.167.9.1

09/22 20:15, , 1F
支持!
09/22 20:15, 1F

09/22 20:43, , 2F
寫真好:> M了
09/22 20:43, 2F

09/22 21:27, , 3F
09/22 21:27, 3F

09/22 23:57, , 4F
觀念清楚
09/22 23:57, 4F

09/23 09:58, , 5F
感謝 ddavid 詳細的解說
09/23 09:58, 5F

09/24 19:21, , 6F
09/24 19:21, 6F

09/24 19:57, , 7F
讚~感謝
09/24 19:57, 7F
文章代碼(AID): #18rspauY (GameDesign)
討論串 (同標題文章)
文章代碼(AID): #18rspauY (GameDesign)