【RM教學 2.0】RMMV 有關於讀取圖片的運作

【RM教學 2.0】RMMV 有關於讀取圖片的運作

By chimaki No comments

在 MV 1.5.2 裡面追加了圖片快取限制的插件功能,同時底層也追加了一些相關code ,包含ImageManager.load /ImageManager.request / ImageManager.reserve 等function,因為一直搞不懂差別,今天就來分享一下目前研究的結果。



先來個結論的概念:

ImageManager.request :
最容易在記憶體中被砍掉的,記憶體只要超過限制或是在進行清除圖片的時候就會清除

ImageManager.load :
在記憶體中次要的圖片,只要超過Community_Basic.js 中設置的限制,就會被刪除

ImageManager.reserve :
會被強制保留在記憶體中的圖片,只要不在記憶體超量的狀況下,圖片就不會被清除(依照時間先後來清除)

//不管何種讀圖片,每個圖片在讀取的時候都會進行一次記憶體清除判斷
//所有讀取圖片都會先判斷快取中是否有這圖片,再決定是否要create一個新的記憶體來儲存圖片

接著我們來看一下 load , request, reserve 三者的差別
RMMV

在此,我們可以看到 load與request 都會進入到
this._imageCache.add
_imageCache.add 除了將圖片加入快取之外,還會進行 _truncateCache();

然而,reserve 會直接呼叫loadNormalBitmap,所以也會進入this._imageCache.add階段
此外,跑完loadNormalBitmap之後會再追加this._imageCache.reserve

我們把 add /reserve / _truncateCache 這三個function 放在一起來觀察

RMMV

這邊可以發現 add在檢查並把圖片塞入cache的時候,就會 進行一次快取檔案整理,也就是_truncateCache
而reserve 在塞入快取之後,只有把剛才的快取加上reservationId

//前面有提到reserve 最後也是會跑loadNormalBitmap 所以實際上所有圖片進行讀取的時候都會進行一次快取資料整理

在判斷是否要清除圖片的之前,_truncateCache 裡面進行了圖片被記錄到快取後的時間排序 #sort的地方,
再來進入sizeLeft > 0 || this._mustBeHeld(item) 的判斷決定是否清除圖片,
// 這邊代表設定好的記憶體只要還夠就不會清除圖片

來看一下_mustBeHeld
RMMV

這邊判斷了幾個內容
如果是request ,在超過設定好的記憶體時,圖片快取就會被清除。
如果是reserve 就不會在允許的狀況下被清除
如果圖片還在讀取中也不會被清除

那麼,記憶體怎麼計算?
以內建的方式計算來說 ,快取的預設值為 10 * 1000 * 1000 (沒有使用Community_Basic去修改的狀況下)。

而圖片的記憶體大小可以在_truncateCache鍾看到是
快取預設記憶體 – 圖片的寬度 * 圖片的高度

WTF !?

雖然取名叫做快取,但結果是用px 數量來減少記憶體使用的概念,害我看cache一直以為是直接用記憶體來限制使用量,但終於又解開RM的一個謎題了XD。

今天的分享大概就是這樣囉,如果有錯誤歡迎指正討論w 粽子也在學習中XD



發表迴響