新書推薦:
《
无端欢喜
》
售價:HK$
76.2
《
股票大作手操盘术
》
售價:HK$
53.8
《
何以中国·何谓唐代:东欧亚帝国的兴亡与转型
》
售價:HK$
87.4
《
一间只属于自己的房间 女性主义先锋伍尔夫代表作 女性精神独立与经济独立的象征,做自己,比任何事都更重要
》
售價:HK$
44.6
《
泉舆日志 幻想世界宝石生物图鉴
》
售價:HK$
134.2
《
养育女孩 : 官方升级版
》
售價:HK$
50.4
《
跨界:蒂利希思想研究
》
售價:HK$
109.8
《
千万别喝南瓜汤(遵守规则绘本)
》
售價:HK$
44.7
|
編輯推薦: |
本书旨在为我们提供检测、修复应用程序中的性能问题所需的工具、知识和技能,无论这些问题源自何处。实际上,它们可能源于诸如物理、渲染等软件子系统中的硬件组件(如CPU、GPU或RAM),也可能源于Unity引擎本身的硬件组件。如果能有效掌握性能优化技巧,那么这将为我们的作品提供在充斥着大量新游戏的市场中脱颖而出的机会。
|
內容簡介: |
本书详细阐述了与Unity优化开发相关的基本解决方案,主要包括检测性能问题、脚本编写策略、批处理、艺术资产、物理引擎、动态图形、内存管理、预制件池内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学教材和参考手册。
|
目錄:
|
第1章 检测性能问题 1
1.1 关于Unity Profiler 1
1.1.1 启动Profiler 2
1.1.2 Profiler窗口 6
1.2 性能分析的最佳方法 11
1.2.1 验证场景中是否存在目标脚本 12
1.2.2 验证脚本在场景中出现的次数 13
1.2.3 尽量减少对正在进行的代码的更改 14
1.2.4 最小化内部干扰 14
1.2.5 最小化外部干扰 15
1.3 代码段的目标性能分析 16
1.3.1 关于Profiler的脚本控制 16
1.3.2 自定义CPU性能分析 18
1.4 保存和加载Profiler数据 22
1.4.1 保存Profiler数据 22
1.4.2 加载Profiler数据 26
1.5 关于性能优化和分析的最终思路 29
1.5.1 了解Profiler 30
1.5.2 减少噪声 30
1.5.3 聚焦问题 31
1.6 小结 31
第2章 脚本编写策略 33
2.1 缓存组件引用 33
2.2 使用最快的方法获取组件 34
2.3 删除空的回调声明 37
2.4 在运行时避免使用Find和SendMessage方法 39
2.4.1 静态类 41
2.4.2 单例组件 42
2.4.3 分配对现有对象的引用 46
2.4.4 全局消息系统 48
2.5 禁用未使用的脚本和对象 58
2.5.1 按可见性禁用对象 58
2.5.2 按距离禁用对象 59
2.6 考虑使用距离平方值 60
2.7 避免从GameObject中检索字符串属性 61
2.8 更新和协程问题 63
2.9 考虑缓存Transform值的更改 67
2.10 更快的GameObject空引用检查 68
2.11 小结 69
第3章 批处理的好处 71
3.1 绘制调用 71
3.2 材质和着色器 73
3.3 动态批处理 76
3.3.1 顶点属性 77
3.3.2 均匀缩放 77
3.3.3 动态批处理小结 78
3.4 静态批处理 79
3.4.1 静态标志 79
3.4.2 内存需求 80
3.4.3 材质引用 80
3.4.4 静态批处理注意事项 81
3.4.5 静态批处理小结 82
3.5 小结 82
第4章 快速启动艺术资产 85
4.1 音频 85
4.1.1 加载音频文件 86
4.1.2 编码格式和质量等级 88
4.1.3 音频性能增强 89
4.2 纹理文件 93
4.2.1 压缩格式 94
4.2.2 纹理性能增强 95
4.3 网格和动画文件 103
4.3.1 减少多边形数量 103
4.3.2 仅导入计算所需内容 104
4.3.3 考虑烘焙动画 105
4.3.4 让Unity优化网格 105
4.3.5 合并网格 106
4.4 小结 106
第5章 更快的物理引擎 109
5.1 物理引擎内部 109
5.1.1 物理与时间 110
5.1.2 静态和动态碰撞器 113
5.1.3 碰撞检测 113
5.1.4 碰撞类型 114
5.1.5 碰撞矩阵 115
5.1.6 刚体活动和睡眠状态 116
5.1.7 光线和对象投射 116
5.2 物理性能优化 117
5.2.1 场景设置 117
5.2.2 正确使用静态碰撞器 118
5.2.3 优化碰撞矩阵 119
5.2.4 首选离散碰撞检测 120
5.2.5 修改固定更新频率 121
5.2.6 调整最大允许时间步长 122
5.2.7 最小化投射和包围体检查 122
5.2.8 避免使用复杂的网格碰撞器 124
5.2.9 避免复杂的物理组件 126
5.2.10 让物理对象睡眠 127
5.2.11 修改求解器迭代计数 128
5.2.12 优化布娃娃 129
5.2.13 掌握使用物理引擎的时机 130
5.2.14 考虑升级到Unity 5 131
5.3 小结 131
第6章 动态图形 133
6.1 分析渲染问题 133
6.1.1 对GPU进行性能分析 135
6.1.2 帧调试器 137
6.1.3 强力测试 138
6.1.4 受CPU限制 138
6.2 前端瓶颈 141
6.2.1 细节级别 142
6.2.2 禁用GPU蒙皮 143
6.2.3 减少曲面细分 143
6.3 后端瓶颈 144
6.3.1 填充速率 144
6.3.2 内存带宽 154
6.3.3 关于VRAM限制 157
6.4 照明和阴影 158
6.4.1 正向渲染 159
6.4.2 延迟着色 159
6.4.3 顶点照明着色 160
6.4.4 实时阴影 160
6.4.5 照明优化 160
6.5 为移动设备优化图形 162
6.5.1 尽量减少绘制调用 162
6.5.2 尽量减少材质数量 162
6.5.3 最小化纹理大小和材质数量 163
6.5.4 使用正方形和2的幂纹理 163
6.5.5 在着色器中使用最低精确度格式 163
6.5.6 避免进行Alpha测试 163
6.6 小结 164
第7章 精通内存管理 165
7.1 关于Mono平台 165
7.1.1 编译过程 167
7.1.2 手动JIT编译 168
7.2 内存使用优化 168
7.2.1 关于Unity内存域 169
7.2.2 值类型和引用类型 175
7.2.3 数据布局的重要性 186
7.2.4 关于Unity API 187
7.2.5 关于foreach循环 187
7.2.6 协程 188
7.2.7 闭包 189
7.2.8 关于.NET库函数 189
7.2.9 临时工作缓冲区 190
7.2.10 对象池 190
7.3 预制件池 193
7.3.1 可池化的组件 196
7.3.2 预制件池系统 199
7.3.3 预制件池 201
7.3.4 对象生成 202
7.3.5 预生成实例 203
7.3.6 对象取消生成 205
7.3.7 预制件池测试 205
7.3.8 预制件池和场景加载 207
7.3.9 预制件池小结 207
7.4 关于Mono和Unity的未来 208
7.5 小结 210
第8章 提示和技巧 213
8.1 编辑器热键提示 213
8.1.1 和GameObject有关的热键 213
8.1.2 场景视图 214
8.1.3 数组 214
8.1.4 接口 214
8.1.5 其他 215
8.2 编辑器界面提示 215
8.2.1 常规提示 215
8.2.2 检查器视图 218
8.2.3 项目视图 219
8.2.4 分层结构视图 220
8.2.5 场景和游戏视图 220
8.2.6 播放模式 221
8.3 脚本编写技巧 222
8.3.1 常规技巧 222
8.3.2 属性 223
8.3.3 记录日志 224
8.3.4 有用的链接 225
8.4 自定义编辑器菜单提示 226
8.5 外部提示 227
8.6 小结 229
|
內容試閱:
|
用户体验是任何游戏的关键组成部分。用户体验不仅包括游戏剧情和游戏玩法,还包括图形运行的流畅程度,与多人服务器连接的可靠性,对用户输入的响应程度,以及最终应用文件的大小(因为现在普遍流行应用商店和云下载,超大的安装文件包可能让玩家望而却步)。便宜好用的AAA工业级游戏开发工具(例如Unity)的发布,大大降低了游戏开发行业的进入门槛。当然,玩家期望开发者提供的最终产品的功能和质量每天都在提高。不难想象,今后游戏的每一个方面都可以而且将会受到玩家和评论家的严格审查。
游戏性能优化的目标与用户体验息息相关。优化效果不佳的游戏可能会导致帧速率降低、死机、崩溃、输入滞后、加载时间长、运行时行为不稳定、物理引擎故障甚至电池功耗过高(在游戏进入移动设备时代之后,这一点尤其重要)。上述问题中的任何一项都有可能变成游戏开发人员最糟糕的噩梦,因为尽管总体来说我们已经做得足够好,但评论往往会集中在我们做得不好的一件事情上。
所谓性能优化就是充分利用可用资源,这些资源包括CPU资源(例如CPU周期和主内存空间)、图形处理单元(GPU)资源(例如显存VRAM和内存带宽)等。但是,性能优化还意味着确保没有单个资源在不适当的时间造成瓶颈,并且优先处理优先级最高的任务。即使是很小的、间歇性的卡顿,也很容易使玩家退出体验,打破沉浸感,并限制了我们创造预期体验的潜力。
决定何时退后一步并停止提高性能也很重要。在时间和资源无限的世界中,总会有另一种方法可以使游戏变得更好、更快或更易于维护。开发人员能够拥有无限的时间和资源吗?不能。所以我们要懂得在一定的程度适可而止,在开发过程中既要确保产品达到可接受的质量水平,又不能无限度地追求进一步的改变和提升,事实上,有些改变几乎不会带来任何明显的好处。
决定某项性能问题是否值得解决的最佳方法是回答一个提问用户会注意到吗?,如果对这个问题的回答为否,那么性能优化将是一种浪费。在软件开发行业有一句 老话:
过早的优化是万恶之源。
过早优化的主要罪过是重新编写和重构了代码,目的是要提高性能,但是却没有任何必要性的证明。这可能意味着要么是在尚未显示出性能问题甚至问题根本不存在的情况下(如前文所述,如果某项问题用户根本注意不到,则可以认为该问题不存在)进行了更改,要么仅仅是因为我们主观上认为性能问题可能源于某个特定领域就进行了更改,但是在此之前却并没有证据证明它是真的。犯下这样的错误是令人沮丧的,因为它使软件开发人员付出了巨大的努力,但是却毫无收获。
本书旨在为我们提供检测、修复应用程序中的性能问题所需的工具、知识和技能,无论这些问题源自何处。实际上,它们可能源于诸如物理、渲染等软件子系统中的硬件组件(如CPU、GPU或RAM),也可能源于Unity引擎本身的硬件组件。
此外,我们节省的资源越多,在使用相同硬件系统的Unity引擎中可以做的事情就越多,从而使我们能够制作出更多有趣且富于变化的游戏。
总之,如果能有效掌握性能优化技巧,那么这将为我们的作品提供在充斥着大量新游戏的市场中脱颖而出的机会。
本书涵盖的内容
第1章检测性能问题,介绍了Unity Profiler和一系列性能分析方法,以分析我们的应用程序,检测性能瓶颈并执行根本原因分析。
第2章脚本编写策略,介绍了有关Unity C# 脚本代码的最佳实践,如何最大程度地减少组件开销,改善对象间的通信等。
第3章批处理的好处,探讨了Unity的动态和静态批处理系统,通过它们可以减轻渲染系统的负担。
第4章快速启动艺术资产,可帮助开发人员了解艺术资产背后的基础技术,并掌握如何避免导入、压缩和编码等方面的常见陷阱。
第5章更快的物理引擎,详细讨论了Unity物理系统或物理引擎在3D和2D游戏中的细微差别,以及如何正确组织物理对象以提高性能。
第6章动态图形,深入介绍了渲染系统的性能分析,讨论了如何改进在GPU或CPU中出现渲染瓶颈的应用程序,以及如何针对移动设备进行性能优化。
第7章精通内存管理,介绍了Unity引擎、Mono Framework的内部工作原理,以及如何在这些组件中管理内存,以保护我们的应用程序免受堆分配和运行时垃圾回收的影响。
第8章提示和技巧,详细介绍了专业开发人员用来改善项目工作流程和场景管理的多种有用技术。
充分利用本书
本书的大部分内容将重点介绍Unity 5.x版本中的功能。大多数技术都可以应用于Unity 4.x项目,但可能需要升级到Unity 4 Pro Edition才能访问其中的某些技术(例如遮挡剔除、静态批处理,甚至是Profiler本身)。
本书适合的读者
本书面向具有Unity大部分功能经验的中级和高级Unity开发人员,以及希望最大程度地提高游戏性能或解决特定瓶颈的人员。游戏性能瓶颈多半是由于CPU过载、运行时峰值、内存访问速度慢、内存碎片、垃圾回收、GPU填充速率差或内存带宽等引起的,本书将教给开发人员确定瓶颈问题根源所需的技术,并帮助开发人员探索多种方法以减少它们对游戏性能的影响。
涉及脚本和内存使用的部分将需要读者熟悉C#语言,而涉及着色器优化的领域则需要读者对计算机图形学有基本的了解。
本书约定
本书将可以看到许多区分不同类型信息的文本样式。以下是这些样式的一些示例以及对它们的含义的解释。
(1)界面词汇以粗体表示,后面使用括号附加对应的中文含义,方便读者对照查看。以下段落就是一个示例:
请确保在构建应用程序时启用了Use Development Mode(使用开发模式)和Autoconnect Profiler(自动连接性能分析器)标志。
(2)代码块显示如下:
public class TestComponent : MonoBehaviour {
void Update {
if Input.GetKeyDownKeyCode.Space {
PerformProfilingTest;
}
}
}
(3)当我们希望引起你对代码块特定部分的注意时,相关的行或项目将以粗体显示:
public class TestComponent : MonoBehaviour {
void Update {
if Input.GetKeyDownKeyCode.Space {
PerformProfilingTest;
}
}
}
(4)新术语和重要单词以粗体显示,并提供了中英文对照的形式:
为了创建可以保存Profiler数据的工具,不妨使用协程(Coroutine)。通常来说,一种典型的方法将一口气从头到尾执行,但是,协程是非常有用的构造,它允许开发人员编写可以暂停执行的方法,直到以后或事件发生时继续执行,这被称为挂起(yielding),因为它是通过yield语句完成的。
图标旁边的文字表示警告或重要的信息。
图标旁边的文字表示提示或技巧。
下载示例代码文件
读者可以从www.packt.com下载本书的示例代码文件。
|
|