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

简介: 目录编辑器优化压缩纹理移动存储着色器静态批处理动态批处理HDR – 高动态范围选择最佳渲染路径注意额外的正向绘制调用Android:拆分二进制结论资源关于作者返回至教程第 3 部分:面向英特尔 x86 平台的 Unity* 优化指南: 第 3 部分编辑器优化压缩纹理不必要的高分辨率纹理很容易成为移动游戏中的瓶颈,造成硬件效率降低。

目录

编辑器优化

压缩纹理

移动存储着色器

静态批处理

动态批处理

HDR – 高动态范围

选择最佳渲染路径

注意额外的正向绘制调用

Android:拆分二进制

结论

资源

关于作者

返回至教程第 3 部分:

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

编辑器优化

压缩纹理

不必要的高分辨率纹理很容易成为移动游戏中的瓶颈,造成硬件效率降低。

因此,您不仅需要确认场景中所用纹理是否采用压缩格式,而且还需要核实您已经选中 Generate Mip Maps 复选框,以支持 MIP

贴图处理。 除纹理分辨率之外,MIP 贴图处理类似于之前讨论的 LOD 系统。如果您绘制的任何对象距离摄像头太远,那么不必使用 1024 x

1024 纹理获取其细节,因为该对象可能只有几个像素。

图 44.在选定纹理的 Inspector 选项卡上压缩纹理和生成 MIP

您可在 GPA 中进行帧捕获,并查看Texture选项卡了解您想要调查的绘制调用,以确认纹理得到压缩,且生成了 MIP。需要注意的是,生成 MIP 贴图将产生更多数据,因此实际上在有些情况下会导致性能下降。请您一如既往地在应用中确认这一选项。

图 45.在帧分析器中查看纹理的第 4 MIP 层和格式。

移动存储着色器

当您在移动应用中使用存储着色器时,需要切换至 Unity 提供的移动版副本,以确保使用精确度较低的浮点值和移动特定优化。 选择您的材料,并在下拉菜单中找到 Mobile 部分,以在应用中进行试用(图 41)。

图 46.Unity 中的存储着色器

静态批处理

批处理将着色相似的几何图形整合至单绘制调用中。这能够减少通常额外调用造成的驱动程序开销。 您可通过选择 File->Build

Settings>Player Settings 并勾选所列“Static Batching”选项打开静态批处理。Unity

现默认支持这些设置。

图 47.Other Settings 中 Rendering 下的 Static Batching 和 Dynamic Batching 复选框

对于所有不会迁移的游戏对象,勾选静态复选框。这可支持将静态批处理功能用于共享一种材料的多个相似对象。

图 48.基于对象的批处理勾选

确保您使用 Renderer.sharedMaterial,而非 Renderer.material,以保证材料共享。

尽可能地将同一材料所用的多个纹理(漫射、凹凸高光等)整合至一个纹理图集中,以增加批处理对象的数量。

大多数时候,静态批处理可为您的应用提供巨大优势,但在有些情况下最好不要使用它。

如果您需要减少内存使用,那么最好不要使用静态批处理。

事实上,共享几何数据的对象必须将各个实例顶点/索引数据的副本整合至绘制调用的顶点和索引缓冲区内。 Unity

举例说明了静态批处理在密林场景中可能出现问题的情形。在这种极端环境中,您需要在发出调用之前,将所有使用相同材料的树木整合至相应缓冲区中,但这可能

导致性能问题。

动态批处理

动态批处理虽与静态批处理的概念相同,但主要针对动态对象(可移动对象)进行绘制调用批处理。

动态批处理仅适用于总顶点属性低于 900 的对象(可能随时更改)。

接收实时阴影的对象将无法进行批处理。

HDR – 高动态范围

如果您使用延迟渲染技术获得了具有 HDR 效果的场景(例如爆炸和燃烧),那么通过勾选 Camera 设置中的 HDR

选框,您将发现绘制调用大幅减少。 需要注意的是,每个摄像头都有其自己的 HDR 复选框。 在使用带有延迟渲染的 DirectX 10

或更高版本时,最好使用 HDR。 HDR 与片段着色器之间有着最紧密的关联。 如果您想要使用 HDR 效果,那么请遵循以下准则:

使用延迟渲染

针对需要 HDR 产生效果的各摄像头,勾选 HDR 选框(图 44)

图 49.Camera 设置中的 HDR 选项

选择最佳渲染路径

为您的应用选择最佳渲染路径在很大程度上依赖于您想要完成什么工作。以下内容简要概述了 Unity

提供的各个渲染路径及其优劣。希望通过这些信息,您能够了解根据您项目的具体情况,您应选择哪种路径,但与其余这些优化一样,始终需要对各个选项进行测

试! 了解哪种渲染路径最适合您的游戏的绝佳方式是使用代码编写一个开关。您只需按下开关按钮即可改变渲染路径,然后通过 Unity 分析器和 GPA

实时观察每个路径的效果。

顶点光照渲染

图 50.通过顶点光照路径渲染的场景最终渲染目标

优点

仅按照每顶点,而非每像素,进行照明计算

将对带有 1024 个顶点的模型(覆盖 4k 显示器的整个全屏窗口)进行照明计算:

使用每顶点照明方法,计算 1024 次

使用每像素照明方法,计算 8294400 次

可显著提高移动性能

简化分析。在基础通道中完成一切。

缺点

不支持实时阴影及其他每像素效果

低质量照明(图……)

图 51.顶点光照渲染路径细分(全部在基础通道中)

正向渲染

图 52.通过正向路径渲染的场景最终渲染目标

优点

通过每像素、每顶点及球谐技巧组合完成照明

支持实时阴影及其他每像素效果

不会因需要在延迟路径中构建图形缓冲区而产生内存成本

缺点

如果不注意的话,将造成许多涵盖相同像素的绘制调用

通道细分

基础通道

首先,为最亮的平行光保留每像素光线。

然后,绘制最多另外 3 条标记为重要的每像素光线。 如果没有标记为重要的光线,那么选择场景中的其次最亮的 3

条。如果有更多标记为重要的光线,超过了 Project->Quality 中的“per-pixel light

count”设置值,那么这些在其他通道中完成。

接下来,每顶点渲染最多 4 条光线。

最后,使用球谐计算绘制剩余光线(始终计算这些值,因此本质上在 GPU 上不固定)。

每像素照明通道

适用于基础通道处理后所剩各条每像素光线的另一通道。

半透明对象通道

适用于半透明对象的另一通道。

图 53.通过正向路径渲染的场景最终渲染目标

延迟着色

图 54.通过延迟路径渲染的场景最终渲染目标

优点

照明效果与场景复杂度无关

用很有可能受到内存限制的更高内存使用量换取大量照明计算 (FLOPS)

支持实时阴影和每像素效果

缺点

不直接支持半透明渲染。 这些对象可通过一条额外的正向通道进行绘制

因构建图形缓冲区而造成内存使用量提高

不支持抗锯齿

不支持网格渲染器的接收阴影标记

通道细分

图形缓冲区通道

渲染所有不透明的对象,以构建图形缓冲区。布局如下:

渲染目标 0: ARGB32 – RGB 通道中的漫射颜色和阿尔法通道中的遮挡数据

渲染目标 1: ARGB32 – RGB 通道中的高光颜色和阿尔法通道中的粗糙度

渲染目标 2: ARGB2101010 – RGB 通道中世界空间是常态,阿尔法通道未使用

渲染目标 3: ARGB32(非 HDR)或 ARGBHalf (HDR) – 发射、照明、光照映射及反射探测缓冲区

深度及模板缓冲区

照明通道

使用图形缓冲区通道生成的纹理进行每像素照明计算。 Unity 将对几何包围盒进行 Z 测试,支持轻松检测遮挡/部分遮挡光线。

通过保存漫射照明值的 RGB 通道产生纹理,阿尔法通道包含高光单色。

光线应用通道

最后的通道再次绘制所有对象,使用照明通道生成的纹理将照明应用到每个对象。

半透明对象通道

需要额外的正向通道。

图 55.通过延迟路径渲染的场景最终渲染目标

* 如欲了解有关渲染路径的更多信息,请访问http://docs.unity3d.com/Manual/Rendering-Tech.html

注意额外的正向绘制调用

如前所述,正向渲染路径将根据编辑器质量设置部分下显示的“Per-Pixel Light Count”设置,对影响您几何图形的各条光线发出额外的绘制调用。标记为重要的光线将首先用在这些调用中,但如果没有重要标记光线,那么 Unity 将选择其次最亮的光线。 在有些情况下,这可能造成大量不必要的开销,尤其是可选择合并光线时。以下 GPA 捕获截图显示了基础绘制及另外 3 种颜色。如果需要避免以下情况,最好合并光线或在质量设置中减少每像素光线数量。

图 56.GPA 捕获显示描绘这一占用 55.3% 的场景 GPU 持续时间的地面需要 4 个绘制调用。

图 57.对于绿、红、蓝光线所需的额外正向通道,查看 GPA 中的颜色缓冲区。

Android:拆分二进制

最新 Unity 版本能够产生一个胖二进制,或将该二进制拆分成单独的 ARM 和 x86 部分。 您可使用同一流程选择 x86 或 ARM,以测试部署的各个方面。 评估压缩、代码及其他细节支持您排除故障,甚至对您的构建项目进行基准测试。

构建 FAT APK 不会显著增加二进制大小。 您只需选择 x86 或 ARMv7 即可构建瘦二进制;但必须维持 2 个单独的构建项目。

在 Player 设置中 (File>Build Settings > Player Settings):

打开/扩展其他设置

在 Configuration 中,找到 Device Filter 并选择: FAT (ARMv7+X86)。 参见图 51。

图 58.Other Settings 中的 Configuration。 Device Filter 中所示 3 个选项。

选择构建(在 Build Settings 界面上),开始创建选定二进制的流程。

就这么简单! 您现可在 Unity Android 游戏部署中支持 x86。

面向 Unity x86 开发人员的页面现已上线:www.intel.com/software/unity,点击获取更多支持。

结论

优化工作本身有助于提高您图形密集型游戏的性能。以上技巧的组合可帮助您大展拳脚。使用这些工具能够让您获得更深入的了解,并进一步作出调整。

资源

减少纹理并减小尺寸:http://docs.unity3d.com/Manual/ReducingFilesize.html

影子练习:http://docs.unity3d.com/Manual/Shadows.html

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