通过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是稳定的(正确的结果)
项目落地
在验证这一改动是正确且对性能有提高之后也对美术效果没有影响,我花时间写工具并整理了游戏中的所有的法师技能特效,剑圣技能特效,BOSS技能特效,UI特效(包括图标特效,领取按钮,品质流光),场景特效(包括掉落物模型特效,环境特效,火焰),把要修改的特效统计到一个表格,和主美进行沟通,然后推动特效进行修改。
准备工作
我的抓取环境:
使用Renderdoc抓取安卓真机数据,不需要ROOT,但需要打开手机的开发者调试模式并通过USB数据连接电脑。
- Renderdoc v1.14
- 自己的国产安卓手机,安卓11系统,未ROOT
- unity2019.3.7f1
- windows 10 ltsc
在Unity Editor中使用RenderDoc
- 从官网https://renderdoc.org/,下载并安装Renderdoc
- 打开Unity,在Game 视图 - 右键 load Renderdoc
- 点击game视图旁边的小图标,就会把当前内容传输到Renderdoc
文档资料
官方文档 - 快速开始: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那列数据中。
通过RenderDoc真机抓取数据来落地验证和解决特效性能的问题的更多相关文章
- Android手机 Fildder真机抓包
Fiddler是一个http调试代理,它能 够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http通讯,设置断点,以及Fiddle 所有的“进出”的数据(指co ...
- 【转】蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法--不错
原文网址:http://blog.csdn.net/mzy202/article/details/32408223 蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet ...
- 蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法 【原创,多图】
蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法 [原创,多图] spm=a1z10.1.w4004-5319414070.11.Zd ...
- 测试开发Python培训:抓取新浪微博抓取数据-技术篇
测试开发Python培训:抓取新浪微博抓取数据-技术篇 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...
- python抓取数据,python使用socks代理抓取数据
在python中,正常的抓取数据直接使用urllib2 这个模块: import urllib2 url = 'http://fanyi.baidu.com/' stream = urllib2.ur ...
- nodejs--实现跨域抓取数据
最近公司安排给我一个任务,抓取页面数据:http://survey.finance.sina.com.cn/static/20205/20131120.html?pid=20205&dpc=1 ...
- java抓取网页数据,登录之后抓取数据。
最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一 ...
- C# WebBrowser控件 模拟登录 抓取数据
参考博客:C#中的WebBrowser控件的使用 参考博客:C#中利用WebBrowser控件,获得HTML源码 一.问题点: 1.模拟登录后,如果带有嵌套的iframe嵌套,不好读取iframe内容 ...
- PHP的cURL库:抓取网页,POST数据及其他,HTTP认证 抓取数据
From : http://developer.51cto.com/art/200904/121739.htm 下面是一个小例程: ﹤?php// 初始化一个 cURL 对象$curl = curl_ ...
随机推荐
- 使用sosreport命令生成诊断包
[RHEL]-7-常用系统状态检测命令 引言 这篇文章介绍RHEL中最常用的几个系统状态检测命令,包括:网络状态.内存.主机名及其架构.系统负载及其用户登录状态等. 文章目录 0×1.查看网络状态 0 ...
- dpkg 比rpm好用 常用没命令 UbuntuVS RHEL
yum install (必须先执行apt update)apt install yum remove(危险禁止使用) apt remove(危险禁止使用) rpm -Uvh ...
- 开机自动挂载本地yum源-20200402-V0.1
开机自动挂载本地yum源-20200402-V0.1 已下载本地iso /home/Kylin-Server-10-mips64-Release-Build04.08-lic-20200313.iso ...
- C++知识点案例 笔记-3
1.基类指针等与派生类的兼容 2.构造函数 3.析构函数 4.虚基类 5.虚函数 6.虚析构函数 ==基类指针等与派生类的兼容== #include <iostream> #include ...
- ELK学习实验020:ELK使用kafka缓存
首先安装一个kafka集群,但是zookeeper使用单节点,可以让kafka快速跑起来,后续再研究kafka和zokkeeper的集群 1 安装Kafka集群 下面是三个节点都要做 [root@no ...
- SpringBoot使用protobuf格式的接口
SpringBoot使用protobuf格式的接口 建立SpringBoot项目,pom.xml内容如下: <?xml version="1.0" encoding=&quo ...
- mysql基础之数据库备份和恢复的基础知识
备份数据的最终目的是为了在出现一些意外情况时,能够通过备份将数据还原,所以单单的备份数据往往是无法满足还原时的需求的,所以在备份数据库时,除了要备份数据本身,还要备份相关的数据库环境,如配置文件,定时 ...
- Lombok 插件安装和使用
引言 以前的 Java 项目中,充斥着太多毫无技术含量的代码,比如类属性的 getter/setter/toString 方法,还有就是异常处理.I/O 流的关闭操作等.这些样板代码虽然可以通过 ID ...
- 【Java】Files.readAllBytes(Path) 遇见的坑
Files.readAllBytes(Path)方法把整个文件读入内存,此方法返回一个字节数组,还可以把结果传递给String的构造器,以便创建字符串输出. 在针对大文件的读取的时候,可能会出现内存不 ...
- HEX与ASCII之间装换
static const char bcd_ascll[20]={0x30,0x31,0x32,0x33,0x34, 0x35,0x36,0x37,0x38,0x39, ...