You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-14 13:41:12 +00:00
Fix slow load/save of scenes with many instances of the same script
(cherry picked from commit 2ca6b9c610)
This commit is contained in:
committed by
Rémi Verschelde
parent
461e79bd18
commit
dc203b0d13
@@ -328,7 +328,7 @@ PlaceHolderScriptInstance *GDScript::placeholder_instance_create(Object *p_this)
|
|||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
PlaceHolderScriptInstance *si = memnew(PlaceHolderScriptInstance(GDScriptLanguage::get_singleton(), Ref<Script>(this), p_this));
|
PlaceHolderScriptInstance *si = memnew(PlaceHolderScriptInstance(GDScriptLanguage::get_singleton(), Ref<Script>(this), p_this));
|
||||||
placeholders.insert(si);
|
placeholders.insert(si);
|
||||||
_update_exports();
|
_update_exports(nullptr, false, si);
|
||||||
return si;
|
return si;
|
||||||
#else
|
#else
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -379,10 +379,8 @@ void GDScript::_update_exports_values(Map<StringName, Variant> &values, List<Pro
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool GDScript::_update_exports(bool *r_err, bool p_recursive_call) {
|
bool GDScript::_update_exports(bool *r_err, bool p_recursive_call, PlaceHolderScriptInstance *p_instance_to_update) {
|
||||||
|
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
|
|
||||||
static Vector<GDScript *> base_caches;
|
static Vector<GDScript *> base_caches;
|
||||||
if (!p_recursive_call)
|
if (!p_recursive_call)
|
||||||
base_caches.clear();
|
base_caches.clear();
|
||||||
@@ -501,15 +499,19 @@ bool GDScript::_update_exports(bool *r_err, bool p_recursive_call) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (placeholders.size()) { //hm :(
|
if ((changed || p_instance_to_update) && placeholders.size()) { //hm :(
|
||||||
|
|
||||||
// update placeholders if any
|
// update placeholders if any
|
||||||
Map<StringName, Variant> values;
|
Map<StringName, Variant> values;
|
||||||
List<PropertyInfo> propnames;
|
List<PropertyInfo> propnames;
|
||||||
_update_exports_values(values, propnames);
|
_update_exports_values(values, propnames);
|
||||||
|
|
||||||
for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
|
if (changed) {
|
||||||
E->get()->update(propnames, values);
|
for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
|
||||||
|
E->get()->update(propnames, values);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p_instance_to_update->update(propnames, values);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ class GDScript : public Script {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool _update_exports(bool *r_err = nullptr, bool p_recursive_call = false);
|
bool _update_exports(bool *r_err = nullptr, bool p_recursive_call = false, PlaceHolderScriptInstance *p_instance_to_update = nullptr);
|
||||||
|
|
||||||
void _save_orphaned_subclasses();
|
void _save_orphaned_subclasses();
|
||||||
|
|
||||||
|
|||||||
@@ -2275,8 +2275,7 @@ void CSharpScript::_update_member_info_no_exports() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool CSharpScript::_update_exports() {
|
bool CSharpScript::_update_exports(PlaceHolderScriptInstance *p_instance_to_update) {
|
||||||
|
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
bool is_editor = Engine::get_singleton()->is_editor_hint();
|
bool is_editor = Engine::get_singleton()->is_editor_hint();
|
||||||
if (is_editor)
|
if (is_editor)
|
||||||
@@ -2447,14 +2446,18 @@ bool CSharpScript::_update_exports() {
|
|||||||
if (is_editor) {
|
if (is_editor) {
|
||||||
placeholder_fallback_enabled = false;
|
placeholder_fallback_enabled = false;
|
||||||
|
|
||||||
if (placeholders.size()) {
|
if ((changed || p_instance_to_update) && placeholders.size()) {
|
||||||
// Update placeholders if any
|
// Update placeholders if any
|
||||||
Map<StringName, Variant> values;
|
Map<StringName, Variant> values;
|
||||||
List<PropertyInfo> propnames;
|
List<PropertyInfo> propnames;
|
||||||
_update_exports_values(values, propnames);
|
_update_exports_values(values, propnames);
|
||||||
|
|
||||||
for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
|
if (changed) {
|
||||||
E->get()->update(propnames, values);
|
for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
|
||||||
|
E->get()->update(propnames, values);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p_instance_to_update->update(propnames, values);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3071,7 +3074,7 @@ PlaceHolderScriptInstance *CSharpScript::placeholder_instance_create(Object *p_t
|
|||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
PlaceHolderScriptInstance *si = memnew(PlaceHolderScriptInstance(CSharpLanguage::get_singleton(), Ref<Script>(this), p_this));
|
PlaceHolderScriptInstance *si = memnew(PlaceHolderScriptInstance(CSharpLanguage::get_singleton(), Ref<Script>(this), p_this));
|
||||||
placeholders.insert(si);
|
placeholders.insert(si);
|
||||||
_update_exports();
|
_update_exports(si);
|
||||||
return si;
|
return si;
|
||||||
#else
|
#else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -136,7 +136,8 @@ class CSharpScript : public Script {
|
|||||||
void load_script_signals(GDMonoClass *p_class, GDMonoClass *p_native_class);
|
void load_script_signals(GDMonoClass *p_class, GDMonoClass *p_native_class);
|
||||||
bool _get_signal(GDMonoClass *p_class, GDMonoClass *p_delegate, Vector<Argument> ¶ms);
|
bool _get_signal(GDMonoClass *p_class, GDMonoClass *p_delegate, Vector<Argument> ¶ms);
|
||||||
|
|
||||||
bool _update_exports();
|
bool _update_exports(PlaceHolderScriptInstance *p_instance_to_update = nullptr);
|
||||||
|
|
||||||
bool _get_member_export(IMonoClassMember *p_member, bool p_inspect_export, PropertyInfo &r_prop_info, bool &r_exported);
|
bool _get_member_export(IMonoClassMember *p_member, bool p_inspect_export, PropertyInfo &r_prop_info, bool &r_exported);
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
static int _try_get_member_export_hint(IMonoClassMember *p_member, ManagedType p_type, Variant::Type p_variant_type, bool p_allow_generics, PropertyHint &r_hint, String &r_hint_string);
|
static int _try_get_member_export_hint(IMonoClassMember *p_member, ManagedType p_type, Variant::Type p_variant_type, bool p_allow_generics, PropertyHint &r_hint, String &r_hint_string);
|
||||||
|
|||||||
Reference in New Issue
Block a user