1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Improve performance of CSharpLanguage::reload_assemblies

This commit is contained in:
Ryan
2025-05-12 02:52:01 -04:00
committed by Rémi Verschelde
parent 07f4c06601
commit f68bf2f545
2 changed files with 52 additions and 12 deletions

View File

@@ -538,6 +538,10 @@ void CSharpLanguage::frame() {
if (gdmono && gdmono->is_runtime_initialized() && GDMonoCache::godot_api_cache_updated) {
GDMonoCache::managed_callbacks.ScriptManagerBridge_FrameCallback();
}
#ifdef TOOLS_ENABLED
_flush_filesystem_updates();
#endif
}
struct CSharpScriptDepSort {
@@ -1072,6 +1076,47 @@ bool CSharpLanguage::debug_break(const String &p_error, bool p_allow_continue) {
}
#ifdef TOOLS_ENABLED
void CSharpLanguage::_queue_for_filesystem_update(String p_script_path) {
if (!Engine::get_singleton()->is_editor_hint()) {
return;
}
if (p_script_path.is_empty()) {
return;
}
pending_file_system_update_paths.push_back(p_script_path);
}
void CSharpLanguage::_flush_filesystem_updates() {
if (!Engine::get_singleton()->is_editor_hint()) {
return;
}
if (pending_file_system_update_paths.is_empty()) {
return;
}
// If the EditorFileSystem singleton is available, update the files;
// otherwise, the files will be updated when the singleton becomes available.
EditorFileSystem *efs = EditorFileSystem::get_singleton();
if (!efs) {
pending_file_system_update_paths.clear();
return;
}
// Required to prevent EditorProgress within EditorFileSystem from calling this while it is already flushing
if (is_flushing_filesystem_updates) {
return;
}
is_flushing_filesystem_updates = true;
efs->update_files(pending_file_system_update_paths);
is_flushing_filesystem_updates = false;
pending_file_system_update_paths.clear();
}
void CSharpLanguage::_editor_init_callback() {
// Load GodotTools and initialize GodotSharpEditor
@@ -2243,12 +2288,7 @@ void CSharpScript::reload_registered_script(Ref<CSharpScript> p_script) {
p_script->_update_exports();
#ifdef TOOLS_ENABLED
// If the EditorFileSystem singleton is available, update the file;
// otherwise, the file will be updated when the singleton becomes available.
EditorFileSystem *efs = EditorFileSystem::get_singleton();
if (efs && !p_script->get_path().is_empty()) {
efs->update_file(p_script->get_path());
}
CSharpLanguage::get_singleton()->_queue_for_filesystem_update(p_script->get_path());
#endif
}
@@ -2621,12 +2661,7 @@ Error CSharpScript::reload(bool p_keep_state) {
_update_exports();
#ifdef TOOLS_ENABLED
// If the EditorFileSystem singleton is available, update the file;
// otherwise, the file will be updated when the singleton becomes available.
EditorFileSystem *efs = EditorFileSystem::get_singleton();
if (efs) {
efs->update_file(script_path);
}
CSharpLanguage::get_singleton()->_queue_for_filesystem_update(script_path);
#endif
}

View File

@@ -434,6 +434,11 @@ class CSharpLanguage : public ScriptLanguage {
friend class GDMono;
#ifdef TOOLS_ENABLED
Vector<String> pending_file_system_update_paths;
bool is_flushing_filesystem_updates = false;
void _queue_for_filesystem_update(String p_script_path);
void _flush_filesystem_updates();
EditorPlugin *godotsharp_editor = nullptr;
static void _editor_init_callback();