Unity手机游戏性能优化系列 : 针对CPU端的性能调优

前言

做手机游戏开发的时,经常会遇到手机游戏的性能问题,手机游戏的性能问题可能有很多的方面,今天我们从CPU调优的角度来給大家介绍一下常用的CPU调优的一些经验和手段。这些经验和手段都有可能随着时间与环境的变化改变而改变,具体还是要以实际的为准,先定位性能问题,再上具体的手段。接下来我们从CPU的性能调优的角度来总结一下Unity手游开发中需要注意和优化CPU的一些点。我们把手机游戏的CPU调优分成几个模块,列举一下每个模块的一些经验,供大家参考。模块如下:
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀

(1) 渲染模块;

(2) 物理模块;

(3) 动画模块与粒子系统;

(4) 逻辑代码优化

渲染模块调优

影响渲染CPU执行效率的本质就是两个东西,一个是渲染的面数(Triangle), 一个是渲染提交的次数(Drawcall)。这个部分很多开发者就会陷入一个所谓的标准”手机上模型一般多少个面合适?”这种问题其实没有任何意义的,需要结合自己的游戏来进行实测。时空背景不一样,游戏玩法不一样结果就不一样。一般我们的做法就是到自己目标客户的机型上进行实测。在我们的Shader确定后的效果下,我们目标客户的机型上面能跑多少个面。然后我们结合游戏的玩法,这些面放在哪些地方。比如近距离我们的面就分配得多,远距离就分配得少。重要主角面分配得多,不重要物体的面分配得少。也可以通过LOD工具在低端手机上减少模型面数。Drawcall大家比较熟悉了,有动态合批,静态合批,SRP Batcher合批,GPU Instancing合批,具体可以参考教程《Unity 如何优化Drawcall》。还有一个被很多人忽视的就是Set Pass Call开销,在这个过程中,第一次加载Shader容易造成瞬间卡顿。Shader.CreateGPUProgram, 解决的方案是运行的时候做好Shader缓存,避免瞬间CPU卡顿。

在UGUI的优化中,主要是检查UI的逻辑响应函数是否占用过高,同时把不用事件响应的UI元素去掉选项”Raycast Target”, 这样不用在每个UI元素去检测用户是否有UI操作,减少EventSystem.Update()耗时开销。每个Canvas会调用BuildBatch为UI元素合并的Mesh。一旦UI元素发起移动,这样就会引发BuildBatch, 合并过程是在其它线程处理的,如果合并的消耗过大,就会导致主线程发起等待。这个是我们我们可以把静态的物体分到一个Canvas,动态的物体分到一个Canvas,这样,能降低合并的难度与合并的开销。UGUI的使用过程中也注意以下几个点:

(1)同一Canvas下的UI元素才能合批。不同Canvas即使Order in Layer相同也不合批;

(2)尽量使用图集,让UI Drawcall合并有可能;

(3)在同一Canvas下、且材质和图集一致的前提下,尽量把同一个图集的节点放一起渲染,避免打乱drawcall合批;

(4)将相关UI的Pos Z尽量统一设置为0,Z值不为0的UI元素只能与Hierarchy中相邻元素尝试合批,所以容易打断合批。

(5)对于Alpha为0的Image,需要勾选其CanvasRender组件上的Cull Transparent Mesh选项,否则依然会产生DrawCall且容易打断合批。

最后选取合适的渲染管线与策略也是渲染性能与效果的关键,比如使用URP做实时光照等。

物理模块调优

不使用物理引擎的项目,我们可以关闭物理引擎的Auto Simulation, 如果不用射线检测等,还可以关闭物理的射线检测(Auto Sync Transform)。物理引擎的迭代,主要是在FixedUpdate去迭代物理世界的Update,如果FixedUpdate的调用频率的次数越高,那么物理迭代次数就越高,更新越频繁。物理引擎的迭代参数设置,如图 1.1-1:

Fixed Timestep: 独立于帧率,按照固定的时间间隔进行迭代,物理引擎就是基于它,迭代;

Maximum Allowed Timestep: 允许最大的时间步长, 物理计算的时间开销,不允许超过这个值,限定了单帧的物理计算的最大时间, 所以这个值越小,迭代的次数可能就越少。

可以通过调节这两个值来调整物理引擎的迭代次数与开销。由于FixedUpdate的迭代与帧率无关,所以不要在FixedUpdate里面写过多的复杂的逻辑。最后控制物理引擎中刚体的数目,这个结合自己的项目来做设定,用性能好的碰撞器来代替性能查的碰撞器。

动画模块与粒子系统

控制Active Animator的一个方法是针对每个动画组件调整合理的Animator.CullingMode设置。该设置有三个选项:

AlwaysAnimate:当前物体不管是不是在视域体内,或者在视域体被LOD Culling掉了,Animator的所有东西都仍然更新;其中,UI动画一定要选AlwaysAnimate,不然会出现异常表现。

CullUpdateTransforms: 当物体不在视域体内,或者被LOD Culling掉后,逻辑继续更新,就表示状态机是更新的,动画资源中连线的条件等等也都是会更新和判断的;但是Transform这些显示层的更新就不做了。在不影响效果的前提下把部分动画组件尝试设置成CullUpdateTransforms可以节省物体不可见时动画模块的显示层耗时。

CullComplete:完全不更新,适用于场景中相对不重要的动画效果,在低端机上需要保留显示但可以考虑让其静止的物体,分级地选用该设置。

Animator还有个很重要的标志就是开启Apply Root Motion,如果动画不发生位移,就不要开启这个选项,开启后可能会导致动画中Animator.ApplyBuiltinRootMotion开销过高。

当我们Active/Deactive一个Animator组件物体的时候,会导致Animator.Initialize函数的调用,当检测到这个开销比较大时,可以将其移出屏幕,比如关闭Animator组件,scale = 0,而代替activie/deactive。

粒子系统开销与粒子系统数量和Playing状态的粒子系统数量有关。前者是指内存中所有的ParticleSystem的总数量(包含正在播放的和处于缓存池中的);后者指的是正在播放的ParticleSystem组件的数量(包含了屏幕内和屏幕外),针对这两个数值,我们一方面关注粒子系统数量峰值是否偏高,可选中某一峰值帧查看到底是哪些粒子系统缓存着、是否都合理、是否有过度缓存的现象;另一方面关注Playing数量峰值是否偏高,可选中某一峰值帧查看到底是哪些粒子系统在播放、是否都合理、是否能做些制作上的优化。在底端机上就可以考虑控制这些粒子数量,或者干脆关闭粒子特效来让游戏流畅,具体可以从这个角度去操作与思考。

逻辑代码调优

逻辑代码编写就没有什么可说的了,平常注意一些开发代码的习惯,避免过的new 对象导致的GC等,提升算法的时间空间复杂度,用空间换时间,用时间换空间,多线程处理来发挥多核优势, 做好代码review。具体的结合自己的项目做好对应的处理。

今天的分享就到这里了,关注我们学习更多的Unity开发的相关知识。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容