首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >客户端Unity性能分析

客户端Unity性能分析

原创
作者头像
audy
发布2019-01-02 17:28:49
5K0
发布2019-01-02 17:28:49
举报
文章被收录于专栏:游戏测试开发游戏测试开发

目前大多数游戏使用的都是Unity引擎,所以对游戏Unity性能分析就显得十分重要,而Unity性能主要针对影响内存、CPU和GPU的不同参数进行分析。

其中主要参数包括PFS、Mono峰值、纹理峰值、网格峰值、动画峰值、音频峰值、DrawCalls、Tris峰值。

PFS:

PFS是指画面每秒传输帧数,就是指动画或视频的画面数。如果帧率越高意味着界面越流畅,如果帧率较低会让人感觉显示不连贯即卡顿。通过一段连续的 FPS 计算丢帧率来衡量当前页面绘制的质量。对于手机而言一般要求平均PFS大于25。

当屏幕变化切换的时候,程序需要绘制新的元素展示在屏幕上,界面的刷新速度决定了应用的FPS值。所以,我们有必要分析应用不同界面下,元素的绘制和渲染时间。应用的CPU和内存占用值,这两项数据可以简单表示应用的资源占用情况。应用是否有其他操作导致CPU占用过高,使得刷新操作被延迟也会导致FPS值降低。刷新界面时,程序要绘制新的文字和图片,这个过程中不断分配新内存时,也会进行内存的回收。GC表示系统中的垃圾回收,GC的次数和释放的空间大小也会明显影响机器的性能。影响FPS的因素比较多,界面元素的绘制时间以及GC的耗时是主要影响FPS的两个因素。

对于FPS较低的优化建议一般对CPU和GPU性能进行优化。包括减少一些频繁调用、优化判断条件、优化数据结构、限制加载Asset数量、共用Pass等。

Mono内存峰值:

绝大部分Unity游戏逻辑代码所使用的语言为C#,C#代码所占用的内存称为Mono内存, Unity是通过Mono来跨平台解析并运行C#代码的,C#代码通过mono解析执行,所需要的内存也是由Mono来进行分配管理。

       Mono通过垃圾回收机制(GC)对内存进行管理。Mono内存分为两部分,已用内存(used)和保留内存(Reserved),两者的差值就是Mono的空闲内存。当Mono需要分配内存时,会先查看空闲内存是否足够,如果足够的话,直接在空闲内存中分配,否则Mono会进行一次GC以释放更多的空闲内存,如果GC之后仍然没有足够的空闲内存,则Mono会向操作系统申请内存,并扩充保留内存。由于Mono机制问题保留的Mono内存,只升不降,需要严格控制。

    对于Mono内存峰值偏高可能存在某一帧加载大量资源,可以优化GC函数减少自动扩展Mono内存池并避免同一时刻大量Mono内存分配操作。Mono内存峰值偏高也可能是内存泄漏导致的,这可以使用内存快照对比找出泄露的具体情况。

Textsure纹理峰值:

纹理是最基本的数据输入单位,是Unity最基础的图片形式,纯粹的图片。其中纹理格式、尺寸都决定着纹理加载的效率。

对于纹理资源占用偏大的情况,可以降低纹理分辨率,针对Android使用ETC格式,iOS使用PVRTC格式。用于UI的纹理要禁用mipmaps。

Mesh网格峰值:

网格包括顶点和多个三角形数组。 三角形数组仅仅是顶点的索引数组,每个三角形包含三个索引。每个顶点可以有一条法线,两个纹理坐标,及颜色和切线。所有的顶点信息是被储存在单独的同等规格的数组中。

对于网格资源偏大的情况,可以减少顶点和三角面数。,对于不需要读写的网格资源数据,需要将Read/Write Enable关闭。

AnimationClip动画片段峰值:

动画片段是Unity中最小的动画构造块。它们表示一段独立的运动(如“向左奔跑”(RunLeft)、“跳跃”(Jump) 或“爬行”(Crawl)),可以采用各种方式进行处理和组合,以生成生动的最终结果。

对于动画资源偏大的情况,可以减少Animation的帧数。对于动画资源按需加载,减少一次资源的加载量。

AudioClip音频片段峰值:

音频片段包含音频源 (AudioSource)。 Unity 支持单声道、立体声和多声道音频资源(最多八个声道)。Unity 可以导入的音频文件格式包括 .aif、.wav、.mp3 和 .ogg 。Unity 还可以导入 .xm、.mod、.it 和 .s3m 格式的tracker modules(跟踪器模块)。跟踪器模块资源的行为方式与 Unity 中的任何其他音频资源相同。

纹理、网格、动画、音频等均占用资源内存,最容易造成加大的内存开销,这一部分往往能占据总体内存的70%甚至以上。

DrawCalls:

Unity生成一帧的画面的处理过程大致过程是:引擎经过可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括顶点位置、法线、uv 等),索引(如何组成三角形),变换相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知GPU开始绘制,GPU基于这些数据经过一些列的运算,在屏幕上画出组成图形的三角形,构成一幅画。在unity 中每次引擎装备数据并通知GPU的过程为一次Draw Call。所以DrawCalls是指cpu发送给gpu的渲染请求数,请求中包括渲染对象所有的顶点、三角面、索引值、图元个数等。

Drawcall偏高会对CPU造成较大的负载,对DrawCall的优化,主要就是为了尽量解放CPU在调用图形接口上的开销。所以针对drawcall我们主要的思路就是每个物体尽量减少渲染次数,多个物体最好一起渲染。

Setpasscalls是指渲染Pass的数目,每个Pass都会消耗对应的一个drawcall,在满足渲染效果的情况下尽可能的减少Pass的数量。

Tris峰值:

Triangles是摄像机视野内渲染的三角面总数。

tris面数和verts顶点数这两个重点项都与Camera组件的参数有很大关系。Camera组件有很多可调节的参数,这对优化GPU耗时有比较大的参考价值的时候

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档