|
最近这段时间经常有一些在性能质量把控这块比较缺乏经验的团队,跟我问过一些性能优化上的建议,在这里开个文章聊一下这个问题。
其实性能优化是一个系统化的工作,如果是资源比较充足的项目,可以分成Profiler,技术方案,制定标准(美术资源/程序标准),性能分级,长期性能维护等等等。
如果是小团队,那肯定资源上没这么富裕了,只能从术上面着手,给一些比较快速定位问题的流程和建议,这种术一般可以解决眼前的问题。(长期保持一定的质量的话可能需要额外的投入)。
这个系列主要选择汇总一些高频次问题,并给出对应的建议。。
常见性能热点问题汇总
项目性能问题根据表现一般可以表现为:
1.平均帧率低于目标帧率
比如目标是平均帧率60fps,实际跑下来只有45fps,这里我们用FPS作为指标来衡量,总FPS之和/测试时长
平均帧率=平均FPS
2.卡顿
有的项目平均帧率虽然达标,但是玩几分钟总会遇到一两次,这里我们用卡顿总次数/测试时长来衡量
卡顿=卡顿次数/分钟
3.发热
有的项目是设备玩的时候,发热严重,俗称暖手宝
4.内存失控
有的设备(比如IOS)对内存卡得很严,部分项目可能打个几局就会闪退,这里面可能会有内存泄漏,也可能是内存值就是顶着设备上限的边缘疯狂试探,游戏时长稍微超标,可能就会闪退了。
帧率优化
帧率优化之前首先得对UE4的线程模型有一个了解
UE4的线程模型大概如下,
简单来说,就是游戏逻辑线程,渲染线程,RHI提交线程这三个线程都是异步且并行的,也就是说如果第N帧的玩家输入,第N+3帧玩家才会看得到对应的画面。
这和性能有什么关系呢。我们的FPS是由每帧的执行时间FrameTime决定的。
FrameTime取决于GameThread,RenderThread,RHIThread,GPU这四者的执行时间
也就是说以上三者任何一个线程的耗时超过16ms,帧率都不会超过60fps。
使用Stat Unit可以看到四者的耗时
Unreal Engine Tip: Stat Unit
可以定位到帧率的瓶颈在哪个线程。
如果定位到是Game/Render线程的耗时,进一步Profiler就可以定位到具体是哪一个逻辑函数或者是资源比较耗,针对性的对这些耗时比较重的地方去解决。
如果定位到是RHIThread/GPU线程的耗时是瓶颈,进一步Profiler也可以定位到具体是哪些shader的指令数比较高,或者是哪些资源引起的DrawCall调用比较高。
当然平均帧率是一个时间段内的综合耗时,但是此命令只能看到当前画面瞬时的耗时。
如果性能问题比较简单,可以通过此命令来分析解决。
如果性能问题比较复杂,可以通过一些工具和中间件,来获取某个时间段内每个线程的平均耗时,峰值等等 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|