HOME / 第 8 部分 · 导出发布与毕业 / 第 99 课
MODULE 8 · 导出发布与毕业
第 99 课 · 综合性能优化实战
🎯 本课学习目标
- 系统排查并优化性能
- 针对发布目标优化
- 建立优化清单
发布前的最后一关:性能。本课用一套系统方法把游戏优化到流畅。
📖 详细教学步骤
性能目标目标
| 平台 | 目标帧率 | 主要约束 |
|---|---|---|
| PC 中高端 | 60-144 FPS | 画质 |
| PC 低配 | 30-60 FPS | 特效 |
| Web | 30-60 FPS | 下载体积+GPU |
| 移动端 | 30-60 FPS | 发热/耗电/内存 |
💡 先定目标,再针对性优化。
诊断流程流程
- 看监视器(Monitors):FPS / Draw Calls / 内存
- 剖析器(Profiler):CPU 热点函数
- GPU 时间:渲染压力
- 逐个瓶颈逐个解决,每改一处复测
脚本优化优化
常见脚本热点:
GDSCRIPT# 1. 别在 _process 里重复获取节点
# 坏:
func _process(delta):
$Label.text = str(get_node("../Score").value)
# 好:
@onready var label = $Label
@onready var score = $"../Score"
func _process(delta):
label.text = str(score.value)
# 2. 别每帧创建对象
# 3. 用数学代替引擎调用(简单碰撞手写)
# 4. 减少 get_nodes_in_group 频率
渲染优化优化
- Draw Calls:合并静态网格、用 MultiMesh
- 阴影:只给近处/主灯开
- 粒子:数量减半看效果是否可接受
- 着色器:减少全屏后期复杂度
- 纹理:用压缩格式、限制分辨率
物理优化优化
- 静态物用 StaticBody(别用大量 RigidBody)
- 减少碰撞层检测(不相关的层别互相检测)
- 物理体数量大的场景,远处物体禁用物理
- 碰撞形状用简单形状
内存优化优化
- 对象池:子弹/敌人反复创建销毁改用池复用
- 及时释放:场景离开时清理资源
- 避免常驻大资源(用 ResourceLoader 按需加载)
- 流式加载:大地图分块加载
建立优化清单清单
发布前过一遍:
- ✅ 剖析器无热点函数
- ✅ Draw Calls 在目标范围内
- ✅ 内存稳定不增长(长玩 30 分钟)
- ✅ 最低配置机器达标
- ✅ 各平台实测
⚠️
优化过度画面崩?
先设目标、量化测量,改一处测一处。别一次全降到底。
⚠️
找不到瓶颈?
多数时候瓶颈在 Draw Calls 或单函数热点。用监视器+剖析器定位,别瞎猜。
🧪 动手试一试
🏋️ 课后练习
用剖析器给你的《星域猎手》做一次全面体检,找出 TOP3 热点并各优化一处,对比优化前后 FPS。
Monitors + Profiler 记录对比。
💡
性能优化的口号:先测量,后优化,再测量。
💡
60 FPS 是底线,30 FPS 是移动端可接受线。
🎓 本课小结
综合优化:定目标 → 诊断(监视器/剖析器)→ 脚本/渲染/物理/内存四路优化 → 建立发布前优化清单逐项过。