瀏覽代碼

Optimize `Color::find_named_color()`

Danil Alexeev 2 年之前
父節點
當前提交
49594d8c41
共有 2 個文件被更改,包括 13 次插入13 次删除
  1. 13 12
      core/math/color.cpp
  2. 0 1
      core/math/color_names.inc

+ 13 - 12
core/math/color.cpp

@@ -33,7 +33,7 @@
 #include "color_names.inc"
 #include "core/math/math_funcs.h"
 #include "core/string/ustring.h"
-#include "core/templates/rb_map.h"
+#include "core/templates/hash_map.h"
 
 #include "thirdparty/misc/ok_color.h"
 
@@ -414,7 +414,7 @@ Color Color::named(const String &p_name, const Color &p_default) {
 
 int Color::find_named_color(const String &p_name) {
 	String name = p_name;
-	// Normalize name
+	// Normalize name.
 	name = name.replace(" ", "");
 	name = name.replace("-", "");
 	name = name.replace("_", "");
@@ -422,23 +422,24 @@ int Color::find_named_color(const String &p_name) {
 	name = name.replace(".", "");
 	name = name.to_upper();
 
-	int idx = 0;
-	while (named_colors[idx].name != nullptr) {
-		if (name == String(named_colors[idx].name).replace("_", "")) {
-			return idx;
+	static HashMap<String, int> named_colors_hashmap;
+	if (unlikely(named_colors_hashmap.is_empty())) {
+		const int named_color_count = get_named_color_count();
+		for (int i = 0; i < named_color_count; i++) {
+			named_colors_hashmap[String(named_colors[i].name).replace("_", "")] = i;
 		}
-		idx++;
+	}
+
+	const HashMap<String, int>::ConstIterator E = named_colors_hashmap.find(name);
+	if (E) {
+		return E->value;
 	}
 
 	return -1;
 }
 
 int Color::get_named_color_count() {
-	int idx = 0;
-	while (named_colors[idx].name != nullptr) {
-		idx++;
-	}
-	return idx;
+	return sizeof(named_colors) / sizeof(NamedColor);
 }
 
 String Color::get_named_color_name(int p_idx) {

+ 0 - 1
core/math/color_names.inc

@@ -189,5 +189,4 @@ static NamedColor named_colors[] = {
 	{ "WHITE_SMOKE", Color::hex(0xF5F5F5FF) },
 	{ "YELLOW", Color::hex(0xFFFF00FF) },
 	{ "YELLOW_GREEN", Color::hex(0x9ACD32FF) },
-	{ nullptr, Color() },
 };