雲風的 BLOG: ejoy2d sprite pack 的空間優化
阿新 • • 發佈:2018-12-23
其實方法很簡單。在 64bit 平臺上,我將 sprite pack 結構中的指標都改成了一個 32bit 的相對 pack 頭的偏移量。
在設計之初,我就是把整個 sprite pack 存放在連續單個記憶體塊上的。為之做了一個非常簡單的 bump allocator :資源打包的時候,統計整個要用的記憶體數量,然後在包載入時就分配出來,然後每個小物件都緊貼在一起儲存。這樣可以節省下大量小記憶體塊的頭,並將常規記憶體管理中可能出現的記憶體碎片率減少到零。
把指標體積減少一半後,資料結構對齊也會變得更緊湊,在我們公司三個專案實際比對下來後,發現 sprite pack 佔記憶體量大約可以減少 40% 。
做次修改後,還獲得了一個額外的好處。sprite pack 在記憶體中已經完全不包含指標,也就是說可以隨意在記憶體中移動了,變得和地址無關。
我們可以在打包時直接把 sprite pack 的記憶體塊直接 dump 到檔案,載入時可以繞過 import 過程。想來可以快上不少(還沒有測試)。即使不能提高太多效能,我們的資源載入過程會變得和資原始檔大小嚴格相關,也就是說,可以通過資原始檔體積來準確預測載入時間,可以實現一個非常勻速準確的 loading 條了。我想這對使用者體驗來說,是個不錯的改善。