【Unity游戏开发】性能优化之在真机上开启DeepProfile与踩坑
一、引子
最近马三入职了新公司,平时除了负责编辑器开发之外还要做一些游戏性能优化方面的工作。在这里首先给大家安利一下Unity官方的性能测试分析工具URP ,这个工具目前是免费,测试的过程中也不需要接入任何SDK,测试完成以后还可以生成一份性能测试报告。当然,相比侑虎科技的UWA GOT工具来讲,目前UPR功能还是比较少的,不过在项目初期完全可以先使用UPR做一些性能优化工作。好了言归正传,我们今天说说如何在真机上开启DeepProfile模式以及一些坑。
二、在真机上开启DeepProfile
众所周知,使用Unity Profiler开启DeepProfile模式以后,可以看到很多函数的具体消耗和GC情况,包括调用栈这些信息,有了这些信息再对症下药的话优化的效果是很明显的。但是在Editor下开启DeepProfile模式采集到的的数据通常是不准确的,一般我们要在真机上开启DeepProfile模式采集数据。
首先要确保我们本地已经有了 adb 工具,一般在下载AndroidStudio或者Android SDK的时候,这个东西已经包含了,相对路径在:AndroidSDK/platform-tools/ 目录下,将它配置到环境变量以后就可以直接在命令行执行 adb 命令了。如果还没有搭建Android环境的话可以到这里下载:https://www.androiddevtools.cn/ 如果感觉搭建环境比较麻烦的话,也可以直接下载一个简单的adb工具,传送门页面也有单独的 adb 工具下载,才2MB很轻便。
然后将我们的手机开启开发者模式、开启允许adb调试与安装程序,之后再用数据线与电脑连接,然后执行下面的命令查看手机是否与电脑连接成功:
adb devices
如果成功的话可以看到我们的手机设备了,如下图所示,VBJ4C18423012974就是我的手机:

有的时候连接adb会连接不上,我们可以重启adb server试试:
adb kill-server #关闭 adb server
adb start-server #开发adb server
adb devices #查看连接成功的设备
接着我们还需要对Unity打包设置做一些调整:
- 配置BuildPlayerSetting,勾选Development Build,这个是必选,否则无法开启调试。另外AutoConnectProfiler这个也需要勾选。然后就正常打包并安装到Android手机上
- 安装好以后不要手动打开游戏,要通过命令行启动我们的游戏。具体命令是:
adb shell am start -n com.xxx.xxx/com.unity3d.player.UnityPlayerActivity -e 'unity' '-deepprofiling'
“/”前面的是你自己项目的包名,“/”后面的代表的是具体的启动Activity的名称,如果你的项目没有改动,使用的是默认的Activity的话,那么直接使用“com.unity3d.player.UnityPlayerActivity”,如果有在AndroidManifest中修改过启动的Activity的话,要换成自己的Activity才可以,比如:“com.msxher.MainActivity”这种
- 通过命令行拉起游戏以后,还需要将手机连接到Unity的指定端口上面,这样Profiler才能接收到数据,具体命令是:
adb forward tcp:55000 localabstract:Unity-com.xxx.xxx
"Unity-"后面跟着你的包名就可以了,如果55000端口不好使的话可以试试4600、34999等端口
- 此时我们打开Unity中的Profiler窗口,然后选择<Enter IP>这个选项,在里面输入 127.0.0.1 ,如果没有出错的话,就可以连接上我们的手机了,并且可以在窗口中看到各项的数据了。注意不要输入端口号,直接输入 127.0.0.1 这个IP就可以。

有几个注意事项:
- 'unity'和'-deepprofiling'之间要有空格
- 游戏要让命令来启动,不要自己启动,否则会有一个警告,说此Activity已经存在
- 生成APK的Unity版本与用来开启Profiler的Unity版本必须是同一个
- 如果自己已经手动启动了unity,则需要使用命令行重新拉起一遍游戏
按理说如果没有问题的话,此时就可以进行DeepProfile了我们的游戏了,网上很多教程也写到这里就结束了。但是马三在实际操作的过程中,重复试了很多遍,包括重启Unity、重新打包、重新安装手机包等一系列的操作,都是不能在Android上开启DeepProfile模式。马三甚至一度以为是因为DeepProfile模式比较消耗性能,因此Unity在移动平台上禁用了它。直到后来马三把相关的官方文档从头到尾认认真真读了一遍,才发现问题所在,下面就说说这个坑。
三、踩坑
马三经过阅读官方文档,发现只有在Mono的包上面才能开启deepProfile,而我们的包一直是使用il2cpp的方式进行打包的,因此无论怎样尝试都是不能开启DeepProfile的。后来打了一个Mono的包,果然就可以开启DeepProfile了,各种函数消耗和GC看得清清楚楚。相关官方文档的传送门,建议大家有时间的话仔细阅读一下。

四、总结
在本篇博客中,马三跟大家一起学习了如何在真机上开启Unity Profiler的DeepProfile模式,并且踩了坑:“只有在以Mono的方式打包的apk上才能开启DeepProfile”,在il2cpp包上是不能开启DeepProfile的。看来遇到问题还是要多多阅读官方文档,毕竟官方文档是最权威、最一手的资料。
如果觉得本篇博客对您有帮助,可以扫码小小地鼓励下马三,马三会写出更多的好文章,支持微信和支付宝哟!

作者:马三小伙儿
出处:https://www.cnblogs.com/msxh/p/11749405.html
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!
【Unity游戏开发】性能优化之在真机上开启DeepProfile与踩坑的更多相关文章
- U3D开发性能优化笔记(待增加版本.x)
http://blog.csdn.net/kaitiren/article/details/45071997 此总结由自己经验及网上收集整理优化内容 包括: .代码方面: .函数使用方面: .ui注意 ...
- 转——Android应用开发性能优化完全分析
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...
- Android 应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- 【转】Android应用开发性能优化完全分析
http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...
- Android应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- 【Unity游戏开发】浅谈Lua和C#中的闭包
一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...
- 转:Android应用开发性能优化完全分析
转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...
- 喵的Unity游戏开发之路 - 推球:游戏中的物理
很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...
- 喵的Unity游戏开发之路 - 轨道摄像机
前言 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3 ...
随机推荐
- java面试题干货96-125
这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行 ...
- VMware永久激活密钥
VMware Workstation 14 Pro永久激活密钥 1. ZC3WK-AFXEK-488JP-A7MQX-XL8YF 2. AC5XK-0ZD4H-088HP-9NQZV-ZG2R4 3. ...
- JAVA使用SnakeYAML解析与序列化YAML
1.概述 本文,我们将学习如何使用SnakeYAML库将 YAML文档转换为Java对象,以及JAVA对象如何序列化为YAML文档. 2.项目设置 要在项目中使用SnakeYAML,需要添加Maven ...
- CCF-CSP题解 201709-4 通信网络
dfs #include <bits/stdc++.h> const int maxn = 1000; const int maxm = 10000; using namespace st ...
- 使用mongoshake进行oplog同步读取,解决乱码问题
mongoshake 是个开源的用户mongo数据迁移和同步的工具,支持往各种目标源头写数据 具体:https://github.com/alibaba/MongoShake 有业务场景想把oplog ...
- ubuntu19_nginx_uwsgi_flask_apt安装
ubuntu19_nginx_uwsgi_flask_apt安装 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-12-21. 在 ubuntu 19.04 apt 安装 apt i ...
- python 多线程编程之_thread模块
参考书籍:python核心编程 _thread模块除了可以派生线程外,还提供了基本的同步数据结构,又称为锁对象(lock object,也叫原语锁.简单锁.互斥锁.互斥和二进制信号量). 下面是常用的 ...
- jQuery实现简单购物车页面
功能描述: 当全选按钮被按下时,所有商品的小复选框(以及另外一个全选按钮)的选中状态跟按下的全选按钮保持一致: 当用户选中商品时,如果所有商品都被选中,就让全选按钮为选中状态: 用户可以点击 + - ...
- JS--- part6课程介绍 & part5复习
part6 课程介绍 scroll系列:-----重点,每个属性是什么意思 封装scroll系列的相关的属性,固定导航栏案例---事件浏览器的滚动条事件--能够写出来 封装动画函数---缓动动画--- ...
- More than one file was found with OS independent path 'lib/armeabi-v7a/libgnustl_shared.so'
More than one file was found with OS independent path 'xxx/xxx' 这个错误是在路径中出现了重复依赖. 解决办法是配置打包选项, 在 and ...