godot-optimization 是一个面向 Godot 引擎的性能优化技能,提供性能分析、瓶颈定位与优化技术方面的专业知识,适用于 2D 与 3D 游戏。
用途
用于帮助改善 Godot 游戏的性能问题,例如卡顿、掉帧、加载缓慢、内存问题或崩溃等场景。技能会在用户提及 lag、stuttering、性能缓慢、优化技术、性能分析、FPS 下降、帧率问题、性能测试、移动端/Web 优化、内存问题或崩溃,或询问“为什么我的游戏很慢”时启用。
主要能力
性能分析
- 内置 Godot Profiler:在游戏运行时通过 Debug → Profiler 打开,包含 Frame、Monitors、Network、Visual 标签页。
- 关键指标:FPS(流畅游戏应为 60,移动端可为 30)、帧时间(60 FPS 应小于 16.67ms)、物理帧时间、空闲时间。
- Performance 监视器:可在代码中通过 Performance.get_monitor() 获取,包括 TIME_FPS、TIME_PROCESS、TIME_PHYSICS_PROCESS、MEMORY_STATIC、MEMORY_DYNAMIC、OBJECT_COUNT、OBJECT_NODE_COUNT、RENDER_OBJECTS_IN_FRAME、RENDER_VERTICES_IN_FRAME 等。
常见性能瓶颈及处理
- 过多的 _process() 调用:建议使用计时器或降低调用频率,或在不需要时通过 set_process(false) 关闭处理。
- 低效的节点查找:避免每帧 get_node(),改用 @onready 缓存节点引用。
- 过多的 get_tree() 调用:缓存分组结果或使用信号更新。
- 低效的碰撞检测:使用 Area2D/Area3D 自动检测替代每帧遍历所有对象计算距离。
- 过多的绘制调用:使用 TileMap 替代单独 Sprite2D、使用 MultiMeshInstance 渲染重复对象、使用纹理图集批处理、限制灯光与粒子数量。
- 未优化的脚本:避免每帧创建新对象,复用已有对象。
优化技术
- 对象池(Object Pool):避免频繁创建/销毁对象。
- 细节层次(LOD):根据与相机距离切换高/中/低细节模型或隐藏。
- 空间分区:通过 ChunkManager 按区块加载与卸载。
- 高效的碰撞层:合理设置 collision_layer 与 collision_mask。
- 物理延迟调用:在物理回调中使用 call_deferred 修改物理对象。
内存优化
- 纹理压缩:导入时压缩纹理,桌面使用 VRAM 压缩,移动端使用 ETC2/ASTC,适当减小纹理尺寸。
- 音频优化:长音频(音乐、语音)使用流式,短音频(音效)使用采样;设置合适的循环模式与压缩模式。
- 场景实例化:使用 preload 的场景 instantiate 共享资源,避免 duplicate。
- 资源管理:使用 queue_free() 释放,必要时 ResourceLoader.clear_cache()。
渲染优化
- 2D:UI 使用 CanvasLayer,限制粒子数量,谨慎使用 Light2D,同纹理精灵批处理。
- 3D:使用遮挡剔除、烘焙光照、远距离 LOD、限制投影灯数量、限制视距、使用 SDFGI(Godot 4)。
平台特定优化
- 移动端:检测 Android/iOS 后减少粒子数量、简化着色器、降低分辨率、关闭 SSAO 与 glow 等昂贵效果。
- Web (HTML5):减少初始加载、资源流式加载、限制内存、避免重度物理计算。
使用方式
技能以工作流形式组织:
- 度量(Profile):使用 Godot Profiler 识别瓶颈,判断慢在 Process、Physics、Rendering 还是 Script。
- 定位(Locate):对可疑代码添加计时(Time.get_ticks_usec())打印耗时。
- 优化(Optimize):缓存查找、降低频率、使用更高效算法、移除不必要工作。
- 测试(Test):重新运行 Profiler 验证改善且无回归。
- 记录(Document):记录改动内容与原因。
技能会说明:为什么慢、采用何种优化技术、如何实现、预期改善。
适用场景
- 游戏出现卡顿、掉帧、帧率不稳。
- 需要性能分析或基准测试。
- 移动端或 Web 平台的性能优化。
- 内存问题或崩溃排查。
- 2D/3D 游戏渲染、物理、脚本层面的优化。
限制
资料未提供该技能的安装方式、依赖要求、授权方式、收费信息或具体版本支持范围,这些信息暂未提供。