博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity优化丨(一)工具篇:知道该从哪些地方去优化
阅读量:2039 次
发布时间:2019-04-28

本文共 3184 字,大约阅读时间需要 10 分钟。

大家好,我是橙哥突然出现~

本系列博客地址:

本系列博客是将用一个完成的WebGL项目作为案例,

进行性能优化。

FPS从最初的的21,到117多。

  

一、性能优化工具

常用的性能分析工具有:

  • Unity Profile
  • Xcode
  • 腾讯UPA性能分析工具

我们可根据工具显示的问题所在,去优化对应的CPU、GPU或者其他内容。

二、概念介绍

1、垂直同步

显示器上的所有图像都是单个像素组成的水平扫描线,水平扫描线在垂直方向的堆积形成了完整的画面,无论是隔行扫描还是逐行扫描,显示器都有两种同步参数——水平同步和垂直同步。

垂直和水平是CRT显示器中两个基本的同步信号,水平同步信号决定了CRT画出一条横越屏幕线的时间,垂直同步信号决定了CRT从屏幕顶部画到底部,再返回原始位置的时间,而垂直同步代表着CRT显示器的刷新率水准。

在游戏项目中,如果我们选择等待垂直同步信号也就是打开垂直同步,在游戏中或许性能较强的显卡会迅速的绘制完一屏的图像,但是没有垂直同步信号的到达,显卡无法绘制下一屏,只有等垂直信号到达,才可以绘制。这样FPS自然受到刷新率运行值的制约。

而如果我们选择不等待垂直同步信号,那么游戏中绘制完一屏画面,显卡和显示器无需等待垂直同步信号就可以开始下一屏图像的绘制,自然可以完全发挥显卡的实力。

但是,正因为垂直同步的存在,才使得游戏进程和显示器刷新率同步,使画面更加平滑和稳定。取消垂直同步信号,固然可换来更快的速度,但在图像的连续性上必会打折扣。

2、GC机制

GC的机制,即垃圾回收。要想了解垃圾回收如何工作以及何时被触发,我们首先要了解unity的内存管理机制。

Unity主要采用自动内存管理的机制,开发时在代码中不需要详细地告诉unity如何进行内存管理,unity内部自身会进行内存管理。

Unity内部有两个内存管理池,堆内存和栈内存,垃圾回收主要是指堆上的内存分配和回收,unity中会定时对堆内存进行GC操作。当堆内存上一个变量不再处于激活状态的时候,其所占用的内存并不会立刻被回收,不再使用的内存只会在GC的时候才会被回收。

每次运行GC的时候,GC会检查堆内存上的每个存储变量,对每个变量会检测其引用是否处于激活状态,如果变量的引用不再处于激活状态,则会被标记为可回收,被标记的变量会被移除,其所占有的内存会被回收到堆内存上。

GC操作是一个极其耗费的操作,堆内存上的变量或者引用越多则其运行的操作会更多,耗费的时间越长。

三、性能分析工具:Unity Profile

1、打开工具

打开方式:Windows-Profile

左侧是Unity Profile面板,里面有很多profilers(分析器)

每个profiler显示我们当前项目一个方面的信息,如CPU、GPU、渲染(Rendering)等等。

2、我们该优化什么

项目卡顿、内容臃肿,我们该怎样优化呢?我们可以查看分析工具,分析:

  • 持续性性能问题
  • 仅在某一帧中出现的性能问题

3、读取面板的信息

运行游戏,选中当前profilers(如CPU),点击右侧选择某一帧,此时游戏会暂停。

此时面板下方即显示当前profilers、当前帧的性能信息。

将下方的TimeLine切换为Hierarchy,

我们可以通过点击下方列表的标题,进行排序。

1)、CPU usage profiler:

当我们在层级视图中点击函数名字时,CPU usage profiler将在Profiler窗口上部的图形视图中高亮显示这个函数的信息。

Hierarchy视图
  • Total:当前任务的时间消耗(包含内部子任务)占当前帧cpu消耗的时间比例。
  • Self:自身任务的时间消耗(不包含内部的子任务)占当前帧cpu消耗的时间比例。
  • Calls:当前任务在当前帧内被调用的次数。
  • GC Alloc:当前任务在当前帧内进行过内存回收和分配的次数。
  • Time ms:当前任务在当前帧内的耗时总时间。
  • Self ms:自身任务在当前帧消耗的时间。

TimeLine视图:

Timeline显示了两件事:cpu任务的执行顺序、哪个线程负责什么任务。

线程允许不同的任务同时执行。当一个线程执行一个任务时,另外的线程可以执行另一个完全不同的任务。

和Unity的渲染过程相关的线程有三种:主线程MainThread,渲染线程RenderThread和worker threads。一旦我们知道了哪个线程上任务执行效率最低,那我们就集中优化哪个线程上的操作。

4、优化标准

CPU:

  • GC Allow:任何一次性内存分配大于2KB的选项。每帧都具有20B以上内存分配的选项 
  • Time ms:注意占用5ms以上的选项

内存:

  • Texture: 检查是否有重复资源和超大内存是否需要压缩等
  • AnimationClip: 重点检查是否有重复资源
  • Mesh: 重点检查是否有重复资源

案例演示

关闭VSync垂直同步

垂直同步不是我们优化的对象,垂直同步受电脑性能影响,关闭它避免干扰。下面是只显示垂直同步的画面

关闭方法:

edit->project settings->Quality,在Inspector面板中,V Sync count选择don’t Sync.

1、排序观察:Total和Time ms

【优化>5ms的选项】

可以看到,我们以Total和Time ms排序,Camera Render 和 PreLateUpdate.ParticleSystemBeginUpdateAll 始终排在最前面。

Camera Render是相机渲染工作的CPU占用量,在实际项目中,渲染是最常见的引起性能问题的原因。 而因为渲染而引起的性能问题的优化是一个非常大的工程,这方面的优化我们会在后续GPU文章(中详细讲解。在这里,我们只需要先了解。

我们这个项目的优化中,无疑,渲染、粒子特效是造成性能损耗的主要原因。

2、排序观察:GC

【优化任何一次性内存分配大于2KB的选项,每帧都具有20B以上内存分配的选项 】

在我们性能分析中,若渲染已经没有什么问题,那么我们接下来要重点观察的就是GC,也就是垃圾回收性能分析。 

这方面的优化我们会在后续CPU文章(中详细讲解。

3、排序观察:Scripts 

考虑到是否是脚本的一些问题造成性能损耗。

我们按照Time ms来排序,然后点开下面列表中的项目,查看是哪个脚本的哪个函数,导致性能损耗。下图显示是RuntimeEditorApplication.Update中的FindObjectsOfType导致性能损耗。

4、其他

同时,我们还可以关注物理、UI方面的性能问题。 

二、Xcode

1、如何开启Xcode的性能分析功能

a、Unity打包IOS时 Run in Xcode as Debug

b、勾选Development Build

c、打包完成后,用Xcode打开

在Xcode中选择Product ——> Scheme——> Manage Schemes

d、出现下面界面后,双击这个项目

e、点击左侧的Run

f、右侧Option:GPU frame Capture中选择OpenGL ES或者Metal。 

g、在Debug模式下运行项目,当项目在真机上完全加载后,就可以进入Debug Navigator(View ——> Navigators ——> Show Debug Navigator)

2、查看应用性能分析信息

以下是GPU frame Capture具体功能的界面,在图形化界面中,可以在游戏运行时清晰的了解到CPU、GPU、内存的使用情况。

三、UPA

UPA是Unity和腾讯联合推出,参考腾讯官方文档链接:

转载地址:http://ebfof.baihongyu.com/

你可能感兴趣的文章
maven-jar-plugin 排除不想打包的目录文件内容
查看>>
feign.FeignException: status 404 reading xxService#xxmethod(Integer)
查看>>
唯品会后端架构部分内容分享(一) ( 20180613 by flyer)
查看>>
Spring Cloud Zuul实现动态路由
查看>>
zuul动态路由支持的路径格式及扩展性测试
查看>>
linux服务器校对时间方法
查看>>
rocketMQ 消息查询(id,key) 运维命令以及java API的用法
查看>>
RocketMQ学习(五):Pull和Push (important)
查看>>
Linux下查看系统启动时间和运行时间
查看>>
数据处理过慢的问题分析(涉及插入查询)
查看>>
JVM线程状态,park, wait, sleep, interrupt, yeild 对比
查看>>
java.lang.Thread.State:WAITING(parking)
查看>>
Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?
查看>>
swagger默认访问地址
查看>>
redis-desktop-manager 的简单使用
查看>>
python+Eclipse+pydev环境搭建
查看>>
python2.7安装paramiko 出现import winrandom importerror
查看>>
redis cluster 集群的一些操作命令
查看>>
redis cluster 全部宕机后重启会自动恢复集群状态
查看>>
python 一篇搞定所有的异常处理
查看>>