HOME / 第 8 部分 · 导出发布与毕业 / 第 99 课
MODULE 8 · 导出发布与毕业

第 99 课 · 综合性能优化实战

⏱ 预计时长 45 分钟📊 难度 进阶📚 模块 第 8 部分 · 导出发布与毕业

🎯 本课学习目标

发布前的最后一关:性能。本课用一套系统方法把游戏优化到流畅。

📖 详细教学步骤

性能目标目标

平台目标帧率主要约束
PC 中高端60-144 FPS画质
PC 低配30-60 FPS特效
Web30-60 FPS下载体积+GPU
移动端30-60 FPS发热/耗电/内存

💡 先定目标,再针对性优化。

诊断流程流程

  1. 看监视器(Monitors):FPS / Draw Calls / 内存
  2. 剖析器(Profiler):CPU 热点函数
  3. GPU 时间:渲染压力
  4. 逐个瓶颈逐个解决,每改一处复测

脚本优化优化

常见脚本热点:

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 是移动端可接受线。

🎓 本课小结

综合优化:定目标 → 诊断(监视器/剖析器)→ 脚本/渲染/物理/内存四路优化 → 建立发布前优化清单逐项过。