下面是我给项目组的一些参考。其中也包含各种各样的标准,与优化建议。项目优化并不是一件事,它是点点滴滴串联起来的(勿以恶小而为之),我见过很多项目只是图一时之方便就导致后期很难做 比如 前期未规划好图集,模型贴图材质目录混用,UI制作未按照 复用/特殊 的标准制作,动画导出帧率不统一高高低低 等等。如果一开始没有定制良好的规范,后面想要补救只能靠程序写一些工具批量处理,当然这工具也不一定好写。

因为效率优化是一个很泛化的词。所以在这里我只讨论大类进而衍生出 “标准做法”。标准只说通用的,做了不会错的那种。如果你没有做 推荐你试一试。像如同项目贴图设置,灯光设置,烘焙,fog,等 设置问题这里不谈。因为设置的选项是最容易做优化的即使到了后期也是可以快速做的。

美术资源

资源分级

如 贴图png/jpg的选择 动画30帧还是60帧的选择 粒子质量高或低还是标准 等。根据不同场合使用不同级别资源。一般来说高质量资源只会出现在最显眼的地方 如 登陆,人物选择,入场。真正战斗调用的美术资源往往只需要普通品质即可。具体项目可以跟着需求来控制,划重点 这里要做差异化 才能省出资源(内存)。

贴图的质量选择

可参考 https://www.jianshu.com/p/f7c3741f22af
贴图的质量选择主要影响运行时效率,并不影响出包的大小。UNITY3D打包会自己优化图片大小,如果你使用了android studio release 打包,大小会进一步压缩。
这里可以想象一下内存与效率的转化。内存占比越高越清晰。这个可以直接通过贴图的前缀或者后缀统一设置。或者写一个资源管理工具 统一设置。

冷热分离 延迟加载

  1. 使用延迟加载,如果需要集中加载某些资源可以考虑冷热分离。常驻内存中的资源 与 非常驻内存中的资源采取不同策略:
    战斗配置 等到战斗场景再加载,关卡/任务/成就/ 等等其他 可以等到打开具体面板或进入场景的时候做一次缓存。
  2. 移除空函数 如 继承自MB的 Update 之类的函数。
  3. 分帧做iO 或 网络请求的操作。再具体一点就是用携程 该return的地方就return 等候下一帧处理。
  4. 高消耗的函数避免甚至不用 基本上UNITY API中以Findxxx开头 返回一个 List 的函数都是高消耗函数。

内存控制

  1. 使用缓存池 如 通用面板/通用弹出美术字(战斗中伤害数字)/ 等考虑缓存。
  2. 监测当前工程在移动端的内存占用,给所有的缓存池增加释放接口 做一些排序释放操作(优先级释放)。
    可以参考 UNITY5.6 的新API Application.lowMemory
  3. 使用压缩过的音频 或者 使用 Fmod 之类的插件进行托管。缺氧使用的就是 fmod .
  4. 文本配置转2进制存储 减少运行时内存占用。

效率重点

  1. 使用 line fog 调整相机视野
  2. 关闭场景阴影 能用烘焙用烘焙。
  3. 使用 Fast Shadow Projector 做阴影。
  4. 不要使用standard shader。因为大量的实时GI运算。

打包事项

  1. iOS 如果可以就使用 bit code
  2. APK 使用 Android Studio release 打包
  3. 使用 .NET 2.0 Subset 使用脚本代替如 xml 之类的system库的使用。
  4. 打包完之后查看 log 确定资源瓶颈。推荐使用 Build Report Tool
    某宝五毛钱能买到最新版。每次打包都需要看一眼,真等到需要做优化的时候已经晚了,优化的需求往往是积累到一定程度才爆发需要优化。
  5. 打包过atlas的图就不要再放到Resources下,方便的话就打包成AB

一些具体的优化资料

官网 图形性能优化