Browse Source

Merge pull request #41833 from dalexeev/splash_delay

Add boot splash minimum display time setting
Yuri Sizov 3 years ago
parent
commit
42537daeb1
2 changed files with 19 additions and 0 deletions
  1. 3 0
      doc/classes/ProjectSettings.xml
  2. 16 0
      main/main.cpp

+ 3 - 0
doc/classes/ProjectSettings.xml

@@ -203,6 +203,9 @@
 			Path to an image used as the boot splash. If left empty, the default Godot Engine splash will be displayed instead.
 			[b]Note:[/b] Only effective if [member application/boot_splash/show_image] is [code]true[/code].
 		</member>
+		<member name="application/boot_splash/minimum_display_time" type="int" setter="" getter="" default="0">
+			Minimum boot splash display time (in milliseconds). It is not recommended to set too high values for this setting.
+		</member>
 		<member name="application/boot_splash/show_image" type="bool" setter="" getter="" default="true">
 			If [code]true[/code], displays the image specified in [member application/boot_splash/image] when the engine starts. If [code]false[/code], only displays the plain color specified in [member application/boot_splash/bg_color].
 		</member>

+ 16 - 0
main/main.cpp

@@ -2198,6 +2198,13 @@ bool Main::start() {
 #endif
 	}
 
+	uint64_t minimum_time_msec = GLOBAL_DEF("application/boot_splash/minimum_display_time", 0);
+	ProjectSettings::get_singleton()->set_custom_property_info("application/boot_splash/minimum_display_time",
+			PropertyInfo(Variant::INT,
+					"application/boot_splash/minimum_display_time",
+					PROPERTY_HINT_RANGE,
+					"0,100,1,or_greater,suffix:ms")); // No negative numbers.
+
 #ifdef TOOLS_ENABLED
 	if (!doc_tool_path.is_empty()) {
 		// Needed to instance editor-only classes for their default values
@@ -2718,6 +2725,15 @@ bool Main::start() {
 	if (movie_writer) {
 		movie_writer->begin(DisplayServer::get_singleton()->window_get_size(), fixed_fps, write_movie_path);
 	}
+
+	if (minimum_time_msec) {
+		uint64_t minimum_time = 1000 * minimum_time_msec;
+		uint64_t elapsed_time = OS::get_singleton()->get_ticks_usec();
+		if (elapsed_time < minimum_time) {
+			OS::get_singleton()->delay_usec(minimum_time - elapsed_time);
+		}
+	}
+
 	return true;
 }