Unity3d面向英特尔 x86 平台的 Unity* 优化指南: 第 2 部分

目录

优化

脚本优化

脚本视锥剔除和协同例程

智能内存管理

缓存频繁使用的对象和组件

使用 Unity 物理系统的最佳实践

禁用完全透明对象

返回至教程第 1 部分:

面向英特尔 x86 平台的 Unity* 优化指南: 第 1 部分

优化

在本指南中,我们将研究优化的两个主要方面:脚本和基于编辑器。您将看到许多基于其运行所在根的各个优化的具体信息。

脚本优化

脚本视锥剔除和协同例程

当您正在分析您的应用并发现无需每帧调用脚本的 Update() 功能时,您可使用几大方法减少更新量:

脚本视锥剔除

使用以下 Monobehavior 回调功能剔除在焦点未对准时无需更新的摄像头视锥以外的脚本。

图 12.当采用脚本的对象离开/进入摄像头视锥时,Monobehavior 回调功能触发

协同例程

本质上,协同例程功能可暂停并恢复执行。 在删除脚本中的原始 Update() 功能并将其替换为协同例程后,您就能够利用这一功能。 然后,您可通过yield命令对想要多久执行一次协同例程进行设置。 这一片段显示了如何创建每 2 秒调用一次的定制智能更新,而非使用每帧调用一次的默认设置:

图 13.通过协同例程实现更高效的更新

智能内存管理

如果您正在寻找一些优化内存使用的方法,那么首先检查 Unity 分析器会很有帮助。 大概了解您管理内存方式的绝佳方法是检查 Overview 窗口的“GC Alloc”部分(图 14),并单步调试帧,直到您看到有效分配。

图 14.通过连续检查多个帧,您可确定 GC 发生和调整的时间

此外,检查调用垃圾收集的频率也会有所帮助。 若要做到这一点,需隔离“CPU Usage”子分析器中的 GarbageCollector 字段(图 15):

图 15.GC 发生时 CPU Usage 中确定的点

然后在显示收集时,您可单击图表中的峰值,并寻找对 GC.Collect 的调用(图 16)。 通过这种方式,您能够了解每次收集所用的时间:

图 16.有关 GC 的统计数字

为了避免频繁分配,最好使用结构,而非类别,在堆栈上完成分配,而非堆中。 多个至堆的分配将导致出现大量内存碎片和频繁的垃圾收集。

缓存频繁使用的对象和组件

一般来说,您应分析您的应用,以找到使用最频繁的游戏对象和组件,并确保将这些值进行高速缓存。每个您看到的获取对象场景都是一次进行高速缓存和减少不必要计算的良机。

相同的规则也适用于游戏对象实例化。 通常,实例化是应当避免的速度相对较慢的调用。如果在每个场景中反复创建并销毁同一对象类型,那么最好保存一份相关对象清单,以在对象管理器脚本中重复使用。

Unity 建议您使用一个中央游戏管理器保存所有缓存的游戏对象清单。在应用这一技巧后,您可采纳以下代码片段,通过切换状态按钮或其他控制机制比较两种方法之间是否存在性能提升,同时实时查看CPU Usage 分析器。 下面是显示使用差异的片段(图 14):

图 17.使用 STATE 切换对象

使用 Unity 物理系统的最佳实践

在处理 Unity 中的动态对象时,需避免一些熟知的优化和陷阱。 无论您计划自己迁移对象,还是让 Unity 控制物理对象,您都需要将Rigidbody组件添加至您的对象, 从而告知 Unity 物理系统该对象具有可迁移性。 当您想要手动迁移对象时,只需勾选isKinematic标记即可(图 18)。此外,您还需要确保并未勾选 inspector 右上角面向该对象的static 复选框(图 19)。

图 18.勾选 isKinematic,以完全控制对象迁移

图 19.未勾选 Static 属性,以免动态对象进入静态集

为了确保您在应用中恰当处理动态对象,请打开分析器、隔离CPU Profilerphysics部分、突出显示位于物理时间步长的帧(默认每秒更新 24 次),并确认您并未在 overview 窗口的对象 FixedUpdate() 调用下看到任何“Static Collider.Move(昂贵的延误成本)”条目(图 20)。 Static Collider.Move 消息的缺少表示本部分中的物理系统正常运行。

图 20.当您未正确管理动态对象时,Static Collider.Move(昂贵的延误成本)就会出现

禁用完全透明对象

对于在“淡出”渲染模式下使用材料的对象,或任何可变成完全透明的对象,如果其完全透明,那么必须确保将面向该对象的MeshRenderer组件设置为禁用。这些对象将始终在绘制调用中进行分派,无论 alpha 值如何。例如,开发人员有时使用全屏四边形在事件触发时绘制脉冲输入和输出的损害指标或装饰图案效果。您需要了解当对象完全透明时引擎本身并未跟踪,如果不注意的话,就会造成资源浪费。以下是在同一场景中截取的截图,唯一不同之处在于前景中半透明对象的 alpha 值。

图 21.捕获相应 GPA 帧的5 个半透明平面。 半透明对象可见,并在 2,657.5 微秒内占据 37.4% 的场景。

图 22.5 个之前提及已将其材料的 alpha 值设置为 0 的平面。相应 GPA 帧捕获显示 GPU 仍然执行了绘制命令。这些图画在 2,316.5 微秒内占据 32.1% 的场景。

为了确保您并未分派不必要的绘制调用,您始终需要尽可能地检查与您潜在透明对象相关的 alpha 值。对于基于颜色渲染的简单材料,只需按照以下代码片段使用机制。

图 23.当编辑对象透明度时,请始终检查其是否可见,如有必要节省资源,则需将其禁用。

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

推荐阅读更多精彩内容