Jump to content

Openai/69545588-86d8-800f-807e-7602227d6195

From freem


This conversation was exported from ChatGPT[1]

gpt-5-2[edit | edit source]

User: Holding down any movement key sets framerate on fire.[edit | edit source]

Holding down any movement key sets framerate on fire.


Whenever I hold down WASD or arrow keys (movement buttons), the framerate drops DRAMATICALLY, can go below 1 FPS. I then tried remapping movement to IJKL instead of WASD and somehow using that magically avoided the problem.

I've searched for every func \_input, \_unhandled\_input and the like. Nowhere I can find the culprit. Debugger profiler doesn't pinpoint any particular function. Spam-tapping the keys for movement works okay, it's the holding down input keys that wrecks havoc. Seems it starts mild and then gets stronger the longer the game has been running.

Any ideas?

Assistant: This very strongly smells like a Godot input + UI / key-echo interaction, especially because:[edit | edit source]

This very strongly smells like a Godot input + UI / key-echo interaction, especially because:

  • WASD + arrow keys cause the problem
  • IJKL does not
  • Tapping is fine, holding is catastrophic
  • Gets worse over time
  • Profiler doesn’t point to a single hot function

Those clues narrow it down a lot.

The real culprit (most likely)[edit | edit source]

WASD and arrow keys are bound to built-in UI actions[edit | edit source]

By default, Godot maps:

  • ui_left / right / up / down → Arrow keys AND WASD

If you have any Control nodes (UI) in the scene tree — even invisible ones — holding those keys triggers UI navigation every frame, which can:

  • Recalculate focus
  • Traverse the scene tree
  • Fire _gui_input
  • Trigger theme/layout updates

This does NOT show clearly in the profiler, because it’s spread across engine internals.

When you switch to IJKL, those are not bound to UI navigation — problem disappears.

✅ This matches your symptoms perfectly.

Why holding makes it worse[edit | edit source]

Holding a key generates echo events:

InputEventKey (pressed=true, echo=true)

So every frame:

  • _input()
  • _unhandled_input()
  • _gui_input()
  • Focus navigation
  • Any accidental logic tied to input

…keeps firing.

If you accidentally append, spawn, or register anything on key-hold, it snowballs.

How to fix it (pick at least one)[edit | edit source]

✅ 1. Unbind WASD from UI actions (RECOMMENDED)[edit | edit source]

Go to:

Project Settings → Input Map

Remove:

  • W, A, S, D
  • Arrow keys (optional)

From:

  • ui_up
  • ui_down
  • ui_left
  • ui_right

Unless you explicitly want keyboard UI navigation.

✅ 2. Ignore key echo events[edit | edit source]

If you use _input(event):

func _input(event):
    if event is InputEventKey and event.is_echo():
        return

This alone fixes many “holding a key destroys FPS” bugs.

✅ 3. Use Input.is_action_pressed() instead of _input[edit | edit source]

For movement, never rely on _input().

Correct pattern:

func _physics_process(delta):
    var dir := Vector2.ZERO
    if Input.is_action_pressed("move_left"):
        dir.x -= 1
    if Input.is_action_pressed("move_right"):
        dir.x += 1

This:

  • Avoids echo spam
  • Avoids UI input paths
  • Is deterministic
✅ 4. Make sure movement logic isn’t cumulative[edit | edit source]

Common hidden bug:

velocity += direction * speed  # BAD

Should be:

velocity = direction * speed   # GOOD

Holding a key would otherwise accelerate forever, tanking physics.

✅ 5. Check for accidental allocations on input[edit | edit source]

Search for:

  • append
  • add_child
  • connect
  • push_back
  • new()

Anything that runs per input event will explode on key hold.

Quick diagnostic test[edit | edit source]

Add this temporarily:

func _input(event):
    if event is InputEventKey:
        print(event.scancode, event.is_echo())

Hold W and watch the flood. Hold I and compare.

You’ll see the difference immediately.

TL;DR[edit | edit source]

This is almost certainly Godot’s default UI input bindings + key echo.

Unbind WASD from ui_*, ignore echo events, and handle movement via Input.is_action_pressed() in _physics_process().

If you want, tell me:

  • Godot version
  • Whether you have any Control nodes in the scene
  • How movement is currently handled

…and I can pinpoint it down to the exact line.

References[edit | edit source]

  1. "Godot input key issue". ChatGPT. Retrieved 2025-12-31.