通过RenderDoc真机抓取数据来验证和落地解决特效性能的问题

前言

需求是来自于我在为我司的一个线上RPG游戏做特效的性能优化的过程中,需要验证对特效的一个改动是否能够提高性能,当然这个改动是在不影响美术效果的前提。

特效性能问题

技能特效

主角的一个大招(技能)会有10个特效,其中6个是相同的特效,也就是同一时间会存在6份相同的特效,但是从profiler来看这6份相同的特效的set passcall 和dc数量是随着特效数量而递增的(setpasscall=单个 x 数量),根据我的知识储备我判断这肯定有问题,最合理的情况是:多个特效的setpass = 单个特效的setpasscall。

UI特效

游戏主界面的DC偏高,在排除完UGUI的合批被打断的情况之后,我发现随着游戏图标的增加(图标上有特效),dc也成倍数增加,当然这种情况也出现在了道具的流光特效上。

找出问题

经过我的测试验证之后,已经确定这两个问题的原因都是一样的:

我们每个特效里面都包含子的Particle System,不同的粒子之间是使用单图,没有打图集,也就是一个特效有多个mat

粒子没有设置OrderInLayer,当出现多份相同的时候,需要unity对它们进行排序,这样就增加了setpasscall,打断了合批。

而在我对粒子进行修改后,就相当于提前给粒子设置了顺序,这样当出现多份相同的粒子时,因为mat,order,texture都是一样的,就可以被合批。

验证结果

经过我的改动之后,当同屏存在100甚至1000个相同的特效,setpasscall和dc数量都没有上涨,在profiler和真机上抓取的数据都得到了验证。

图一是修改之前dc随数量增加(存在问题),图二是我修改之后dc是稳定的(正确的结果)

存在的问题-dc随特效增加

100个特效dc也是2

项目落地

在验证这一改动是正确且对性能有提高之后也对美术效果没有影响,我花时间写工具并整理了游戏中的所有的法师技能特效,剑圣技能特效,BOSS技能特效,UI特效(包括图标特效,领取按钮,品质流光),场景特效(包括掉落物模型特效,环境特效,火焰),把要修改的特效统计到一个表格,和主美进行沟通,然后推动特效进行修改。

遇到问题

如果一个特效中同时有粒子和Mesh,且RenderQueue都是透明的(Transparent),修改粒子的Order in Layer后可能会出现mesh跑到粒子的后面,那么给mesh添加Sorting Group组件,并设置Order in Layer比粒子Renderer中的order更大就可以解决。

准备工作

我的抓取环境:

使用Renderdoc抓取安卓真机数据,不需要ROOT,但需要打开手机的开发者调试模式并通过USB数据连接电脑。

  • Renderdoc v1.14
  • 自己的国产安卓手机,安卓11系统,未ROOT
  • unity2019.3.7f1
  • windows 10 ltsc

在Unity Editor中使用RenderDoc

  1. 从官网https://renderdoc.org/,下载并安装Renderdoc
  2. 打开Unity,在Game 视图 - 右键 load Renderdoc
  3. 点击game视图旁边的小图标,就会把当前内容传输到Renderdoc

image-20210701134654943

文档资料

官方文档 - 快速开始:https://renderdoc.org/docs/getting_started/quick_start.html

PS. 官方文档比较简单,主要介绍软件的使用,如果你想查阅抓取出来的不同条目或关键词代表的意思,需要去查阅OpenGL或Directx的资料

超级详细的软件入门使用教程:renderdoc的使用

在Rnderdoc中抓包其它的游戏:RenderDoc[01] 使用RenderDoc 分析Android游戏(免Root)

参数解释

glDrawElement:调用glDrawElements函数进行绘制就是Drawcall的一种形式

glDrawElementsBaseVertex:准备顶点数据

OpenGL的文档:http://docs.gl/gl4/glDrawElements

LearnOpenGL系列教程的简体中文翻译:https://learnopengl-cn.github.io/

保存记录

因为我是使用自己的手机来调取,所以我抓取完我把记录保存到本地文件,这样当手机断开连接时,也可以查看抓取的数据,但是在我的使用中保存的记录无法查看贴图,其它信息可以查看。

遇到问题

无法连接手机

无法连接手机

Core 20364 15:59:27 android.cpp(1363) Error Couldn't get PID when launching com.qing.dcTest with activity com.unity3d.player.UnityPlayerActivity and intent args

一开始我在安卓手机端的开发者模式中手动选择了要调试应用,出现上面的错误。

解决办法:只需要打开USB调试模式,像我的是国产定制系统,有ADB授权,把那个关闭就可以了,其它的不要多设置,就可以正常使用。

连接不稳定

在连接的过程中,每隔几分钟就会断开连接,我后来把数据线连接到电脑后置USB接口上就没断开过了。

其它

在SnapDragonProfiler中也是看glDrawElements,显示在glDraw call那列数据中。

posted @ 2021-07-08 10:18  赵青青  阅读(1239)  评论(0编辑  收藏  举报