Re: [請益] 請問如何共用圖片或動畫
※ 引述《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
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
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
討論串 (同標題文章)
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章