瀏覽代碼

Add caching to `DisplayServer::can_create_rendering_device()`

This greatly speeds up the method when using the Compatibility rendering
method, where this method is not guaranteed to return `true` in that case.
Hugo Locurcio 11 月之前
父節點
當前提交
62753701fd
共有 2 個文件被更改,包括 23 次插入0 次删除
  1. 13 0
      servers/display_server.cpp
  2. 10 0
      servers/display_server.h

+ 13 - 0
servers/display_server.cpp

@@ -1229,6 +1229,12 @@ bool DisplayServer::can_create_rendering_device() {
 		return true;
 		return true;
 	}
 	}
 
 
+	if (created_rendering_device == RenderingDeviceCreationStatus::SUCCESS) {
+		return true;
+	} else if (created_rendering_device == RenderingDeviceCreationStatus::FAILURE) {
+		return false;
+	}
+
 	Error err;
 	Error err;
 	RenderingContextDriver *rcd = nullptr;
 	RenderingContextDriver *rcd = nullptr;
 
 
@@ -1258,7 +1264,14 @@ bool DisplayServer::can_create_rendering_device() {
 			memdelete(rd);
 			memdelete(rd);
 			rd = nullptr;
 			rd = nullptr;
 			if (err == OK) {
 			if (err == OK) {
+				// Creating a RenderingDevice is quite slow.
+				// Cache the result for future usage, so that it's much faster on subsequent calls.
+				created_rendering_device = RenderingDeviceCreationStatus::SUCCESS;
+				memdelete(rcd);
+				rcd = nullptr;
 				return true;
 				return true;
+			} else {
+				created_rendering_device = RenderingDeviceCreationStatus::FAILURE;
 			}
 			}
 		}
 		}
 
 

+ 10 - 0
servers/display_server.h

@@ -594,6 +594,16 @@ public:
 	static Vector<String> get_create_function_rendering_drivers(int p_index);
 	static Vector<String> get_create_function_rendering_drivers(int p_index);
 	static DisplayServer *create(int p_index, const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Context p_context, Error &r_error);
 	static DisplayServer *create(int p_index, const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Context p_context, Error &r_error);
 
 
+	enum RenderingDeviceCreationStatus {
+		UNKNOWN,
+		SUCCESS,
+		FAILURE,
+	};
+
+	// Used to cache the result of `can_create_rendering_device()` when RenderingDevice isn't currently being used.
+	// This is done as creating a RenderingDevice is quite slow.
+	static inline RenderingDeviceCreationStatus created_rendering_device = RenderingDeviceCreationStatus::UNKNOWN;
+
 	static bool can_create_rendering_device();
 	static bool can_create_rendering_device();
 
 
 	DisplayServer();
 	DisplayServer();