Unite 2019 Shanghai:Unity UPR 性能报告功能介绍

作者:转载小公举
2019-07-12
8 3 1

之前我们已经整理了部分 Unite 2019 Shanghai 的 Keynote,这一次官方也将整理好的内容陆续放出,我们在这里继续提供给大家学习和交流。

会议主题:技术专场 3
会议时间:2019 年 5 月 12 日
会议地点:上海国际会议中心

5 月 10 日晚,Unite Shanghai 2019 Keynote 主题演讲于上海国际会议中心盛大举行。从最前沿的技术到令人惊艳的 Made with Unity 案例,整场 Keynote 无不体现了 Unity 技术的每一个进步,都是服务于每一位创作者,以技术致敬每一位创作者 -Unity for all!

我们选择了一些演讲实录在这里分享给大家。这一次是 Unity 企业技术支持经理高川和企业技术支持工程师杨怀忠一起为大家分享了最新的 Unity UPR 性能报告功能。

本文将带你了解 Unity UPR 性能报告功能。UPR 现已上线,开发者只需使用 Unity ID 登录,即可免费使用。

访问 UPR:https://upr.unity.com

演讲内容

高川:大家好,我是 Unity 的企业技术支持经理高川,今天我将和 Unity 企业技术支持工程师杨怀忠一起为大家带来的演讲-Unity Performance Reporting,这个 Unity 的性能测试工具,我们也可以简称为 UPR

 

我们先从性能谈起。为什么我们会做这样的工具?

现在有非常多优秀的性能测试工具,我们在进行企业现场支持的时候,经常会被问到一些性能问题,尤其现在 Android 机碎片化较严重,从低端到高端有各种不同的配置。

所以经常有人拿手机来问我:我的游戏跑起来只有 10 帧,有没有办法帮我改到 60 帧?

我会问开发者:你有没有分析过自己的性能瓶颈在什么地方?很多人被问到这句话后,会一脸茫然地说:没有。

这是因为大家的心目中,可能都会想要得到一个方案,调几个勾,然后性能问题就解决了。实际上性能问题没那么简单,性能背后可能有很多不同的情况,因此要想优化一个性能问题,首先要做的第一步是定位性能问题,也就是要知道问题在什么地方。

如何去定位一个性能问题?除了平时经常进行的人工测试,一些经验感觉与猜测之外,我们更应该是使用一些工具,就像古话说的“工欲善其事必先利其器”。

 

如果有一个非常优秀的工具,帮助快速定位到性能问题的所在,可能整个性能问题就迎刃而解。

现在有非常多的工具,针对不同平台,不同场景帮助你去定位性能问题。但是我们在纵观市场上的工具后,发现几个问题:

第一:数据不完整。大家都知道 Unity 是非常复杂的引擎。而且对大多数人来说,Unity 是一个黑盒引擎,所以可能很多性能工具并不能告诉你究竟是引擎的问题?还是你自己的问题?如果是你自己的问题,那么该如何解决?

第二:就是碎片化严重。我们现在面对的平台非常多,有 Android、iOS、Windows、Mac 等各种不同的平台,每一个平台都有自己的工具链。

对于开发者来讲,学习成本非常高,今天可能要去学 iOS 的 Xcode,明天可能要学 Android 的 Profiler,后天可能要去学 Windows 上的 RenderDoc 等等一系列的东西。对于一名开发者而言,学习成本和学习时间可能占用会非常多。

第三:数据角度的多样性。每一个工具的侧重点是不一样的,这个侧重点会导致你去观察一个问题的时候,看到的角度也是不一样的。可能出现一个现象:通过不同的工具分析同一个问题,得出不同的结论。

基于以上原因,我们制作了基于 Unity Profiler 数据进行分析和增强新的工具:UPR

 

因为Unity Profiler 是对 Unity 引擎数据收集得最全面最权威的工具,Asset Store 资源商店上很多的工具,其实也是基于 Profiler 的数据来进行加工和处理。

Unity Profiler 还有一个优点:它的反馈是实时的。数据是每一帧实时反馈到 Unity Profiler 中,用户可以直接的看到当前帧或者前几帧的数据信息。此外,UnityProfiler 的可扩展性非常强

 

那么基于 Unity Profiler 的基础之上制作的 UPR,拥有以下几个特点:全面、零入侵、极速、易用、免费

 

首先谈谈全面的特点。

第一:UPR 的数据是来自 Unity 的 Profiler,所以它和 Unity Profiler 有相同甚至更多的数据解析维度。

为什么是更多呢?实际上在 Unity Profiler 中所看到的信息,都是被 Unity Editor 处理过的信息,里面有很多的细节已经被抹掉了。但是在我们分析的过程中,实际上发现这些细节信息有时是非常有用的。

例如:一个 Asset 被加载到内存里,它为什么会加载到内存里面?在 Editor 里,我们只能看到 Others,Assets 等简单的分类,但是不知道它为什么会加载到内存里面。在 UPR 里,我们会把这些信息更多的还原出来。

第二:UPR 会展示 Unity Profiler 未曾展示的详细数据。

第三:UPR 有更多的比较维度和追踪角度。Unity Editor 的最大问题是 Unity Profiler 只能做单次的测试,而不能进行多角度多维度的数据对比。我们发现在开发过程中,数据对比是非常重要的一点。

例如:现在出现一个性能瓶颈,我定位了它,并且尝试修改了它,修改了之后这个瓶颈究竟有没有改善?有多大的改善?或者发现性能有所提升是修改产生的?还是其它的事情产生的?如果没有对比,很难得出最后的结论。

第四:UPR 的兼容性非常的广泛,兼容 Unity 5.0以上的所有版本,并且会随着 Unity 最新的版本一起更新我们的数据分析工具。

Unity Profiler 实际上也在不断变化,我们可能在 Unity 5.X 中,发现 Unity Profiler 的一个 Tag 所代表的意思,可能到了 Unity 2017中会有细微的变化,可能消失或出现新的 Tag。

如果开发者用所谓的经验积累去观察一些数据,可能经常会遇到需要重新学习或重新积累的过程。这个对于中国现在的开发节奏来讲,是不适用的。大家希望直接得到信息和结论,所以我们会跟随着 Unity 每个版本不断的迭代,去不断更新我们的开发工具以及相关的解释信息。

第五:因为 Unity 是跨平台的,所以UPR 也是跨平台的,可以分析 iOS、Android、Windows 这些主流平台,后续会添加更多平台的支持。

 

为什么说是零入侵

UPR 不需要打断现在的整个工作流。我们知道 Asset Store 资源商店中的性能工具或其它第三方工具,它们或多或少要求植入一些 SDK,或者要求项目做一些改变或设置,从而获得一些数据。

UPR 是不需要植入 SDK,不需改动项目任何配置。只需要一个正常发布的包,就可以进行完整的性能测试,从而给整个测试流程和工作流不会造成任何冲击。UPR 秉承着 Unity 一贯的配置简单,易用好用的传统,不会有非常繁琐的设置

 

极速。UPR 的数据传输是实时的,意味着测试结束之后,立刻可以获得相关的测试报告,不需要等待。

极速的另一个角度是 UPR 是一个自助性测试,不需要依赖于第三方的帮助,可以做到随时随地想测就测,只要有网络、有包、有手机,就可以全自助进行测试

 

易用。UPR 是非常简单易用的,不需要开发人员介入,测试人员只要有一定的工作经验,就可以独立完成整个配置过程。

URP 使用 Unity ID 进行登录和信息管理,不需要繁琐的二次注册。项目管理非常的方便,数据归类非常的明确

我们知道现在中国很多企业都是进行内网开发的,他们不希望自己的数据传到第三方,所以我们针对企业级用户也有企业级的定制化服务和私有云部署

针对大众用户,我们现在是采用完全免费的政策,大家可以随时来进行体验。

在这里,我简单介绍一下 UPR 的使用简介。

首先我们进入 UPR 的网页,登录后会有非常大的按纽,就是开始使用。

点击开始使用之后,就看到项目管理。因为项目管理是和 Unity ID 绑定的,所以在 Unity Editor 创建新的项目后,在这里不需要做项目相关的配置,它会自动把项目信息拉出来了。

选择测试的项目,我现在选择的是第一个,点击项目。

在这个地方,我们看到有“新建测试”按钮。

当点击“新建测试”之后,就会开始一次新的测试,测试信息需要填一些简单的信息,包括测试名称、版本号、安装包的名字、Unity 的版本、是否开启游戏中的数据截图。

对于网络不太好的小伙伴,我们可以安装本地代理来加速数据的传输,减少数据传输过程中出现错误的可能性。在填写完所有的数据之后,点击创建。

此时,会出现一个二维码,我们用 URP 的手机客户端扫描二维码,然后整个测试就开始了。

整个测试开始之后,一次测试会有三种状态:

  • Ready:创建好测试,但还没有开始。
  • Testing:扫描二维码后,开始测试了。
  • Finished:当在手机端测试完成,点击结束之后,网页端也会相应的变成 Finished,这个时候可以去察看报告了。

再说一下手机端。手机端只需要下载 UPR 的 APP。

当网页端弹出二维码的时候,使用 APP 里扫描二维码的功能去扫描一下,就可以开始一次测试。

手机 APP 只需安装一次,所以在第二次需要测试或者测试其它不同安装包的时候,只需要在网页上进行相关的配置就可以了。

下面请我的同事 Unity 技术支持工程师杨怀忠进行案例相关的说明。

案例相关的说明

杨怀忠:大家好,下面我跟大家介绍一下,当我们通过 UPR 获取测试的性能数据之后,如何来通过这些数据反映出我们游戏的性能以及对应的解决方案。

我们看到下面这张图,是登录 UPR 获取性能报告后,它的首页会看到这些数据。这些数据都是平时我们优化游戏的时候,比较关心的一些数据。

 

每个数据底下还有一些小字,是官方的建议值。这个建议值其实只算是经验值,它针对于不同的 Unity 版本以及手机平台,这能会有一些的出入,只是给大家提供一个参考而已。

底下 Typo 可以看到是一些模块的平均耗时,以及一些 GC 的排序。这些数据都是对游戏性能非常关键的因素。后续的版本,我们可能会把这些信息更加的细化,例如做一些对比的数据,通过不同的数据对比,我们可以发现在各个版本中有哪些区别,以及我们对应的优化措施。

通过观察这些数据,就可以知道我们的游戏中是不是存在一些问题。例如 GC 这一列,因为 GC 对游戏性能影响比较大,我们看到不同函数名代表了不同的含义,有经验的工程师看一眼就知道游戏大概会出现哪些问题。后面还有对于各个模块里面详细的信息。

上面这张图的话,是我抓取游戏测试中一个很长的时间段里面某一帧的数据。

在上图大家比较关心的数据,像 DrawCalls 和 SetPassCalls,包括 Mono Used 内存,这些可能都和我们平时在 Unity Profiler 里面看到的数据是完全一致的。

这样做的好处,就是在测试的时候更加的方便,以及对这个版本管理方面的话,可能也提供了一些便利。

底下一些函数名提供了各个模块耗时的排序。对有经验的程序员来说,我们根据这个平均耗时的排序,基本上可以估量出这样的耗时是否处在合理的水平。

例如第二行是 Canvas 的耗时,这说明我们的 UI 的耗时非常的高。我们要查看这一帧,看它对应的是什么画面。如果 UI 非常的简单,但耗时非常高的话,可能说明我们某一个方面做得不是特别好。

上面这张图主要显示 SetPassCalls 和 Drawcalls 的对比图。我们知道,现在游戏在手机平台跑起来的话,Drawcalls 数对游戏的性能影响非常大。

其实和它相关的是 SetPassCalls 的数量,细节就不去一一讲解。URP 提供了性能数据,并且对于某些帧或某些连续的帧,当它某一些数据异常的时候,会有一些标注,这样方便开发者或性能优化的同事进行性能定位。

重点说明一下上图,因为这张图提供的是 VBO Size 的图。如果大家对图形学了解比较深,可能知道这张图意味着什么。

我们进行 Unity 性能优化的时候,一般会有一个经验:尽量不要动态地去改一些物体顶点的数据。

修改物体顶点数据会影响哪些内容呢?

首先 VBO 里面存放的是顶点数据,所有对于修改顶点数据,并且对顶点数据有实时更改,对 VBO 的影响都会非常的大。例如进行一些合批,或者把物体顶点簇做得非常多,或在每一帧实时更改数据,这些数据都会实时表现在 VBO Data Size 里面。

平时通过其它工具进行测试的时候,可能不会明显的把这项列出,因为这块牵涉到 CPU 和 GPU 的联合工作。对于大部分的游戏来说,这其实是值得重视的点。

我们把它列出来,希望让开发者了解在某一个场景或某一个时刻里,它的 VBO 处于什么状态。如果接下来的某个时刻发生剧烈的变化。作为开发者需要知道它为什么发生这样的变化,以及如何定位它的变化是否处于合理的区间。

对于 VBO Size 影响的性能数据,大家回想一下,游戏里面哪些操作和改变会导致这些数据的变化。

在上图中,我们可以看见黑色的对话框。该对话框表示:在把这一帧的数据列出来之后,我们可以看里面的细节数据。这个大的表显示的是连续的在一段时间之内帧数据的变化,黑色的框是选取某一帧后查看里面的细节

其中还有一个合批的概念在其中。合批对性能的影响是二个方面的,可以是正向的,也可以是反向的,所以我们在一个场景中优化的时候,使用多少合批,用什么方式合批,都需要根据具体的情况去评估。

上图是内存的监控。对于 Mono 内存,大部分的开发者都知道 Mono 内存的一些规律,例如是增还是减,或只增不减。

现在要提到的是,当内存增加的时候,我们要知道 Mono 内存为什么会增加。这点是很重要的,因为我们只知道它只增不减,其实没有太大的帮助。

当它增长的时候,我们需要知道原因,以及编码脚本的时候,要了解哪些脚本语言会导致内存上升。作为开发者或管理者,我们对这方面需要有一定的掌控,这些内容都是比较常规的知识。

上图是资源的监控。我们可以看到图中列出了基本游戏中常用资源的类型,包括:纹理、网格、动画、音频、材质。

很多团队在开发的时候,如果对资源性能不是足够重视,当项目进行到后期的时候,再去关注性能数据,改写可能会比较痛苦。我们一般会给开发者建议:在整个流程的过程当中,都应该去实时的监控这样的数据。例如:二周之前的纹理个数和现在的纹理个数有什么变化?变化的内容是不是期望的一些变化?

特别要注意的是动画的资源。因为动画的资源对性能的影响会比较大。例如:这个场景中多了几个动画,可是没有用到,但这些内容的影响可能特别的大。包括纹理、材质都是一样的道理。

下图是 UPR 的实际界面。

简单看一下 UPR 的操作界面。我们先看左边这一侧。

当测试完成后,我们第一眼看到的是一个概况,就是测试产品大致的性能,包括处在什么区间,各个指标是否处在合理的范围,一般在概况的界面就可以看到。

第二列是 CPU 的一些指标,在一般的游戏产品优化中,我们需要关注的 CPU 端的性能数据,基本上这里都是涵盖的,包括图形学的一些相关的支持。

我们制作了一个内存快照的功能。当我们进入一个场景之后,抓取一个内存使用情况。当在这个场景里操作了几分钟之后,再去获取内存的快照,这样进行对比的功能,它可以判断出在游戏过程中资源的管理、加载、缓存是否处于合理的方法。


高川:我们今天仅仅简单展示了 UPR。UPR 还处于测试阶段,所以会有很多的不完善,但我们后续还会有很多增强它的计划。

我们会把 UPR 和 Unity Editor 直接整合在一起,让大家的测试更方便,甚至连手机端都不需要配置了,直接在 Unity Editor 里直接完成所有的工作。

另外是智能化的解决方案。我们将与 Unity Machine Learning 团队合作,我们可能会根据现在的数据结合全球的测试数据去做一些 Machine Learning 的建议。

我们还会增加一些自动化的监控报告,对项目预警,从而为一些非开发人员和管理人员提供监控整个项目的可能性。

 

UPR 现在已经上线了,如果你对此感兴趣,请进行尝试:
https://upr.unity.com

大家对 UPR 有相关问题,欢迎加入 Unity Connect 讨论群进行反馈:
https://connect.unity.com/g/uprzhuan-qu?tab=discussion

今天我们的演讲就到这里,谢谢大家 !

小结

如果你正被游戏性能问题所困扰,赶紧来尝试一下 UPR 吧,一定要加入 Unity Connect 的 UPR 讨论群组,和 Unity 技术支持工程师进行沟通。

更多 Unite 大会精彩演讲内容分享,尽在 Unity Connect 平台(Connect.unity.com)。

下载 Unity Connect APP,请点击此处。 观看部分 Unity 官方视频,请关注 B 站帐户:Unity 官方。

近期点赞的会员

 分享这篇文章

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. 2019-07-12

    谢谢,性能问题向来是最棘手的,有了官方工具很赞啊

您需要登录或者注册后才能发表评论

登录/注册