描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302550518
Unity是一个令人惊叹的游戏开发框架,它包含大量的特性集且易于使用,有助于将一些*炫酷的处理和渲染功能呈现给业余爱好者和专业人士。
本书展示了如何使用Unity 2017提升游戏性能,并演示高性能不仅局限于预算高的游戏。
由于没有什么能比糟糕的用户体验更快地让玩家远离游戏,因此本书首先解释了如何使用Unity Profiler检测问题,学习如何使用秒表、计时器和日志方法诊断问题。
接着介绍Unity内置的批处理流程,它们何时能用于提升性能;分析将在运行时使用*小化的空间、CPU和内存导入艺术资源,并发掘一些未充分利用的特性和方法,来管理资源数据。
然后深入研究Unity3D引擎的底层,讨论一些只有深入了解其内部工作原理的情况下才能理解的问题。
本书*后学习如何适当地组织资源来改进开发工作流,以及如何通过对象池快速有效地实例化资产。
● 使用Unity Profiler查找程序中任何地方的瓶颈,并发现解决它们的方法。
● 实现C#脚本编写的更佳实践,避免常见误区。
● 深入理解渲染管线,通过减少绘制调用和避免填充率瓶颈来更大化渲染管线的性能。
● 以大多数开发者都能理解的方式增强着色器,通过微妙而有效的性能调整优化它们。
● 充分利用物理引擎使场景尽可能保持动态。
● 组织、过滤并压缩艺术资源,保持高品质的同时更大化性能。
● 发现VR项目中各种严重的性能问题,找到解决它们的方法。
● 使用Mono框架和C#实现底层强化以更大化内存使用,避免垃圾回收。
● 了解项目组织的*实践,通过改进工作流来节省时间。
第1 章 研究性能问题 1
1.1 Unity Profiler 2
1.1.1 启动Profiler 3
1.1.2 Profiler窗口 7
1.2 性能分析的方法 15
1.2.1 验证脚本是否出现 16
1.2.2 验证脚本次数 16
1.2.3 验证事件的顺序 17
1.2.4 小化正在进行的代码更改 18
1.2.5 小化内部影响 18
1.2.6 小化外部影响 20
1.2.7 代码片段的针对性分析 20
1.3 关于分析的思考 25
1.3.1 理解Profiler工具 26
1.3.2 减少干扰 26
1.3.3 关注问题 27
1.4 本章小结 27
第2 章 脚本策略 29
2.1 使用快的方法获取组件 29
2.2 移除空的回调定义 31
2.3 缓存组件引用 34
2.4 共享计算输出 36
2.5 Update、Coroutines 和InvokeRepeating 36
2.6 更快的GameObject空引用检查 40
2.7 避免从GameObject取出字符串属性 40
2.8 使用合适的数据结构 43
2.9 避免运行时修改Transform的父节点 44
2.10 注意缓存Transform的变化 44
2.11 避免在运行时使用Find()和SendMessage()方法 46
2.11.1 将引用分配给预先存在的对象 49
2.11.2 静态类 51
2.11.3 单例组件 54
2.11.4 全局消息传递系统 58
2.12 禁用未使用的脚本和对象 69
2.12.1 通过可见性禁用对象 70
2.12.2 通过距离禁用对象 71
2.13 使用距离平方而不是距离 72
2.14 小化反序列化行为 73
2.14.1 减小序列化对象 73
2.14.2 异步加载序列化对象 74
2.14.3 在内存中保存之前加载的序列化对象 74
2.14.4 将公共数据移入ScriptableObject 74
2.15 叠加、异步地加载场景 74
2.16 创建自定义的Update()层 76
2.17 本章小结 80
第3 章 批处理的优势 81
3.1 Draw Call 82
3.2 材质和着色器 84
3.3 Frame Debugger 86
3.4 动态批处理 88
3.4.1 顶点属性 89
3.4.2 网格缩放 91
3.4.3 动态批处理总结 92
3.5 静态批处理 93
3.5.1 Static标记 93
3.5.2 内存需求 93
3.5.3 材质引用 94
3.5.4 静态批处理的警告 94
3.5.5 静态批处理总结 95
3.6 本章小结 96
第4 章 着手处理艺术资源 97
4.1 音频 97
4.1.1 导入音频文件 98
4.1.2 加载音频文件 98
4.1.3 编码格式与品质级别 101
4.1.4 音频性能增强 103
4.2 纹理文件 106
4.2.1 纹理压缩格式 106
4.2.2 纹理性能增强 108
4.3 网格和动画文件 116
4.3.1 减少多边形数量 117
4.3.2 调整网格压缩 117
4.3.3 恰当使用Read-Write Enabled 118
4.3.4 考虑烘焙动画 118
4.3.5 合并网格 119
4.4 Asset Bundle和Resource 119
4.5 本章小结 120
第5 章 加速物理 121
5.1 物理引擎的内部工作情况 122
5.1.1 物理和时间 122
5.1.2 静态碰撞器和动态碰撞器 125
5.1.3 碰撞检测 126
5.1.4 碰撞器类型 127
5.1.5 碰撞矩阵 129
5.1.6 Rigidbody激活和休眠状态 129
5.1.7 射线和对象投射 130
5.1.8 调试物理 130
5.2 物理性能优化 132
5.2.1 场景设置 132
5.2.2 适当使用静态碰撞器 134
5.2.3 恰当使用触发体积 134
5.2.4 优化碰撞矩阵 135
5.2.5 离散碰撞检测 136
5.2.6 修改固定更新频率 137
5.2.7 调整允许的时间步长 138
5.2.8 小化射线发射和边界体积检查 139
5.2.9 避免复杂的网格碰撞器 140
5.2.10 避免复杂的物理组件 142
5.2.11 使物理对象休眠 143
5.2.12 修改处理器迭代次数 144
5.2.13 优化布娃娃 145
5.2.14 确定何时使用物理 147
5.3 本章小结 148
第6 章 动态图形 149
6.1 管线渲染 150
6.1.1 GPU前端 151
6.1.2 GPU后端 152
6.1.3 光照和阴影 155
6.1.4 多线程渲染 159
6.1.5 低级渲染API 159
6.2 性能检测问题 160
6.2.1 分析渲染问题 160
6.2.2 暴力测试 162
6.3 渲染性能的增强 163
6.3.1 启用/禁用 GPU Skinning 163
6.3.2 降低几何复杂度 164
6.3.3 减少曲面细分 164
6.3.4 应用GPU实例化 164
6.3.5 使用基于网格的LOD 165
6.3.6 使用遮挡剔除 167
6.3.7 优化粒子系统 168
6.3.8 优化Unity UI 170
6.3.9 着色器优化 174
6.3.10 使用更少的纹理数据 181
6.3.11 测试不同的GPU纹理压缩格式 181
6.3.12 小化纹理交换 182
6.3.13 VRAM限制 183
6.3.14 照明优化 184
6.3.15 优化移动设备的渲染性能 186
6.4 本章小结 188
第7 章 虚拟速度和增强加速度 189
7.1 XR开发 190
7.1.1 仿真 191
7.1.2 用户舒适度 192
7.2 性能增强 194
7.2.1 物尽其用 194
7.2.2 单通道立体渲染和多通道立体渲染 195
7.2.3 应用抗锯齿 196
7.2.4 前向渲染 197
7.2.5 VR的图像效果 197
7.2.6 背面剔除 197
7.2.7 空间化音频 198
7.2.8 避免摄像机物理碰撞 198
7.2.9 避免欧拉角 198
7.2.10 运动约束 199
7.2.11 跟上发展 199
7.3 本章小结 199
第8 章 掌握内存管理 201
8.1 Mono平台 202
8.2 代码编译 209
8.3 分析内存 210
8.3.1 分析内存消耗 210
8.3.2 分析内存效率 211
8.4 内存管理性能增强 212
8.4.1 垃圾回收策略 212
8.4.2 手动JIT编译 213
8.4.3 值类型和引用类型 214
8.4.4 字符串连接 221
8.4.5 装箱(Boxing) 224
8.4.6 数据布局的重要性 226
8.4.7 Unity API中的数组 227
8.4.8 对字典键使用InstanceID 227
8.4.9 foreach循环 228
8.4.10 协程 229
8.4.11 闭包 229
8.4.12 .NET库函数 230
8.4.13 临时工作缓冲区 231
8.4.14 对象池 231
8.4.15 预制池 234
8.4.16 IL2CPP优化 249
8.4.17 WebGL 优化 249
8.5 Unity、Mono和IL2CPP的未来 249
8.6 本章小结 252
第9 章 提示与技巧 253
9.1 编辑器热键提示 254
9.1.1 GameObject 254
9.1.2 Scene 窗口 254
9.1.3 数组 255
9.1.4 界面 255
9.1.5 在编辑器内撰写文档 256
9.2 编辑器UI提示 256
9.2.1 脚本执行顺序 256
9.2.2 编辑器文件 256
9.2.3 Inspector 窗口 258
9.2.4 Project窗口 259
9.2.5 Hierarchy窗口 260
9.2.6 Scene 和 Game 窗口 260
9.2.7 Play模式 262
9.3 脚本提示 262
9.3.1 一般情况 262
9.3.2 特性 263
9.3.3 日志 264
9.3.4 有用的链接 264
9.4 自定义编辑器脚本和菜单提示 265
9.5 外部提示 266
9.6 本章小结 268
用户体验在所有游戏中都是重要的组成部分,它不仅包括游戏的剧情和玩法,也包括运行时画面的流畅性、与多人服务器连接的可靠性、用户输入的响应性,甚至由于移动设备和云下载的流行,它还包括终程序文件的大小。由于Unity等工具提供了大量有用的开发功能,还允许独立开发者访问,游戏开发的门槛已经大大降低了。然而,由于游戏行业的竞争激烈,玩家对游戏终品质的期望与日俱增,游戏的各方面应该能经得起玩家和评论家的考验。
性能优化的目标与用户体验密不可分。缺乏优化的游戏会导致低帧率、卡顿、崩溃、输入延迟、过长的加载时间、不一致以及令人不舒服的运行时行为,以及物理引擎的故障甚至过高的电池消耗(移动设备通常被忽略的指标)。只要遭遇上述问题之一,就是游戏开发者的噩梦,因为其他方面都做得很好,评论也只炮轰做得不好的一个方面。
性能优化的目标之一是化地利用可用资源,包括CPU资源,如消耗的CPU循环数、使用的主存空间大小(称为RAM),也包括GPU资源[GPU有自己的内存空间(称为VRAM)]、填充率、内存带宽等。然而,性能优化重要的目标是确保没有哪个资源不合时宜地导致性能瓶颈,优先级的任务得到优先执行。哪怕很小的、间歇性的停顿或性能方面的延迟都会破坏玩家的体验,打破沉浸感,限制我们尝试创建体验的潜力。另一个需要考虑的事项是,节省的资源越多,便能够在游戏中创造出更多的活动,从而产生更有趣、更生动的玩法。
同样重要的是,要决定何时后退一步,停止增强性能。在一个拥有无限时间和资源的世界里,总会有另一种方法让游戏变得更好、更快、更高效。在开发过程中,必须确定产品达到了可接受的质量水平。如果不这样做,就会重复实现那些很少或没有实际好处的变更,而每个变更都可能引入更多的bug。
判断一个性能问题是否值得修复的方法是回答“用户会注意到它吗?”。如果这个问题的答案是“不”,那么性能优化就是白费力气。软件开发中有句老话:
过早的优化是万恶之源。
过早优化是在没有任何必要证据的情况下,为提高性能而重新编写和重构代码的主要原因。这可能意味着在没有显示存在性能问题的情况下进行更改,或者进行更改的原因是,我们只相信性能问题可能源于某个特定的领域,但没有证据证明的确存在该问题。
当然,编写代码时应该避免更直接、更明显的性能问题。然而,在项目末尾进行真正的性能优化将花费很多时间,而我们应该做好计划,以正确地改善项目,同时避免在没有可验证的情况下实施更昂贵和耗时的变更。这些错误使整个软件开发团队付出了代价,没有成效的工作时间令人沮丧。
《Unity 游戏优化(第2版)》介绍在Unity程序中检测和修复性能问题所需的工具、知识和技能,不管这些问题源于何处。这些瓶颈可能出现在CPU、GPU和RAM等硬件组件中,也可能出现在物理、渲染和Unity引擎等软件子系统中。
在每天充斥着高质量新游戏的市场中,优化游戏的性能将使游戏具有更大的成功率,提高了在市场上脱颖而出的机会。
《Unity 游戏优化(第2版)》内容
第1章探索Unity Profiler,研究剖析程序、检测性能瓶颈以及分析问题根源的一系列方法。
第2章学习Unity项目中C#脚本代码的实践,小化MonoBehaviour回调的开销,改进对象间的通信等。
第3章探索Unity的动态批处理和静态批处理系统,了解如何使用它们减轻渲染管线的负担。
第4章了解艺术资源的底层技术,学习如何通过导入、压缩和编码避免常见的陷阱。
第5章研究Unity内部用于3D和2D游戏的物理引擎的细微差别,以及如何正确组织物理对象,以提升性能。
第6章深入探讨渲染管线,以及如何提升在GPU或CPU上遭受渲染瓶颈的应用程序,如何优化光照、阴影、粒子特效等图形效果,如何优化着色器代码,以及一些用于移动设备的特定技术。
第7章关注VR和AR等新的娱乐媒介,还包括一些针对这些平台构建的程序所独有的性能优化技术。
第8章讨论检验Unity引擎、Mono框架的内部工作情况,以及在这些组件内部如何管理内存,以使程序远离过高的堆分配和运行时的垃圾回收。
第9章介绍Unity专家用于提升项目工作流和场景管理的大量有用技术。
阅读《Unity 游戏优化(第2版)》的条件
《Unity 游戏优化(第2版)》主要关注应用到Unity 2017上的特性和增强功能。《Unity 游戏优化(第2版)》讨论的很多技术可应用到Unity 5.x或更旧版本的项目中,但这些版本列出的特性可能会有所不同。这些差异会在适当的地方突出显示。
《Unity 游戏优化(第2版)》读者对象
《Unity 游戏优化(第2版)》面向对Unity的大多数特性富有经验的中高级Unity开发者,以及希望化游戏性能或解决特定瓶颈的开发人员。导致瓶颈的原因不管是持续的CPU负载、运行时CPU峰值、缓慢的内存访问、内存碎片、垃圾回收、糟糕的GPU填充率,还是内存带宽,《Unity 游戏优化(第2版)》都提供了识别问题根源所需的技术,并探索在程序中减少其影响的多种方式。
脚本和内存使用部分要求读者熟悉C#语言,着色器优化部分要求读者具有Cg基础。
约定
代码块的格式设置如下:
void Start() {
GameLogic.Instance.RegisterUpdateableObject(this);
Initialize();
}
protected virtual void Initialize() {
// derived classes should override this method for initialization code,
and NOT reimplement Start()
}
注意:
警告或重要提示出现在这样的方框中。
提示:
提示和技巧出现在这样的方框中。
读者反馈
欢迎读者对《Unity 游戏优化(第2版)》进行反馈。告知我们你对《Unity 游戏优化(第2版)》的喜恶。读者的反馈对我们很重要,能帮助我们挖掘出你真正喜欢的主题。
可以通过电子邮件[email protected]给我们发送反馈,并在消息的标题中提及《Unity 游戏优化(第2版)》。
客户支持
读者既然购买了Packt图书,就可以从中获得更多的利益。
下载示例代码
可以在http://www.packtpub.com上使用自己的账号下载《Unity 游戏优化(第2版)》的示例代码。如果是在其他地方购买《Unity 游戏优化(第2版)》,就可以访问http://www.packtpub.com/support并注册,示例代码文件就可以通过邮件直接发送给你。
可以通过以下步骤下载代码文件:
(1) 使用自己的邮箱地址和密码在网站上登录或注册。
(2) 将鼠标移到顶部的SUPPORT上。
(3) 单击Code Downloads & Errata。
(4) 在Search框中输入书名。
(5) 选择找到的图书,下载代码文件。
(6) 通过下拉菜单选择购买《Unity 游戏优化(第2版)》的地方。
(7) 单击Code Download。
一旦下载完文件,确保使用版本的解压工具解压文件:
● Windows上使用WinRAR/7-Zip
● Mac上使用Zipeg/iZip/UnRarX
● Linux上使用PeaZip
《Unity 游戏优化(第2版)》的代码包也托管在GitHub上:https://github.com/ PacktPublishing/Unity-2017-Game-Optimization-Second-Edition,也可扫描封底二维码获取《Unity 游戏优化(第2版)》代码。
勘误
尽管我们已经尽了各种努力来保证内容的正确性,但错误总是难免的,如果你在《Unity 游戏优化(第2版)》中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,还有助于改进《Unity 游戏优化(第2版)》的后续版本。如果找到了错误,可以在http://www.packtpub.com/submit-errata上报告错误,选择图书,单击Errata Submission Form链接,并输入错误详情。一旦你提交的信息是正确的,就会被采纳,而勘误会上传到网站上,或添加到那个主题下已有的勘误表中。
为了查看之前提交的勘误,请浏览https://www.packtpub.com/books/content/support并在搜索框中输入书名。在Errata部分就会显示必要的信息。
版权
互联网上版权材料的盗版依然是所有媒体的问题。Packt非常重视对版权和许可证的保护。如果你在互联网上发现《Unity 游戏优化(第2版)》的任何形式的非法拷贝,请立即提供地址或网站名称,以便我们采取补救措施。
请通过[email protected]与我们联系,并提供可疑盗版材料的链接。
感谢你帮助保护作者,允许我们继续为你带来有价值的内容。
问题
如果你对《Unity 游戏优化(第2版)》任何方面存在疑问,可以通过[email protected]与我们联系,我们将尽努力解答问题。
评论
还没有评论。