Unity整体性能优化篇 第(一)节:Unity性能优化相关前提


一.Unity游戏安装包大/运行卡的原因?

原因

Mono虚拟机(可跨平台的依赖)的存在造成的unity开发的游戏包普遍的大,而且运行速度较慢。

流程

我们开发的游戏->Mono虚拟机进行运行->操作系统。

优化:

优化必不可少,不然开发出来的unity游戏无法达到商业标准,玩家游戏体验特别差。


二:DrawCall

1. DrawCall,CPU,GPU介绍

DrawCall:

优化相关的属性,就是cpu对图形绘制接口的调用,CPU通过调用图形库(directx/opengl)接口,命令GPU进行渲染操作的过程。(DrawCall数量代表命令次数cpu对gpu的命令次数)

CPU:也叫做中央处理器(Central Processing Unit)

是一台计算机的运算核心(Core)和控制核心( Control Unit)。
CPU的主要组件包括执行算术和逻辑操作的算术逻辑单元(ALU)、向ALU提供操作数并存储ALU操作结果的处理器寄存器和协调提取(从存储器)和执行指令的控制单元。

GPU:图形处理器(Graphics Processing Unit)

又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器

2.CPU和GPU是如何进行并行工作和交互的?

CPU与GPU并行工作,独立而不相互依赖。这是通过命令缓冲区来实现的:命令缓冲区维护一个命令队列,CPU向其中发送命令,GPU从中取出命令并执行。命令有很多种,DrawCall是一种,其他命令还有改变渲染状态、设置渲染数据流等。

这种方式就类似于游戏开发的网络通信:维持一个消息队列,网络线程接收解析消息并将之添加到消息队列,游戏主线程更新时从中取出消息并做派发处理。

3.DrawCall是如何影响性能的?

每一次绘制CPU都要调用DrawCall,而在调动DrawCall前,CPU还要进行很多准备工作:检测渲染状态、提交渲染所需要的数据、提交渲染所需要的状态。

而GPU本身具有很强大的计算能力,可以很快就处理完渲染任务。

当DrawCall过多,CPU就会很多额外开销用于准备工作,CPU本身负载,而这时GPU可能闲置了。

4.DrawCall优化:减少DrawCall

既然,我们已经知道DrawCall导致的性能问题在于DrawCall数量过多,那么我们优化的思路就是减少DrawCall。这里我们只讨论批处理(Batching)。

过多的DrawCall会造成CPU的性能瓶颈:大量时间消耗在DrawCall准备工作上。很显然的一个优化方向就是:尽量把小的DrawCall合并到一个大的DrawCall中,这就是批处理的思想。

使用批处理我们需要在CPU和RAM中合并网格,而合并网格本身是需要计算消耗,而且创建新网格也会占用内存。因此批处理的频次不宜太高,不然造成的消耗可能得不偿失。


使用批处理的注意事项:

合并的网格会在一次渲染任务中进行绘制,他们的渲染数据,渲染状态和shader都是一样的,因此合并的条件至少是:

1.同材质、同贴图、同shader。最好网格顶点格式也一致。

2.尽量避免使用大量小的网格,当确实需要时,考虑是否要合并。

3.避免使用过多的材质,尽量共享材质。

4.网格合并的顶点数量有上限(Unity中好像是65535)

5.合并本身有消耗,因此尽量在编辑器下进行合并

6.确实需要在运行时合并的,将静态的物体和动态的物体分开合并:静态的合并一次就可以,动态的只要有物体发生变换就要重新合并。


三:UnityProfiler性能分析器

1.unityProfiler介绍:

CPU,GPU的性能分析器,可以查看DrawCall等等影响性能的数据,以及数据图。
在这里插入图片描述

2.如何查看

ctrl+7即可调出面板,或者Window- >anlysis ->Profiles
unity相关资料:Profiler分析器详解


四:UnityStatistcs统计面板

1.UnityStatistcs统计面板介绍 (Game->stats)

Statistics窗口:全称叫做 Rendering Statistics Window,即渲染统计窗口(或渲染数据统计窗口),窗口中罗列出关于渲染、声音、网络状况等多种统计信息

Statistics窗口位置:Game->Stats
在这里插入图片描述

2.统计面板属性介绍

FPS

FPS(Time per frame andFPS):frames per seconds表示引擎处理和渲染一个游戏帧所花费的时间,该数字主要受到场景中渲染物体数量和 GPU性能的影响,FPS数值越高,游戏场景的动画显示会更加平滑和流畅。一般来说,超过30FPS的画面人眼不会感觉到卡,由于视觉残留的特性,光在视网膜上停止总用后人眼还会保持1/24秒左右的时间,因此游戏画面每秒帧数至少要保证在30以上。

另外,Unity中的FPS数值仅包括此游戏Scene里更新和渲染的帧,编辑器中绘制的Scene和其它监视窗口的进程不包括在内。

CPU

CPU:获取到当前占用CPU进行计算的时间绝对值,或时间点,如果Unity主进程处于挂断或休眠状态时,CPU time将会保持不变。
Render thread
Render thread:GPU渲染线程处理图像所花费的时间,具体数值由GPU性能来决定

Batches

Batches: 即Batched Draw Calls,是Unity内置的Draw Call Batching技术。

一般来说,引擎每对一个物体进行一次DrawCall,就会产生一个Batch,这个Batch里包含着该物体所有的网格和顶点数据,当渲染另一个相同的物体时,引擎会直接调用Batch里的信息,将相关顶点数据直接送到GPU,从而让渲染过程更加高效,即Batching技术是将所有材质相近的物体进行合并渲染。

对于含有多个不同Shader和Material的物体,渲染的过程比较耗时,因为会产生多个Batches。每次对物体的材质或者贴图进行修改,都会影响Batches里数据集的构成。因此,如果场景中有大量材质不同的物体,会很明显的影响到GPU的渲染效率。
这里说几点关于Batches优化相关的方案:
          1.虽然Unity引擎自带Draw Call Batching技术,我们也可以通过手动的方式合并材质接近的物体;
          2.尽量不要修改Batches里物体的Scale,因为这样会生成新的Batch;
          3.为了提升GPU的渲染效率,应当尽可能的在一个物体上使用较少的材质,减少Batches过多的开销;
          4.对于场景中不会运动的物体,考虑设置Static属性,Static声明的物体会自动进行内部批处理优化。

Verts和Tris

Verts:摄像机视野(field of view)内渲染的顶点总数。
Tris: 摄像机视野(field of view)内渲染的的三角面总数量。

◆ Camera的渲染性能受到Draw calls的影响。

之前说过,对一个物体进行渲染,会生成相应的Draw call,处理一个Draw Call的时间是由它上边的Tris和Verts数目决定。尽可能得合并物体,会很大程度的提高性能。举个很简单例子,比如场景一种有1000个不同的物体,每个物体都有10个Tris;场景二中有10个不同的物体,每个物体有1000个Tris。在渲染处理中,场景一中会产生1000个Draw Calls,它的渲染时间明显比场景二慢。

◆ Unity stats 视图中的 Tris 和 Verts 并不仅仅是视锥中的梯形内的 Tris 和 Verts,而是Camera中 field of view所有取值下的tris和verts。

换句话说,哪怕你在当前game视图中看不到这个 cube,如果当你把 field of view调大到 179 过程中都看不到这个cube,stats面板才不会统计,GPU才不会渲染,否则都会渲染,而且unity不会把模型拆分,这个模型哪怕只有1个顶点需要渲染,unity也会把整个模型都渲出来。

◆为什么场景没有物体时Status面板上显示有1.7k Tris以及5.0kVerts
新建一个空的场景,里边没有添加任何物体,为什么Status面板上显示有1.7k Tris以及5.0kVerts。这是因为空的场景自带默认的天空盒。

Screen

Screen:获当前Game屏幕的分辨率大小,后边的2.1MB表示总的内存使用数值。

SetPass calls

比如说场景中有100个gameobject,它们拥有完全一样的Material,那么这100个物体很可能会被Unity里的Batching机制结合成一个Batch。所以用“Batches”来描述Unity的渲染性能是不太合适的,它只能反映出场景中需要批处理物体的数量。那么可否用“Draw calls”来描述呢?答案同样是不适合。每一个“Draw calls”是CPU发送个GPU的一个渲染请求,请求中包括渲染对象所有的顶点参数、三角面、索引值、图元个数等,这个请求并不会占用过多的消耗,真正消耗渲染资源的是在GPU得到请求指令后,把指令发送给对应物体的Shader,让Shader读取指令并通知相应的渲染通道(Pass)进行渲染操作。

假设场景中有1个gameobject,希望能显示很酷炫的效果,它的Material上带有许多特定的Shader。为了实现相应的效果,Shader里或许会包含很多的Pass,每当GPU即将去运行一个Pass之前,就会产生一个“SetPass call”,因此在描述渲染性能开销上,“SetPass calls”更加有说服力。

Shadow casters

Shadow casters:表示场景中有多少个可以投射阴影的物体,一般这些物体都作为场景中的光源。

visible skinned meshed

visible skinned meshed:渲染皮肤网格的数量。

Animations

Animations:正在播放动画的数量。






项目工程链接地址(GitHub)

求github小星星哈,谢谢啦?
Unity性能优化项目工程链接:https://github.com/HanxianshengGame/Unity-Optimize-Project






--------------------------------------------------------我是有底线的-------------------------------------------------------------

    感谢能够观看博客的各位Unity开发爱好者们,有问题发表评论呐,★,°:.☆( ̄▽ ̄)/$:.°★

猜你喜欢

转载自blog.csdn.net/chongzi_daima/article/details/101380737