本文共 3184 字,大约阅读时间需要 10 分钟。
大家好,我是橙哥突然出现~
本系列博客地址:
本系列博客是将用一个完成的WebGL项目作为案例,
进行性能优化。
FPS从最初的的21,到117多。
常用的性能分析工具有:
我们可根据工具显示的问题所在,去优化对应的CPU、GPU或者其他内容。
显示器上的所有图像都是单个像素组成的水平扫描线,水平扫描线在垂直方向的堆积形成了完整的画面,无论是隔行扫描还是逐行扫描,显示器都有两种同步参数——水平同步和垂直同步。
垂直和水平是CRT显示器中两个基本的同步信号,水平同步信号决定了CRT画出一条横越屏幕线的时间,垂直同步信号决定了CRT从屏幕顶部画到底部,再返回原始位置的时间,而垂直同步代表着CRT显示器的刷新率水准。
在游戏项目中,如果我们选择等待垂直同步信号也就是打开垂直同步,在游戏中或许性能较强的显卡会迅速的绘制完一屏的图像,但是没有垂直同步信号的到达,显卡无法绘制下一屏,只有等垂直信号到达,才可以绘制。这样FPS自然受到刷新率运行值的制约。
而如果我们选择不等待垂直同步信号,那么游戏中绘制完一屏画面,显卡和显示器无需等待垂直同步信号就可以开始下一屏图像的绘制,自然可以完全发挥显卡的实力。但是,正因为垂直同步的存在,才使得游戏进程和显示器刷新率同步,使画面更加平滑和稳定。取消垂直同步信号,固然可换来更快的速度,但在图像的连续性上必会打折扣。
GC的机制,即垃圾回收。要想了解垃圾回收如何工作以及何时被触发,我们首先要了解unity的内存管理机制。
Unity主要采用自动内存管理的机制,开发时在代码中不需要详细地告诉unity如何进行内存管理,unity内部自身会进行内存管理。
Unity内部有两个内存管理池,堆内存和栈内存,垃圾回收主要是指堆上的内存分配和回收,unity中会定时对堆内存进行GC操作。当堆内存上一个变量不再处于激活状态的时候,其所占用的内存并不会立刻被回收,不再使用的内存只会在GC的时候才会被回收。
每次运行GC的时候,GC会检查堆内存上的每个存储变量,对每个变量会检测其引用是否处于激活状态,如果变量的引用不再处于激活状态,则会被标记为可回收,被标记的变量会被移除,其所占有的内存会被回收到堆内存上。
GC操作是一个极其耗费的操作,堆内存上的变量或者引用越多则其运行的操作会更多,耗费的时间越长。
打开方式:Windows-Profile
左侧是Unity Profile面板,里面有很多profilers(分析器)
每个profiler显示我们当前项目一个方面的信息,如CPU、GPU、渲染(Rendering)等等。
项目卡顿、内容臃肿,我们该怎样优化呢?我们可以查看分析工具,分析:
运行游戏,选中当前profilers(如CPU),点击右侧选择某一帧,此时游戏会暂停。
此时面板下方即显示当前profilers、当前帧的性能信息。
将下方的TimeLine切换为Hierarchy,
我们可以通过点击下方列表的标题,进行排序。
当我们在层级视图中点击函数名字时,CPU usage profiler将在Profiler窗口上部的图形视图中高亮显示这个函数的信息。
TimeLine视图:
Timeline显示了两件事:cpu任务的执行顺序、哪个线程负责什么任务。
线程允许不同的任务同时执行。当一个线程执行一个任务时,另外的线程可以执行另一个完全不同的任务。
和Unity的渲染过程相关的线程有三种:主线程MainThread,渲染线程RenderThread和worker threads。一旦我们知道了哪个线程上任务执行效率最低,那我们就集中优化哪个线程上的操作。
CPU:
内存:
关闭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方面的性能问题。
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)
以下是GPU frame Capture具体功能的界面,在图形化界面中,可以在游戏运行时清晰的了解到CPU、GPU、内存的使用情况。
UPA是Unity和腾讯联合推出,参考腾讯官方文档链接:
转载地址:http://ebfof.baihongyu.com/