项目图集优化之一

       项目中的图集已经优化了很多了。我目前的工作是看看还有没有可以优化的空间。当然这项工作目前还在做。在开始这项工作之前,做了一些准备工作——数据的采集。我的思路是,不管后面要如何动手,先要了解项目中图集的一些基本数据,例如:图集的引用情况,图集的大小等等。当然,具体需要什么数据,也是不断在完善过程中的。就像我,光是数据的采集就改了三版。所以,经验确实很重要。

      写了一个小工具来采集数据。这里面涉及到了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))

方法就可以获取到图集对象了。然后就可以计算图集的大小了。

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