From bcc0922a206286a4c2a2c08092bfc8af30c6cff6 Mon Sep 17 00:00:00 2001 From: CrazyRoka Date: Tue, 9 Jul 2024 09:24:49 +0100 Subject: [PATCH] Optimize GDScriptInstance::notification for better performance --- modules/gdscript/gdscript.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 0f800a228fc..4f9ff3a6035 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -2080,20 +2080,22 @@ void GDScriptInstance::notification(int p_notification, bool p_reversed) { //notification is not virtual, it gets called at ALL levels just like in C. Variant value = p_notification; const Variant *args[1] = { &value }; + const StringName ¬ification_str = GDScriptLanguage::get_singleton()->strings._notification; - List pl; - GDScript *sptr = script.ptr(); - while (sptr) { - if (p_reversed) { - pl.push_back(sptr); - } else { - pl.push_front(sptr); - } - sptr = sptr->_base; + LocalVector script_stack; + uint32_t script_count = 0; + for (GDScript *sptr = script.ptr(); sptr; sptr = sptr->_base, ++script_count) { + script_stack.push_back(sptr); } - for (GDScript *sc : pl) { + + const int start = p_reversed ? 0 : script_count - 1; + const int end = p_reversed ? script_count : -1; + const int step = p_reversed ? 1 : -1; + + for (int idx = start; idx != end; idx += step) { + GDScript *sc = script_stack[idx]; if (likely(sc->valid)) { - HashMap::Iterator E = sc->member_functions.find(GDScriptLanguage::get_singleton()->strings._notification); + HashMap::Iterator E = sc->member_functions.find(notification_str); if (E) { Callable::CallError err; E->value->call(this, args, 1, err);