最近做了性能优化相关的工作,其中一些是关于战斗模块的渲染的。主要是对场景中使用的基于SkinnedMeshRenderer的网格进行了一些合批优化(降DC),记录如下。项目使用的Unity版本为5.6.4p1。
游戏中的战斗模块是这样的:
战斗逻辑由服务器承担,战斗瞬间完成,将战斗过程发给客户端,客户端负责播放;
场景中有敌我双方最多12个方阵(双方各2排3列),每个方阵由12个小兵组成(3排4列);
战斗基于回合制,敌我各个方阵依次攻击,攻击时会出列,冲到目标方阵前,攻击完成后返回;
小兵使用的是带动画的3D模型,使用AnimationController控制动作;
每个方阵的小兵是完全一致的(含模型、贴图、动作)
综上,使用战场管理器根据后端发来的战斗数据,改变各个方阵的position以及控制AnimationController来实现战斗过程的播放。
战斗模块中的渲染部分,从最初的版本到目前的一个可接受的版本,总共经历了多次迭代,以下详细记录,本文中使用的截图非项目截图(单个模型面数小于项目中使用的面数,此处使用的模型来自AssetStore,仅供演示使用)。本文的工程可以在github上看到所有源码。
原始版本
每个方阵12个小兵,实实在在地放了12个SkinnedMeshRenderer(后边简称为SMR),在方阵的脚本中保存了所有的AnimationController(后边简称AC),当方阵要移动时则移动所有的SMR,播放动画时同时为所有AC设置状态。
此方案每方阵共计12个SMR和12个AC。