一、引子

  最近马三入职了新公司,平时除了负责编辑器开发之外还要做一些游戏性能优化方面的工作。在这里首先给大家安利一下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与踩坑的更多相关文章

  1. U3D开发性能优化笔记(待增加版本.x)

    http://blog.csdn.net/kaitiren/article/details/45071997 此总结由自己经验及网上收集整理优化内容 包括: .代码方面: .函数使用方面: .ui注意 ...

  2. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  3. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  4. 【转】Android应用开发性能优化完全分析

    http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...

  5. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  6. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  7. 转:Android应用开发性能优化完全分析

    转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...

  8. 喵的Unity游戏开发之路 - 推球:游戏中的物理

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  9. 喵的Unity游戏开发之路 - 轨道摄像机

    前言        很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3 ...

随机推荐

  1. JS基础知识——变量类型和计算(一)

    JS中使用typeof能得到的哪些类型? 何时使用===何时使用==? JS中有哪些内置函数? JS变量按照存储方式区分为哪些类型,描述其特点? 如何理解JSON? 知识点梳理 一.变量类型: (1) ...

  2. HTTP 错误 500.19 - Internal Server Error解决办法详解

    最近在服务器端部署程序发现这个问题,HTTP 错误 500.19 - Internal Server Error,程序在本地跑是没有问题的.但是部署完,浏览程序就出现这个问题,今天这篇文章就是记录一下 ...

  3. 如何将hive表中的数据导出

    近期经常将现场的数据带回公司测试,所以写下该文章,梳理一下思路. 1.首先要查询相应的hive表,比如我要将c_cons这张表导出,我先查出hive中是否有这张表. 查出数据,证明该表在hive中存在 ...

  4. 《Java基础知识》Java集合(Collection)

    作为一个Developer,Java集合类是我们在工作中运用最多的.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求: Java集合就像一个容器,可以存储任何类型的数 ...

  5. 常用数据结构之ArrayList

    前言 ArrayList想必是广大Java程序员开发时最常用的数据结构了,但不一定对其原理都有了解,今天我将结合ArrayList的源码对其进行讲解.本文将围绕ArrayList主要特性(包括适用场景 ...

  6. iOS:bugly符号表上传

    https://blog.csdn.net/weixin_38633659/article/details/81667721 这个篇文章已经讲得足够清楚 而且官方的文档也写得很好(注意官方网站上的文档 ...

  7. docker容器和虚拟机的比较

    containers:容器是在应用层的抽象化,多个容器能够运行在同一台机器上,和其他容器共享操作系统的核,每个容器运行都独立的运行在用户的空间内.容器需要的空间比虚拟机要小(容器镜像的大小一般为MBs ...

  8. Java开发之使用websocket实现web客户端与服务器之间的实时通讯

    使用websocket实现web客户端与服务器之间的实时通讯.以下是个简单的demo. 前端页面 <%@ page language="java" contentType=& ...

  9. 使用系统定时器SysTick实现精确延时微秒和毫秒函数

    SysTick定时器简介 SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 ...

  10. 【转载】记一次因 Redis 使用不当导致应用卡死 bug 的排查及解决!

    说明:此篇文章 作者分析问题的思路很好,值得学习记录,原文转载自公众号. 首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象 刚开始当测试抱怨环境响应慢的时候 , ...