《全民突击》项目优化内存之压缩贴图
发表于2016-05-10
首先看看优化前内存状态:
刚进入游戏

1、Used Total:
当前帧的Unity内存、Mono内存、GfxDriver内存、Profiler内存的总和.
2、Reserved Total:
系统在当前帧的申请内存.
3、Total System Memory Usage:
当前帧的虚拟内存使用量.(通常是我们当前使用内存的1.5~3倍)
4、GameObjects in Scene:
当前帧场景中的GameObject数量.
5、Total Objects in Scene:
当前帧场景中的Object数量(除GameObject外,还有Component等).
6、Total Object Count:
Object数据 + Asset数量. (8499+10081)
当前主要是优化图片内存!这是刚进入游戏,没有点击多少模块Texture2D消耗内存的情况。

我对游戏进行一些操作,打开了除去战斗外主要的游戏模块,然后:

可以看见增长非常快,我们主要的关注点就是图片,首先贴图这块已经做得很好,大家应该都懂的。

居然发现一个野生的非正常贴图, 正好拿来举例子。

我们找到它,修改它,再上传他的.meta文件,下一次就会好了。(再一次打开后)


已经看不见这个野生bug了。
我们主要的关注点是这些:



他们太大了,数量又很多,占用了非常多的内存,我们可以尝试在不影响图片表现的情况下,对他们进行压缩。
一个一个去修改他们太麻烦,而且需要针对不同的图片类型做不同的大小切换,所以写个工具。

注意红框框住的地方,避免把带透明通道的图片也给压缩成不透明的了。
需要注意的是美术给的技能特效这样的图片,不要去修改它的一个值,即Wrap Mode字段,因为特效需要用到Repeat。
/////////////////////////以下是我们项目//////////////////////////////
private static string AchievementIcon = "Assets/Resources/prefabs/UI/AchievementIcon/";
private static string ADImages = "Assets/Resources/prefabs/UI/ADImages/";
private static string AiIcon = "Assets/Resources/prefabs/UI/AiIcon/";
private static string GuildIcon = "Assets/Resources/prefabs/UI/GuildIcon/";
private static string ItemIcon_Large = "Assets/Resources/prefabs/UI/ItemIcon_Large/";
private static string ItemIcon_Small = "Assets/Resources/prefabs/UI/ItemIcon_Small/";
private static string LevelIcon = "Assets/Resources/prefabs/UI/LevelIcon/";
private static string LevelLoadingIcon = "Assets/Resources/prefabs/UI/LevelLoadingIcon/";
private static string LevelTipsIcon = "Assets/Resources/prefabs/UI/LevelTipsIcon/";
private static string LMIcon = "Assets/Resources/prefabs/UI/MainRoleIcon/";
private static string MainRoleIcon = "Assets/Resources/prefabs/UI/AchievementIcon/";
private static string MapPreviewImage = "Assets/Resources/prefabs/UI/MapPreviewImage/";
private static string MiniMap = "Assets/Resources/prefabs/UI/MiniMap/";
private static string PlayerIcon = "Assets/Resources/prefabs/UI/PlayerIcon/";
private static string RoleCard = "Assets/Resources/prefabs/UI/RoleCard/";
private static string ShareImages = "Assets/Resources/prefabs/UI/ShareImages/";
private static string StoryPoster = "Assets/Resources/prefabs/UI/StoryPoster/";
private static string VehiclesIcon = "Assets/Resources/prefabs/UI/VehiclesIcon/";
private static string WeaponIcon_s = "Assets/Resources/prefabs/UI/WeaponIcon_s/";
需要处理这些,AchievementIcon的图片都是256X256,size可以设置256,依次类推,还有一些不常用到的图片或者出现次数比较少的都可以设置成128的大小。
ADImages的图片表现力很足,甚至有一些类似广告bar这些的图片,所以设置512。
AiIcon这些的图片太小,明显设置128,大概其他的图片也脱离不了这3个范畴。

这些128

这些256

这些512
好吧,执行一下工具,看下效果如何?举个例子,未优化前。

优化后!

256的效果对比上一张的确实是差了点,但是感觉能接受,看美术,如果觉得不能接受,再放开到512。那么让我们再看看现在内存的占用情况吧!


对比之前的这张

都是大概300来张图的情况下,差不多减少了20MB的内存。
后面还可以继续优化:比如粒子图片;某些UI的背景图片;武器贴图;人物贴图等,都能精简内存。
举例子一份以前我优化魔龙贴图的例子。
