項目圖集優化之一

       項目中的圖集已經優化了很多了。我目前的工作是看看還有沒有可以優化的空間。當然這項工作目前還在做。在開始這項工作之前,做了一些準備工作——數據的採集。我的思路是,不管後面要如何動手,先要了解項目中圖集的一些基本數據,例如:圖集的引用情況,圖集的大小等等。當然,具體需要什麼數據,也是不斷在完善過程中的。就像我,光是數據的採集就改了三版。所以,經驗確實很重要。

      寫了一個小工具來採集數據。這裏面涉及到了unity編輯器相關的api。

UnityEngine.Object AssetDatabase.LoadAssetAtPath(string path, Type type)

這個方法可以返回指定路徑上的asset對象,可以是預設體,精靈,圖集等等對象。返回什麼對象,就需要指定其Type。

遍歷存放UI預設體的文件夾,用後綴爲".prefab"來篩選出所有的預設體,然後用該方法獲取到預設體對象。拿到預設體對象後,就可以獲取其引用的資源了。

UnityEngine.Object[] CollectDependencies(UnityEngine.Object[] roots)

該api可以獲取指定的asset對象(多是預設體)上引用的所有資源。注意,這裏的所有資源,包括腳本資源,圖片紋理資源,精靈資源,UI控件資源和gameObject資源。所以,需要根據資源的類型進行篩選。這裏我篩選了UnityEngine.UI.Image資源,然後將該資源轉換成UnityEngine.UI.Image對象,獲取到Image對象中使用的圖片。由於獲取到的圖片肯定是屬於某一個圖集的,進而就可以通過該圖片,拿到這個預設體引用到的圖集了。如何通過圖片,獲取到該圖片所在的圖集呢?在此之前我做了一步收集圖集的工作。

UnityEngine.Object[] LoadAllAssetsAtPath(string assetPath)

該api如果傳遞的參數是圖集的文件路徑,那麼返回的列表將是該圖集下的所有圖片的集合。圖集的名字可以通過文件路徑獲取

string GetFileNameWithoutExtension(string path)

傳遞一個文件的全路徑,可以返回該文件的文件名。通過這兩步,就可以獲取到圖集的所有數據了,可以用一個Dictionary<string,List<string>>來存放圖集的數據。遍歷這個字典,就可以通過圖片來獲取圖片所在的圖集了。

       這樣一頓操作後,我們大概可以拿到所有想要的數據了。我是拿了這樣幾個數據:一個預設體引用的所有圖集,一個圖集被哪些預設體所引用, 圖集被引用的次數,圖集中的每個圖片被引用的次數,預設體對圖集的引用率(在圖集中引用了多少張圖片)

      不過還差一個數據,圖集的大小?

      如果在unity中查看圖集,可以發現這樣一個數據:

一個數據:

這裏記錄的圖集的分辨率,位深,壓縮方式,像素大小。如果在windows的資源管理器中查看該文件的大小,會發現是不同的。圖集的像素大小和文件大小是兩個不同的概念。而我們需要的是像素大小。所以,如何獲取這個大小是個問題,我沒有找到現成的api,在網上找了參考,手動計算的。參考在這裏:《如何計算初始圖片的大小?像素,分辨率》《unity 中Texture大小與佔用內存關係》《Unity中如何計算帶minimap的貼圖資源的大小》

       上面說到了,使用LoadAllAssetAtPath方法,返回的是圖集中的所有圖片的集合,這裏使用

Texture2D  atlasTex2D = AssetDatabase.LoadAssetAtPath(string path, typeof(Texture2D))

方法就可以獲取到圖集對象了。然後就可以計算圖集的大小了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章