工欲善其事必先利其器,这些好工具可以有大帮助,Unity内集成的Profiler(因为是集成在Unity中可能会被本身数据干扰,特别是编辑器模式运行)和Memory Profile。针对平台的有iOS->Instruments,Android->VTune和Snapdragon profiler。
从内存角度来说:降低render txture的尺寸。通过AssetPostProcessor修改资源的导入配置,常用的如下几项:
1) 相对镜头位置固定的图片不需要 mipmap
2) 图片的Read/Write要关闭。模型的mesh在导入时也是自动开启的,生成mesh collider要用到这个,如果不用生成mesh collider。也就可以关闭掉。
3) 压缩图片大小。UI图集纹理大小1024*1024或2048*2048,模型贴图512*512
4)如果模型没用character动画就可以取消勾选rig。(disable rig on no-character model)
5)对于共用蒙皮绑定的角色,可以复用avatar。(copy avatars for characters with shared rigs)
6)开启mesh压缩。
在代码中创建mesh renderer时默认cast/receive shadow是开启的,light/reflection probe也是开启的。如果不需要关闭它们。
音频文件:iOS平台使用mp3,Android平台使用Vorbis。游戏中使用单声道Mono. 声音的比特率也尽量低。
尽量重用Collection(List和Hashset, Dictionary)
避免直接字符串拼接和闭包函数,匿名函数。
如果用枚举Enum作为Dictionary的键值的话。枚举值会转化为对象Object。比较键值时是比较hashcode. 解决办法是为Dictionary传入一个实现IEqualityComparer的参数。
把文字处理成JSON字符串是非常慢的(内部用到了反射)。解决办法是:不需要动态改的数据序列化成对象,把文字分块处理只处理当前需要的(分治),使用多线程,Unity 5.3后用JsonUtility稍微好点。
Resources目录内的东西尽量少,因为在启动阶段就要处理。