diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/main.cpp | 74 | ||||
-rw-r--r-- | main/performance.h | 1 |
2 files changed, 59 insertions, 16 deletions
diff --git a/main/main.cpp b/main/main.cpp index 61d88254f1..8a25827e02 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -157,6 +157,8 @@ static String debug_server_uri; HashMap<Main::CLIScope, Vector<String>> forwardable_cli_arguments; #endif +bool use_startup_benchmark = false; +String startup_benchmark_file; // Display @@ -164,7 +166,7 @@ static DisplayServer::WindowMode window_mode = DisplayServer::WINDOW_MODE_WINDOW static DisplayServer::ScreenOrientation window_orientation = DisplayServer::SCREEN_LANDSCAPE; static DisplayServer::VSyncMode window_vsync_mode = DisplayServer::VSYNC_ENABLED; static uint32_t window_flags = 0; -static Size2i window_size = Size2i(1024, 600); +static Size2i window_size = Size2i(1152, 648); static int init_screen = -1; static bool init_fullscreen = false; @@ -395,6 +397,8 @@ void Main::print_help(const char *p_binary) { OS::get_singleton()->print(" --no-docbase Disallow dumping the base types (used with --doctool).\n"); OS::get_singleton()->print(" --build-solutions Build the scripting solutions (e.g. for C# projects). Implies --editor and requires a valid project to edit.\n"); OS::get_singleton()->print(" --dump-extension-api Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder.\n"); + OS::get_singleton()->print(" --startup-benchmark Benchmark the startup time and print it to console.\n"); + OS::get_singleton()->print(" --startup-benchmark-file <path> Benchmark the startup time and save it to a given file in JSON format.\n"); #ifdef TESTS_ENABLED OS::get_singleton()->print(" --test [--help] Run unit tests. Use --test --help for more information.\n"); #endif @@ -603,6 +607,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph engine = memnew(Engine); MAIN_PRINT("Main: Initialize CORE"); + engine->startup_begin(); + engine->startup_benchmark_begin_measure("core"); register_core_types(); register_core_driver_types(); @@ -1232,6 +1238,19 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->print("Missing --xr-mode argument, aborting.\n"); goto error; } + + } else if (I->get() == "--startup-benchmark") { + use_startup_benchmark = true; + } else if (I->get() == "--startup-benchmark-file") { + if (I->next()) { + use_startup_benchmark = true; + startup_benchmark_file = I->next()->get(); + N = I->next()->next(); + } else { + OS::get_singleton()->print("Missing <path> argument for --startup-benchmark-file <path>.\n"); + goto error; + } + } else if (I->get() == "--") { adding_user_args = true; } else { @@ -1648,6 +1667,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph message_queue = memnew(MessageQueue); + engine->startup_benchmark_end_measure(); // core + if (p_second_phase) { return setup2(); } @@ -1714,6 +1735,8 @@ error: } Error Main::setup2(Thread::ID p_main_tid_override) { + engine->startup_benchmark_begin_measure("servers"); + tsman = memnew(TextServerManager); if (tsman) { @@ -2021,10 +2044,16 @@ Error Main::setup2(Thread::ID p_main_tid_override) { GLOBAL_DEF_RST("internationalization/rendering/text_driver", ""); String text_driver_options; for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { - if (i > 0) { + const String driver_name = TextServerManager::get_singleton()->get_interface(i)->get_name(); + if (driver_name == "Dummy") { + // Dummy text driver cannot draw any text, making the editor unusable if selected. + continue; + } + if (!text_driver_options.is_empty() && text_driver_options.find(",") == -1) { + // Not the first option; add a comma before it as a separator for the property hint. text_driver_options += ","; } - text_driver_options += TextServerManager::get_singleton()->get_interface(i)->get_name(); + text_driver_options += driver_name; } ProjectSettings::get_singleton()->set_custom_property_info("internationalization/rendering/text_driver", PropertyInfo(Variant::STRING, "internationalization/rendering/text_driver", PROPERTY_HINT_ENUM, text_driver_options)); @@ -2065,8 +2094,12 @@ Error Main::setup2(Thread::ID p_main_tid_override) { ERR_FAIL_V_MSG(ERR_CANT_CREATE, "TextServer: Unable to create TextServer interface."); } + engine->startup_benchmark_end_measure(); // servers + MAIN_PRINT("Main: Load Scene Types"); + engine->startup_benchmark_begin_measure("scene"); + register_scene_types(); register_driver_types(); @@ -2142,6 +2175,8 @@ Error Main::setup2(Thread::ID p_main_tid_override) { print_verbose("EDITOR API HASH: " + uitos(ClassDB::get_api_hash(ClassDB::API_EDITOR))); MAIN_PRINT("Main: Done"); + engine->startup_benchmark_end_measure(); // scene + return OK; } @@ -2273,18 +2308,6 @@ bool Main::start() { ERR_FAIL_COND_V_MSG(da.is_null(), false, "Argument supplied to --doctool must be a valid directory path."); } -#ifndef MODULE_MONO_ENABLED - // Hack to define Mono-specific project settings even on non-Mono builds, - // so that we don't lose their descriptions and default values in DocData. - // Default values should be synced with mono_gd/gd_mono.cpp. - GLOBAL_DEF("mono/debugger_agent/port", 23685); - GLOBAL_DEF("mono/debugger_agent/wait_for_debugger", false); - GLOBAL_DEF("mono/debugger_agent/wait_timeout", 3000); - GLOBAL_DEF("mono/profiler/args", "log:calls,alloc,sample,output=output.mlpd"); - GLOBAL_DEF("mono/profiler/enabled", false); - GLOBAL_DEF("mono/runtime/unhandled_exception_policy", 0); -#endif - Error err; DocTools doc; doc.generate(doc_base); @@ -2480,6 +2503,7 @@ bool Main::start() { if (!project_manager && !editor) { // game if (!game_path.is_empty() || !script.is_empty()) { //autoload + Engine::get_singleton()->startup_benchmark_begin_measure("load_autoloads"); HashMap<StringName, ProjectSettings::AutoloadInfo> autoloads = ProjectSettings::get_singleton()->get_autoload_list(); //first pass, add the constants so they exist before any script is loaded @@ -2534,12 +2558,14 @@ bool Main::start() { for (Node *E : to_add) { sml->get_root()->add_child(E); } + Engine::get_singleton()->startup_benchmark_end_measure(); // load autoloads } } #ifdef TOOLS_ENABLED EditorNode *editor_node = nullptr; if (editor) { + Engine::get_singleton()->startup_benchmark_begin_measure("editor"); editor_node = memnew(EditorNode); sml->get_root()->add_child(editor_node); @@ -2547,6 +2573,13 @@ bool Main::start() { editor_node->export_preset(_export_preset, positional_arg, export_debug, export_pack_only); game_path = ""; // Do not load anything. } + + Engine::get_singleton()->startup_benchmark_end_measure(); + + editor_node->set_use_startup_benchmark(use_startup_benchmark, startup_benchmark_file); + // Editor takes over + use_startup_benchmark = false; + startup_benchmark_file = String(); } #endif @@ -2711,6 +2744,8 @@ bool Main::start() { if (!project_manager && !editor) { // game + Engine::get_singleton()->startup_benchmark_begin_measure("game_load"); + // Load SSL Certificates from Project Settings (or builtin). Crypto::load_default_certificates(GLOBAL_DEF("network/ssl/certificate_bundle_override", "")); @@ -2750,16 +2785,20 @@ bool Main::start() { } } } + + Engine::get_singleton()->startup_benchmark_end_measure(); // game_load } #ifdef TOOLS_ENABLED if (project_manager) { + Engine::get_singleton()->startup_benchmark_begin_measure("project_manager"); Engine::get_singleton()->set_editor_hint(true); ProjectManager *pmanager = memnew(ProjectManager); ProgressDialog *progress_dialog = memnew(ProgressDialog); pmanager->add_child(progress_dialog); sml->get_root()->add_child(pmanager); DisplayServer::get_singleton()->set_context(DisplayServer::CONTEXT_PROJECTMAN); + Engine::get_singleton()->startup_benchmark_end_measure(); } if (project_manager || editor) { @@ -2789,6 +2828,11 @@ bool Main::start() { } } + if (use_startup_benchmark) { + Engine::get_singleton()->startup_dump(startup_benchmark_file); + startup_benchmark_file = String(); + } + return true; } diff --git a/main/performance.h b/main/performance.h index 2837d8f512..00e00886ef 100644 --- a/main/performance.h +++ b/main/performance.h @@ -85,7 +85,6 @@ public: PHYSICS_3D_ACTIVE_OBJECTS, PHYSICS_3D_COLLISION_PAIRS, PHYSICS_3D_ISLAND_COUNT, - //physics AUDIO_OUTPUT_LATENCY, MONITOR_MAX }; |