1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-11 17:51:04 +00:00

Cache getTextureDirs()

This commit is contained in:
sfan5 2025-08-08 11:40:12 +02:00
parent 0b9ae73369
commit 55cca34ee9
7 changed files with 37 additions and 59 deletions

View file

@ -863,46 +863,17 @@ Game::Game() :
m_chat_log_buf(g_logger), m_chat_log_buf(g_logger),
m_game_ui(new GameUI()) m_game_ui(new GameUI())
{ {
g_settings->registerChangedCallback("chat_log_level", clearTextureNameCache();
&settingChangedCallback, this);
g_settings->registerChangedCallback("doubletap_jump", const char *settings[] = {
&settingChangedCallback, this); "chat_log_level", "doubletap_jump", "toggle_sneak_key", "toggle_aux1_key",
g_settings->registerChangedCallback("toggle_sneak_key", "enable_joysticks", "enable_fog", "mouse_sensitivity", "joystick_frustum_sensitivity",
&settingChangedCallback, this); "repeat_place_time", "repeat_dig_time", "noclip", "free_move", "fog_start",
g_settings->registerChangedCallback("toggle_aux1_key", "cinematic", "cinematic_camera_smoothing", "camera_smoothing", "invert_mouse",
&settingChangedCallback, this); "enable_hotbar_mouse_wheel", "invert_hotbar_mouse_wheel", "pause_on_lost_focus",
g_settings->registerChangedCallback("enable_joysticks", };
&settingChangedCallback, this); for (auto s : settings)
g_settings->registerChangedCallback("enable_fog", g_settings->registerChangedCallback(s, &settingChangedCallback, this);
&settingChangedCallback, this);
g_settings->registerChangedCallback("mouse_sensitivity",
&settingChangedCallback, this);
g_settings->registerChangedCallback("joystick_frustum_sensitivity",
&settingChangedCallback, this);
g_settings->registerChangedCallback("repeat_place_time",
&settingChangedCallback, this);
g_settings->registerChangedCallback("repeat_dig_time",
&settingChangedCallback, this);
g_settings->registerChangedCallback("noclip",
&settingChangedCallback, this);
g_settings->registerChangedCallback("free_move",
&settingChangedCallback, this);
g_settings->registerChangedCallback("fog_start",
&settingChangedCallback, this);
g_settings->registerChangedCallback("cinematic",
&settingChangedCallback, this);
g_settings->registerChangedCallback("cinematic_camera_smoothing",
&settingChangedCallback, this);
g_settings->registerChangedCallback("camera_smoothing",
&settingChangedCallback, this);
g_settings->registerChangedCallback("invert_mouse",
&settingChangedCallback, this);
g_settings->registerChangedCallback("enable_hotbar_mouse_wheel",
&settingChangedCallback, this);
g_settings->registerChangedCallback("invert_hotbar_mouse_wheel",
&settingChangedCallback, this);
g_settings->registerChangedCallback("pause_on_lost_focus",
&settingChangedCallback, this);
readSettings(); readSettings();
} }
@ -4254,11 +4225,6 @@ void the_game(volatile std::sig_atomic_t *kill,
{ {
Game game; Game game;
/* Make a copy of the server address because if a local singleplayer server
* is created then this is updated and we don't want to change the value
* passed to us by the calling function
*/
try { try {
if (game.startup(kill, input, rendering_engine, start_data, if (game.startup(kill, input, rendering_engine, start_data,

View file

@ -1113,7 +1113,7 @@ bool ImageSource::generateImagePart(std::string_view part_of_name,
<< " for [combine" << std::endl; << " for [combine" << std::endl;
continue; continue;
} }
infostream << "Adding \"" << filename<< "\" to combined " tracestream << "Adding \"" << filename << "\" to combined "
<< pos_base << std::endl; << pos_base << std::endl;
video::IImage *img = generateImage(filename, source_image_names); video::IImage *img = generateImage(filename, source_image_names);

View file

@ -5,6 +5,7 @@
#include "texturepaths.h" #include "texturepaths.h"
#include "util/container.h" #include "util/container.h"
#include "util/thread.h"
#include "settings.h" #include "settings.h"
#include "filesys.h" #include "filesys.h"
#include "porting.h" #include "porting.h"
@ -12,10 +13,13 @@
// A cache from texture name to texture path // A cache from texture name to texture path
static MutexedMap<std::string, std::string> g_texturename_to_path_cache; static MutexedMap<std::string, std::string> g_texturename_to_path_cache;
// Cached result of getTextureDirs()
static MutexedVariable<std::vector<std::string>> g_texturedirs_cache;
void clearTextureNameCache() void clearTextureNameCache()
{ {
g_texturename_to_path_cache.clear(); g_texturename_to_path_cache.clear();
g_texturedirs_cache.set({});
} }
// Find out the full path of an image by trying different filename extensions. // Find out the full path of an image by trying different filename extensions.
@ -74,24 +78,28 @@ std::string getTexturePath(const std::string &filename, bool *is_base_pack)
break; break;
} }
// Check from default data directory i.e. .../minetest/textures/base/pack // Check from default data directory
if (fullpath.empty()) { if (fullpath.empty()) {
std::string base_path = porting::path_share + DIR_DELIM + "textures" std::string base_path = porting::path_share + DIR_DELIM "textures"
+ DIR_DELIM + "base" + DIR_DELIM + "pack"; DIR_DELIM "base" DIR_DELIM "pack";
// Check all filename extensions. Returns "" if not found. // Check all filename extensions. Returns "" if not found.
fullpath = getImagePath(base_path + DIR_DELIM + filename); fullpath = getImagePath(base_path + DIR_DELIM + filename);
if (is_base_pack && !fullpath.empty()) if (is_base_pack && !fullpath.empty())
*is_base_pack = true; *is_base_pack = true;
} }
// Add to cache (also an empty result is cached) // Add to cache (an empty result is cached too)
g_texturename_to_path_cache.set(filename, fullpath); g_texturename_to_path_cache.set(filename, fullpath);
// Finally return it
return fullpath; return fullpath;
} }
std::vector<std::string> getTextureDirs() std::vector<std::string> getTextureDirs()
{ {
return fs::GetRecursiveDirs(g_settings->get("texture_path")); std::vector<std::string> ret = g_texturedirs_cache.get();
if (ret.empty()) {
ret = fs::GetRecursiveDirs(g_settings->get("texture_path"));
g_texturedirs_cache.set(ret);
}
return ret;
} }

View file

@ -7,7 +7,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
// Texture paths get cached and this clears the Cache. // Texture paths get cached and this clears the cache.
void clearTextureNameCache(); void clearTextureNameCache();
// Find out the full path of an image by trying different filename extensions. // Find out the full path of an image by trying different filename extensions.

View file

@ -268,7 +268,6 @@ Server::Server(
m_gamespec(gamespec), m_gamespec(gamespec),
m_simple_singleplayer_mode(simple_singleplayer_mode), m_simple_singleplayer_mode(simple_singleplayer_mode),
m_dedicated(dedicated), m_dedicated(dedicated),
m_async_fatal_error(""),
m_con(con::createMTP(CONNECTION_TIMEOUT, m_bind_addr.isIPv6(), this)), m_con(con::createMTP(CONNECTION_TIMEOUT, m_bind_addr.isIPv6(), this)),
m_itemdef(createItemDefManager()), m_itemdef(createItemDefManager()),
m_nodedef(createNodeDefManager()), m_nodedef(createNodeDefManager()),

View file

@ -105,7 +105,11 @@ public:
return result; return result;
} }
void clear() { m_values.clear(); } void clear()
{
MutexAutoLock lock(m_mutex);
m_values.clear();
}
private: private:
std::map<Key, Value> m_values; std::map<Key, Value> m_values;

View file

@ -15,12 +15,13 @@ template<typename T>
class MutexedVariable class MutexedVariable
{ {
public: public:
// default initialization
MutexedVariable() {}
MutexedVariable(const T &value): MutexedVariable(const T &value):
m_value(value) m_value(value) {}
{}
MutexedVariable(T &&value): MutexedVariable(T &&value):
m_value(std::move(value)) m_value(std::move(value)) {}
{}
T get() T get()
{ {