skills/thedivergentai/gd-agentic-skills/godot-performance-optimization

godot-performance-optimization

SKILL.md

Performance Optimization

Profiler-driven analysis, object pooling, and visibility culling define optimized game performance.

Available Scripts

custom_performance_monitor.gd

Manager for adding and updating custom performance monitors in the Godot debugger.

multimesh_foliage_manager.gd

Expert MultiMesh pattern for rendering thousands of foliage instances efficiently.

NEVER Do in Performance Optimization

  • NEVER optimize without profiling first — "I think physics is slow" without data? Premature optimization. ALWAYS use Debug → Profiler (F3) to identify actual bottleneck.
  • NEVER use print() in release buildsprint() every frame = file I/O bottleneck + log spam. Use @warning_ignore or conditional if OS.is_debug_build():.
  • NEVER ignore VisibleOnScreenNotifier2D for off-screen entities — Enemies processing logic off-screen = wasted CPU. Disable set_process(false) when screen_exited.
  • NEVER instantiate nodes in hot loopsfor i in 1000: var bullet = Bullet.new() = 1000 allocations. Use object pools, reuse instances.
  • NEVER use get_node() in _process() — Calling get_node("Player") 60x/sec = tree traversal spam. Cache in @onready var player := $Player.
  • NEVER forget to batch draw calls — 1000 unique sprites = 1000 draw calls. Use TextureAtlas (sprite sheets) + MultiMesh for instanced rendering.

Debug → Profiler (F3)

Tabs:

  • Time: Function call times
  • Memory: RAM usage
  • Network: RPCs, bandwidth
  • Physics: Collision checks

Common Optimizations

Object Pooling

var bullet_pool: Array[Node] = []

func get_bullet() -> Node:
    if bullet_pool.is_empty():
        return Bullet.new()
    return bullet_pool.pop_back()

func return_bullet(bullet: Node) -> void:
    bullet.hide()
    bullet_pool.append(bullet)

Visibility Notifier

# Add VisibleOnScreenNotifier2D
# Disable processing when off-screen
func _on_screen_exited() -> void:
    set_process(false)

func _on_screen_entered() -> void:
    set_process(true)

Reduce Draw Calls

# Use TextureAtlas (sprite sheets)
# Batch similar materials
# Fewer unique textures

Reference

Related

Weekly Installs
48
GitHub Stars
35
First Seen
Feb 10, 2026
Installed on
gemini-cli47
codex47
opencode47
kimi-cli46
amp46
github-copilot46