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

简介: 目录优化脚本优化脚本视锥剔除和协同例程智能内存管理缓存频繁使用的对象和组件使用 Unity 物理系统的最佳实践禁用完全透明对象返回至教程第 1 部分:面向英特尔 x86 平台的 Unity* 优化指南: 第 1 部分优化在本指南中,我们将研究优化的两个主要方面:脚本和基于编辑器。

目录

优化

脚本优化

脚本视锥剔除和协同例程

智能内存管理

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

使用 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.当编辑对象透明度时,请始终检查其是否可见,如有必要节省资源,则需将其禁用。

相关文章
|
2月前
|
存储 设计模式 监控
运用Unity Profiler定位内存泄漏并实施对象池管理优化内存使用
【7月更文第10天】在Unity游戏开发中,内存管理是至关重要的一个环节。内存泄漏不仅会导致游戏运行缓慢、卡顿,严重时甚至会引发崩溃。Unity Profiler作为一个强大的性能分析工具,能够帮助开发者深入理解应用程序的内存使用情况,从而定位并解决内存泄漏问题。同时,通过实施对象池管理策略,可以显著优化内存使用,提高游戏性能。本文将结合代码示例,详细介绍如何利用Unity Profiler定位内存泄漏,并实施对象池来优化内存使用。
109 0
|
20天前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
80 0
|
20天前
|
开发者 图形学 iOS开发
掌握Unity的跨平台部署与发布秘籍,让你的游戏作品在多个平台上大放异彩——从基础设置到高级优化,深入解析一站式游戏开发解决方案的每一个细节,带你领略高效发布流程的魅力所在
【8月更文挑战第31天】跨平台游戏开发是当今游戏产业的热点,尤其在移动设备普及的背景下更为重要。作为领先的游戏开发引擎,Unity以其卓越的跨平台支持能力脱颖而出,能够将游戏轻松部署至iOS、Android、PC、Mac、Web及游戏主机等多个平台。本文通过杂文形式探讨Unity在各平台的部署与发布策略,并提供具体实例,涵盖项目设置、性能优化、打包流程及发布前准备等关键环节,助力开发者充分利用Unity的强大功能,实现多平台游戏开发。
44 0
|
20天前
|
开发者 图形学 UED
深度解析Unity游戏开发中的性能瓶颈与优化方案:从资源管理到代码执行,全方位提升你的游戏流畅度,让玩家体验飞跃性的顺滑——不止是技巧,更是艺术的追求
【8月更文挑战第31天】《Unity性能优化实战:让你的游戏流畅如飞》详细介绍了Unity游戏性能优化的关键技巧,涵盖资源管理、代码优化、场景管理和内存管理等方面。通过具体示例,如纹理打包、异步加载、协程使用及LOD技术,帮助开发者打造高效流畅的游戏体验。文中提供了实用代码片段,助力减少内存消耗、提升渲染效率,确保游戏运行丝滑顺畅。性能优化是一个持续过程,需不断测试调整以达最佳效果。
44 0
|
1月前
|
Apache 图形学
WebGL☀️Unity WebGL适配到各平台的教程
WebGL☀️Unity WebGL适配到各平台的教程
|
1月前
|
C# 图形学 C语言
Unity3D学习笔记3——Unity Shader的初步使用
Unity3D学习笔记3——Unity Shader的初步使用
34 0
|
3月前
|
图形学
【unity小技巧】unity3D寻路指示轨迹预测
【unity小技巧】unity3D寻路指示轨迹预测
51 0
|
20天前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
62 6
|
19天前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
40 4
|
20天前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
38 5