From 96beaac163049aa96006db9f48ada25961ec3821 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sat, 9 Dec 2023 09:39:00 +0300 Subject: [PATCH] Texture Database now loads faster --- src/CRE/object.cpp | 2 +- src/KKdLib/database/texture.cpp | 84 +++++++++++++++------------------ src/KKdLib/database/texture.hpp | 5 +- 3 files changed, 43 insertions(+), 48 deletions(-) diff --git a/src/CRE/object.cpp b/src/CRE/object.cpp index db7f42e0..b08ebc6c 100644 --- a/src/CRE/object.cpp +++ b/src/CRE/object.cpp @@ -1044,7 +1044,7 @@ void object_material_msgpack_read(const char* path, const char* set_name, while (index / tex->mipmaps_count < tex->array_size); } - tex_db->sort(); + tex_db->update(); size_t tex_id_num = txp_set->textures.size(); if (set->tex_id_num != tex_id_num) { diff --git a/src/KKdLib/database/texture.cpp b/src/KKdLib/database/texture.cpp index 2beac65f..e1e21ba6 100644 --- a/src/KKdLib/database/texture.cpp +++ b/src/KKdLib/database/texture.cpp @@ -227,42 +227,16 @@ void texture_database::add(texture_database_file* tex_db_file) { texture.reserve(tex_db_file->texture.size()); - size_t src_size = texture.size(); - size_t dst_size = src_size; + std::vector< texture_info> texture_add; for (texture_info_file& i : tex_db_file->texture) { - uint32_t id = i.id; - - texture_info* info = texture.data(); - if (info) { - size_t length = src_size; - size_t temp; - while (length > 0) - if (info[temp = length / 2].id >= id) - length /= 2; - else { - info += temp + 1; - length -= temp + 1; - } - - if (info == texture.data() + src_size || id != info->id) - info = 0; - } - - if (!info) { - texture_info* j_begin = texture.data() + src_size; - texture_info* j_end = texture.data() + dst_size; - for (texture_info* j = j_begin; j != j_end; j++) - if (id == j->id) { - info = j; - break; - } - } - - if (!info) { - texture.push_back({}); - info = &texture.back(); - dst_size++; + texture_info* info; + auto elem = texture_ids.find(i.id); + if (elem != texture_ids.end()) + info = elem->second; + else { + texture_add.push_back({}); + info = &texture_add.back(); } info->id = i.id; @@ -270,7 +244,12 @@ void texture_database::add(texture_database_file* tex_db_file) { info->name_hash = hash_string_murmurhash(info->name); } - sort(); + texture.insert(texture.end(), texture_add.begin(), texture_add.end()); + + texture_add.clear(); + texture_add.shrink_to_fit(); + + update(); } static size_t texture_info_radix_index_func_id(texture_info* data, size_t index) { @@ -280,22 +259,35 @@ static size_t texture_info_radix_index_func_id(texture_info* data, size_t index) void texture_database::clear() { texture.clear(); texture.shrink_to_fit(); + texture_ids.clear(); + texture_ids.shrink_to_fit(); + texture_murmurhashes.clear(); + texture_murmurhashes.shrink_to_fit(); } -void texture_database::sort() { - radix_sort_custom(texture.data(), texture.size(), sizeof(texture_info), - sizeof(uint32_t), (radix_index_func)texture_info_radix_index_func_id); +void texture_database::update() { + texture_ids.clear(); + texture_murmurhashes.clear(); + + texture_ids.reserve(texture.size()); + texture_murmurhashes.reserve(texture.size()); + + for (texture_info& i : texture) { + texture_ids.push_back(i.id, &i); + texture_murmurhashes.push_back(i.name_hash, &i); + } + + texture_ids.sort_unique(); + texture_murmurhashes.sort_unique(); } uint32_t texture_database::get_texture_id(const char* name) const { if (!name) return -1; - uint32_t name_hash = hash_utf8_murmurhash(name); - - for (const texture_info& i : texture) - if (name_hash == i.name_hash) - return i.id; + auto elem = texture_murmurhashes.find(hash_utf8_murmurhash(name)); + if (elem != texture_murmurhashes.end()) + return elem->second->id; return -1; } @@ -303,9 +295,9 @@ const char* texture_database::get_texture_name(uint32_t id) const { if (id == -1) return 0; - for (const texture_info& i : texture) - if (id == i.id) - return i.name.c_str(); + auto elem = texture_ids.find(id); + if (elem != texture_ids.end()) + return elem->second->name.c_str(); return 0; } diff --git a/src/KKdLib/database/texture.hpp b/src/KKdLib/database/texture.hpp index 96386f12..db9e8feb 100644 --- a/src/KKdLib/database/texture.hpp +++ b/src/KKdLib/database/texture.hpp @@ -8,6 +8,7 @@ #include #include #include "../default.hpp" +#include "../prj/vector_pair.hpp" struct texture_info_file { std::string name; @@ -49,13 +50,15 @@ struct texture_database_file { struct texture_database { std::vector texture; + prj::vector_pair texture_ids; + prj::vector_pair texture_murmurhashes; texture_database(); ~texture_database(); void add(texture_database_file* tex_db_file); void clear(); - void sort(); + void update(); uint32_t get_texture_id(const char* name) const; const char* get_texture_name(uint32_t id) const;