diff --git a/core/config/engine.cpp b/core/config/engine.cpp
index 203f8c38826..2bb88378491 100644
--- a/core/config/engine.cpp
+++ b/core/config/engine.cpp
@@ -258,6 +258,12 @@ bool Engine::is_printing_error_messages() const {
return CoreGlobals::print_error_enabled;
}
+void Engine::print_header(const String &p_string) const {
+ if (_print_header) {
+ print_line(p_string);
+ }
+}
+
void Engine::add_singleton(const Singleton &p_singleton) {
ERR_FAIL_COND_MSG(singleton_ptrs.has(p_singleton.name), vformat("Can't register singleton '%s' because it already exists.", p_singleton.name));
singletons.push_back(p_singleton);
diff --git a/core/config/engine.h b/core/config/engine.h
index b64309a9e83..be7cd62f663 100644
--- a/core/config/engine.h
+++ b/core/config/engine.h
@@ -84,6 +84,8 @@ private:
bool project_manager_hint = false;
bool extension_reloading = false;
+ bool _print_header = true;
+
static Engine *singleton;
String write_movie_path;
@@ -123,6 +125,7 @@ public:
void set_print_error_messages(bool p_enabled);
bool is_printing_error_messages() const;
+ void print_header(const String &p_string) const;
void set_frame_delay(uint32_t p_msec);
uint32_t get_frame_delay() const;
diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp
index 974fd5283b0..b8ce271586a 100644
--- a/core/config/project_settings.cpp
+++ b/core/config/project_settings.cpp
@@ -1393,6 +1393,7 @@ ProjectSettings::ProjectSettings() {
GLOBAL_DEF_BASIC(PropertyInfo(Variant::STRING, "application/run/main_scene", PROPERTY_HINT_FILE, "*.tscn,*.scn,*.res"), "");
GLOBAL_DEF("application/run/disable_stdout", false);
GLOBAL_DEF("application/run/disable_stderr", false);
+ GLOBAL_DEF("application/run/print_header", true);
GLOBAL_DEF_RST("application/config/use_hidden_project_data_directory", true);
GLOBAL_DEF("application/config/use_custom_user_dir", false);
GLOBAL_DEF("application/config/custom_user_dir_name", "");
diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index f69faff2bd6..f8e91c94a0b 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -353,6 +353,9 @@
This setting can be overridden using the [code]--max-fps <fps>[/code] command line argument (including with a value of [code]0[/code] for unlimited framerate).
[b]Note:[/b] This property is only read when the project starts. To change the rendering FPS cap at runtime, set [member Engine.max_fps] instead.
+
+ If [code]true[/code], the engine header is printed in the console on startup. This header describes the current version of the engine, as well as the renderer being used. This behavior can also be disabled on the command line with the [code]--no-header[/code] option.
+
Audio buses will disable automatically when sound goes below a given dB threshold for a given time. This saves CPU as effects assigned to that bus will no longer do any processing.
diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp
index 0a20d838362..f5296f969f0 100644
--- a/drivers/gles3/rasterizer_gles3.cpp
+++ b/drivers/gles3/rasterizer_gles3.cpp
@@ -193,7 +193,7 @@ typedef void(GLAPIENTRY *DEBUGPROCARB)(GLenum source,
typedef void(GLAPIENTRY *DebugMessageCallbackARB)(DEBUGPROCARB callback, const void *userParam);
void RasterizerGLES3::initialize() {
- print_line(vformat("OpenGL API %s - Compatibility - Using Device: %s - %s", RS::get_singleton()->get_video_adapter_api_version(), RS::get_singleton()->get_video_adapter_vendor(), RS::get_singleton()->get_video_adapter_name()));
+ Engine::get_singleton()->print_header(vformat("OpenGL API %s - Compatibility - Using Device: %s - %s", RS::get_singleton()->get_video_adapter_api_version(), RS::get_singleton()->get_video_adapter_vendor(), RS::get_singleton()->get_video_adapter_name()));
}
void RasterizerGLES3::finalize() {
diff --git a/main/main.cpp b/main/main.cpp
index ceb2cbbae7e..4c9c159f47d 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -483,6 +483,7 @@ void Main::print_help(const char *p_binary) {
print_help_option("--version", "Display the version string.\n");
print_help_option("-v, --verbose", "Use verbose stdout mode.\n");
print_help_option("--quiet", "Quiet mode, silences stdout messages. Errors are still displayed.\n");
+ print_help_option("--no-header", "Do not print engine version and rendering method header on startup.\n");
print_help_title("Run options");
print_help_option("--, ++", "Separator for user-provided arguments. Following arguments are not used by the engine, but can be read from `OS.get_cmdline_user_args()`.\n");
@@ -1013,6 +1014,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
quiet_stdout = true;
+ } else if (I->get() == "--no-header") {
+ Engine::get_singleton()->_print_header = false;
+
} else if (I->get() == "--audio-driver") { // audio driver
if (I->next()) {
@@ -1833,6 +1837,10 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
if (bool(GLOBAL_GET("application/run/disable_stderr"))) {
CoreGlobals::print_error_enabled = false;
}
+ if (!bool(GLOBAL_GET("application/run/print_header"))) {
+ // --no-header option for project settings.
+ Engine::get_singleton()->_print_header = false;
+ }
if (quiet_stdout) {
CoreGlobals::print_line_enabled = false;
@@ -2449,7 +2457,7 @@ Error Main::setup2() {
set_current_thread_safe_for_nodes(true);
// Print engine name and version
- print_line(String(VERSION_NAME) + " v" + get_full_version_string() + " - " + String(VERSION_WEBSITE));
+ Engine::get_singleton()->print_header(String(VERSION_NAME) + " v" + get_full_version_string() + " - " + String(VERSION_WEBSITE));
#ifdef TOOLS_ENABLED
if (editor || project_manager || cmdline_tool) {
@@ -2742,8 +2750,6 @@ Error Main::setup2() {
AudioDriverManager::initialize(audio_driver_idx);
- print_line(" "); // Add a blank line for readability.
-
// Right moment to create and initialize the audio server.
audio_server = memnew(AudioServer);
audio_server->init();
@@ -2763,6 +2769,9 @@ Error Main::setup2() {
OS::get_singleton()->benchmark_end_measure("Startup", "Servers");
+ // Add a blank line for readability.
+ Engine::get_singleton()->print_header("");
+
register_core_singletons();
/* Initialize the main window and boot screen */
diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp
index 3290738b408..3b51f5274a9 100644
--- a/servers/rendering/rendering_device.cpp
+++ b/servers/rendering/rendering_device.cpp
@@ -4983,7 +4983,7 @@ Error RenderingDevice::initialize(RenderingContextDriver *p_context, DisplayServ
}
// Output our device version.
- print_line(vformat("%s %s - %s - Using Device #%d: %s - %s", get_device_api_name(), get_device_api_version(), rendering_method, device_index, _get_device_vendor_name(device), device.name));
+ Engine::get_singleton()->print_header(vformat("%s %s - %s - Using Device #%d: %s - %s", get_device_api_name(), get_device_api_version(), rendering_method, device_index, _get_device_vendor_name(device), device.name));
}
// Pick the main queue family. It is worth noting we explicitly do not request the transfer bit, as apparently the specification defines