mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Merge pull request #94118 from CrazyRoka/optimize-gdscript-notifications
Optimize `GDScriptInstance::notification` for better performance
This commit is contained in:
commit
7b5ee98474
1 changed files with 13 additions and 11 deletions
|
@ -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<GDScript *> pl;
|
||||
GDScript *sptr = script.ptr();
|
||||
while (sptr) {
|
||||
if (p_reversed) {
|
||||
pl.push_back(sptr);
|
||||
} else {
|
||||
pl.push_front(sptr);
|
||||
LocalVector<GDScript *> script_stack;
|
||||
uint32_t script_count = 0;
|
||||
for (GDScript *sptr = script.ptr(); sptr; sptr = sptr->_base, ++script_count) {
|
||||
script_stack.push_back(sptr);
|
||||
}
|
||||
sptr = sptr->_base;
|
||||
}
|
||||
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<StringName, GDScriptFunction *>::Iterator E = sc->member_functions.find(GDScriptLanguage::get_singleton()->strings._notification);
|
||||
HashMap<StringName, GDScriptFunction *>::Iterator E = sc->member_functions.find(notification_str);
|
||||
if (E) {
|
||||
Callable::CallError err;
|
||||
E->value->call(this, args, 1, err);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue