天天看點

【Unity優化】資源管理系列02:Resources 最佳實踐

一、Resources 的序列化與加載

在上一篇提到過,Resources 檔案夾下所有 Assets 和 Objects,在打包項目的時候,會被序列化為一個二進制檔案。

這個檔案類似下一篇要提到的 AssetBundle,包含了中繼資料和索引資訊。其中,索引資訊包含了一個序列化的查找樹,用于将 Object 的名字解析為 GUID+LocalID;同時,也被用于确定 Object 在序列化檔案中的位元組偏移。查找樹的時間複雜度要比線性高,是以檔案越多,初始化索引的加時間越長。

在遊戲啟動,預設 splash 界面顯示時,開始加載所有的索引資訊。在低端移動裝置上,上萬個資源的索引加載(如上篇提到的,此時應該也在初始化 InstanceID 緩存),可能耗時數秒。因為 Rrsources 檔案夾内的有些資源第一個場景并不需要,或者整個遊戲都很少用到甚至沒用到,是以這一步會産生不必要的時間、記憶體消耗。

二、為什麼要少用 Resources

1、正如上一節提到的,Resources 檔案夾下所有 Assets 和 Objects 會被打包進一個序列化檔案。并且在遊戲啟動時,無論是否需要用到,所有資源的索引資訊會被一起加載(同時生成 InstanceID 緩存條目)。這就造成了不必要的時間、記憶體消耗。為了避免包含遊戲不需要的資源,就需要手動剔除,這也帶來資源管理困難。

2、使細粒度的記憶體管理變得困難(Resources load 出來的資源,是可以通過 Unload 解除安裝的,是以并不明白官方提出這點的原因)。

3、不能熱更新。

三、可以使用 Resources 的情況

1、遊戲各個場景都需要的資源;

2、不占記憶體的資源(用來存儲配置資料的 ScriptableObjects,比如 APP ID);

3、不需要熱更新,或者在所有平台、裝置資源沒變化的資源

4、啟動遊戲所需資源

四、Resources 中資源生命周期

通過 Load 方法加載進記憶體,通過 Unload 方法解除安裝資源。

上一篇也提到過,Resources 中資源比較特殊,雖然 Object 被解除安裝了,但是它的 InstanceID 和 GUID+LocalID 都會被保留且有效。如果之後有腳本字段或者其他 Object 再次引用了已被解除安裝的 Object,則該 Object 将被自動加載。

繼續閱讀