大杂烩以【问题和解决方案】的形式来进行说明

我的文章可当成是笔记来看待,这些都是亲身经历的。最后更新时间:2019年6月26日

一、【优化相关】

(1)问题:MMORPG游戏中,当一个单位受到攻击时会显示伤害UI(数字Text)在3D场景上,最简单的做法是创一个带Canvas组件的父物体和其带Text组件的子物体,将Canvas的Render Mode设置为World Space即可移动这个UI到单位的附近,从而实现显示到3D场景上的效果,但是当频繁弹出伤害UI时会卡顿。

解决方案:一个Canvas是一个DC(draw call),尽量少用Canvas来去将UI放到3D场景,而是采用SpriteRenderer组件和图集的形式来进行渲染3D场景上的简单UI,只要控制好当前3D场景上的UI图片是同一个图集,就只会有一个DC而已,如果用Canvas来去代替每一个带SpriteRenderer的物体,就会有多个DC,有多少个Canvas就有多少个DC,DC越多游戏性能越差。上面的情形只是针对当场景会出现多个简单UI情况的优化,如果是单个复杂UI且需要与用户交互的,那自然选用Canvas形式。

(2)问题:项目中有一个UI的渲染是交给自定义Shader进行的,Shader实现了动态局部黑色遮罩(用于引导系统),测试时发现当这个UI出现游戏FPS会明显降低,导致游戏严重卡顿。

解决方案:在排查问题时,首先确定了不是GC问题,也不是DC过多问题,而是Shader问题,因为这个Shader计算量太过于庞大,导致FPS明显下降,可以说是GPU处理不过来导致,触发方式是减少Shader的计算量,优化算法,减少使用for,if语句,采用Shader相关运算函数库来进行,但是在这些都考虑过了之后还是卡顿,那就要考虑从外部传入Shader的参数考虑,应尽量减少外部传入的参数,通过压缩参数数据来达到减少Shader计算量的目的。