图书目录

目    录

 

第Ⅰ部分  基本的脚本优化

第1章  研究性能问题 2

1.1  使用Unity Profiler收集分析数据 3

1.1.1  启动Profiler 4

1.1.2  Profiler窗口 8

1.2  性能分析的最佳方法 17

1.2.1  验证脚本是否存在 18

1.2.2  验证脚本次数 18

1.2.3  验证事件的顺序 19

1.2.4  最小化正在进行的代码更改 20

1.2.5  最小化内部影响 20

1.2.6  最小化外部影响 22

1.2.7  代码片段的针对性

分析 22

1.3  关于分析的思考 26

1.3.1  理解Profiler工具 27

1.3.2  减少干扰 27

1.3.3  关注问题 28

1.4  本章小结 28

第2章  脚本策略 29

2.1  使用最快的方法获取组件 30

2.2  移除空的回调定义 31

2.3  缓存组件引用 34

2.4  共享计算输出 35

2.5  Update、Coroutines和InvokeRepeating 36

2.6  更快的GameObject空引用检查 39

2.7  避免从GameObject中检索字符串属性 40

2.8  使用合适的数据结构 42

2.9  避免在运行时修改

Transform的父节点 43

2.10  关注缓存Transform的 变化 44

2.11  避免在运行时使用Find()和 SendMessage()方法 45

2.11.1  将引用分配给预先

存在的对象 48

2.11.2  静态类 50

2.11.3  单例组件 52

2.11.4  全局消息传递系统 56

2.12  禁用未使用的脚本和  对象 66

2.12.1  通过可见性禁用对象 66

2.12.2  通过距离禁用对象 67

2.13  使用距离的平方而不是  距离 68

2.14  最小化反序列化行为 69

2.14.1  减小序列化对象 70

2.14.2  异步加载序列化对象 70

2.14.3  在内存中保存之前加载的序列化对象 70

2.14.4  将公共数据移入ScriptableObject 71

2.15  叠加、异步地加载

  场景 71

2.16  创建自定义的

  Update()层 72

2.17  本章小结 76

第Ⅱ部分  图形优化

第3章  批处理的优势 78

3.1  Draw Call 79

3.2  材质和着色器 81

3.3  Frame Debugger 83

3.4  动态批处理 85

3.4.1  顶点属性 86

3.4.2  网格缩放 87

3.4.3  动态批处理总结 88

3.5  静态批处理 89

3.5.1  Static标记 89

3.5.2  内存需求 90

3.5.3  材质引用 90

3.5.4  静态批处理的警告 90

3.5.5  静态批处理总结 91

3.6  本章小结 92

第4章  优化艺术资源 93

4.1  音频文件 93

4.1.1  导入音频文件 94

4.1.2  加载音频文件 94

4.1.3  编码格式与品质级别 97

4.1.4  音频性能增强 98

4.2  纹理文件 101

4.2.1  纹理压缩格式 101

4.2.2  纹理性能增强 103

4.3  网格和动画文件 111

4.3.1  减少多边形数量 112

4.3.2  调整网格压缩 112

4.3.3  恰当使用Read-Write 

Enabled 112

4.3.4  考虑烘焙动画 113

4.3.5  合并网格 113

4.4  Asset Bundle和Resource 114

4.5  本章小结 115

第5章  加速物理引擎 116

5.1  物理引擎的内部工作情况 117

5.1.1  物理和时间 117

5.1.2  静态碰撞器和动态碰撞器 120

5.1.3  碰撞检测 121

5.1.4  碰撞器类型 122

5.1.5  碰撞矩阵 124

5.1.6  Rigidbody激活和休眠状态 124

5.1.7  射线和对象投射 125

5.1.8  调试物理 125

5.2  物理性能优化 127

5.2.1  场景设置 127

5.2.2  适当使用静态碰撞器 129

5.2.3  恰当使用触发体积 129

5.2.4  优化碰撞矩阵 130

5.2.5  首选离散碰撞检测 131

5.2.6  修改固定更新频率 132

5.2.7  调整允许的最大时间步长 133

5.2.8  最小化射线投射和边界体积检查 133

5.2.9  避免复杂的网格碰撞器 135

5.2.10  避免复杂的物理组件 137

5.2.11  使物理对象休眠 137

5.2.12  修改处理器迭代次数 138

5.2.13  优化布娃娃 139

5.2.14  确定何时使用物理 141

5.3  本章小结 142

第6章  动态图形 143

6.1  管线渲染 144

6.1.1  GPU前端 145

6.1.2  GPU后端 146

6.1.3  光照和阴影 149

6.1.4  多线程渲染 152

6.1.5  低级渲染API 153

6.2  性能检测问题 153

6.2.1  分析渲染问题 153

6.2.2  暴力测试 155

6.3  渲染性能的增强 157

6.3.1  启用/禁用GPU Skinning 157

6.3.2  降低几何复杂度 157

6.3.3  减少曲面细分 157

6.3.4  应用GPU实例化 158

6.3.5  使用基于网格的LOD 159

6.3.6  使用遮挡剔除 160

6.3.7  优化粒子系统 161

6.3.8  优化Unity UI 163

6.3.9  着色器优化 167

6.3.10  使用更少的纹理数据 173

6.3.11  测试不同的GPU纹理压缩格式 174

6.3.12  最小化纹理交换 174

6.3.13  VRAM限制 175

6.3.14  照明优化 176

6.3.15  优化移动设备的渲染

性能 178

6.4  本章小结 180

第Ⅲ部分  高级优化

第7章  虚拟现实和增强现实的优化 182

7.1  XR技术概述 182

7.2  XR开发 183

7.3  XR中的性能增强 187

7.3.1  物尽其用 187

7.3.2  单通道立体渲染和多通道立体渲染 188

7.3.3  应用抗锯齿 190

7.3.4  首选前向渲染 190

7.3.5  VR的图像效果 190

7.3.6  背面剔除 191

7.3.7  空间化音频 191

7.3.8  避免摄像机物理

碰撞 191

7.3.9  避免欧拉角 192

7.3.10  运动约束 192

7.3.11  跟上最新发展 192

7.4  本章小结 193

第8章  掌握内存管理 194

8.1  Mono平台 195

8.1.1  内存域 196

8.1.2.  垃圾回收 198

8.2  代码编译 201

8.2  代码编译 201

8.3  分析内存 204

8.3.1  分析内存消耗 204

8.3.2  分析内存效率 205

8.4  内存管理性能增强 205

8.4.1  垃圾回收策略 205

8.4.2  手动JIT编译 206

8.4.3  值类型和引用类型 207

8.4.4  字符串连接 214

8.4.5  装箱 217

8.4.6  数据布局的重要性 218

8.4.7  Unity API中的数组 219

8.4.8  对字典键使用

InstanceID 220

8.4.9  foreach循环 221

8.4.10  协程 221

8.4.11  闭包 221

8.4.12  .NET库函数 222

8.4.13  临时工作缓冲区 222

8.4.14  对象池 223

8.4.15  预制池 225

8.4.16  IL2CPP优化 239

8.4.17  WebGL优化 239

8.5  本章小结 239

第9章  面向数据的技术栈 240

9.1  多线程的问题 241

9.2  Unity的作业系统 244

9.2.1  一个基本的作业 245

9.2.2  一个较复杂的示例 247

9.3  新的ECS 251

9.4  Burst编译器 258

9.5  本章小结 259

第10章  使用GPU Instancing 优化大量动画对象 260

10.1  应用场景 260

10.2  实现思路 261

10.3  主要实现步骤 261

10.4  部分核心逻辑伪代码 261

10.5  第一个版本——实现 262

10.5.1  运行 262

10.5.2  项目概览 265

10.5.3  编辑器烘焙代码详解 265

10.5.4  运行时代码和Shader详解 274

10.5.5  C#代码详解 281

10.6  第二个版本——优化 282

10.6.1  AnimationInfo 283

10.6.2  GPUInstancing

Animation 283

10.6.3  AnimatorBakeInfo 283

10.6.4  AnimationBaker 284

10.7  本章小结 289

第11章  提示与技巧 290

11.1  编辑器热键提示 291

11.1.1  GameObject 291

11.1.2  Scene窗口 291

11.1.3  数组 292

11.1.4  界面 293

11.1.5  在编辑器内撰写文档 294

11.2  编辑器界面提示 294

11.2.1  脚本执行顺序 294

11.2.2  编辑器文件 294

11.2.3  Inspector 窗口 296

11.2.4  Project窗口 297

11.2.5  Hierarchy窗口 298

11.2.6  Scene和Game窗口 299

11.2.7  Play模式 299

11.3  脚本提示 300

11.3.1  一般情况 300

11.3.2  特性 301

11.3.3  日志 302

11.3.4  有用的链接 302

11.4  自定义编辑器脚本和 菜单提示 302

11.5  外部提示 303

11.6  其他提示 304

11.7  本章小结 305