diff --git a/scripts/ui/remap_panel.gd b/scripts/ui/remap_panel.gd index 58215be..de22f78 100644 --- a/scripts/ui/remap_panel.gd +++ b/scripts/ui/remap_panel.gd @@ -11,12 +11,19 @@ const REMAP_SAVE_PATH: String = "user://remap.save" var remapping_action: String = "" var remapping_button: Button = null +var _cached_router: Node = null + + +func _get_router() -> Node: + if not is_instance_valid(_cached_router): + _cached_router = get_node_or_null("/root/InputRouter") + return _cached_router func _ready() -> void: load_bindings() create_action_list() - var router: Node = get_node_or_null("/root/InputRouter") + var router: Node = _get_router() if router and router.has_signal("device_changed"): router.connect("device_changed", _on_device_changed) @@ -67,7 +74,7 @@ func get_action_text(action: StringName) -> String: return "None" var current_device: int = 0 - var router: Node = get_node_or_null("/root/InputRouter") + var router: Node = _get_router() if router: current_device = int(router.get("current_device")) @@ -88,7 +95,7 @@ func get_action_icon(action: StringName) -> Texture2D: return null var current_device: int = 0 - var router: Node = get_node_or_null("/root/InputRouter") + var router: Node = _get_router() if router: current_device = int(router.get("current_device")) diff --git a/tests/benchmark_remap.gd b/tests/benchmark_remap.gd new file mode 100644 index 0000000..98b932a --- /dev/null +++ b/tests/benchmark_remap.gd @@ -0,0 +1,42 @@ +extends SceneTree + + +func _initialize() -> void: + var script: GDScript = load("res://scripts/ui/remap_panel.gd") as GDScript + var panel: Node = script.new() + + root.add_child(panel) + + var panel_vbox: VBoxContainer = VBoxContainer.new() + panel_vbox.name = "VBoxContainer" + var panel_scroll: ScrollContainer = ScrollContainer.new() + panel_scroll.name = "ScrollContainer" + var action_list: VBoxContainer = VBoxContainer.new() + action_list.name = "ActionList" + panel_scroll.add_child(action_list) + panel_vbox.add_child(panel_scroll) + panel.add_child(panel_vbox) + + var toast: Label = Label.new() + toast.name = "ConflictToast" + panel.add_child(toast) + + # add fake actions + for i: int in range(100): + var action_name: StringName = "bench_action_" + str(i) + if not InputMap.has_action(action_name): + InputMap.add_action(action_name) + var ev: InputEventKey = InputEventKey.new() + ev.keycode = KEY_SPACE + InputMap.action_add_event(action_name, ev) + + var start: int = Time.get_ticks_usec() + for i: int in range(1000): + for a: StringName in InputMap.get_actions(): + panel.call("get_action_text", a) + panel.call("get_action_icon", a) + + var end: int = Time.get_ticks_usec() + print("Benchmark execution time: ", end - start, " us") + + quit() diff --git a/tests/test_remap_ui.gd b/tests/test_remap_ui.gd index 8e61665..8d06851 100644 --- a/tests/test_remap_ui.gd +++ b/tests/test_remap_ui.gd @@ -19,6 +19,27 @@ func test_remap_logic() -> void: key.keycode = KEY_F InputMap.action_add_event("test_action", key) + var router: Node = Node.new() + router.name = "InputRouter" + router.set("current_device", 0) + root.add_child(router) + + var panel_vbox: VBoxContainer = VBoxContainer.new() + panel_vbox.name = "VBoxContainer" + var panel_scroll: ScrollContainer = ScrollContainer.new() + panel_scroll.name = "ScrollContainer" + var action_list: VBoxContainer = VBoxContainer.new() + action_list.name = "ActionList" + panel_scroll.add_child(action_list) + panel_vbox.add_child(panel_scroll) + remap_panel.add_child(panel_vbox) + + var toast: Label = Label.new() + toast.name = "ConflictToast" + remap_panel.add_child(toast) + + root.add_child(remap_panel) + remap_panel.call("_ready") print("Action list created")