forked from Mirrorlandia_minetest/minetest
Settings fixes Make the GameGlobalShaderConstantSetter use the settings callback (8% perf improvement in game loop) Ensure variable is set Ensure settings callback is threadsafe
This commit is contained in:
parent
2c4a5e1861
commit
ed7c9c4cb8
@ -36,7 +36,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
FontEngine* g_fontengine = NULL;
|
FontEngine* g_fontengine = NULL;
|
||||||
|
|
||||||
/** callback to be used on change of font size setting */
|
/** callback to be used on change of font size setting */
|
||||||
static void font_setting_changed(const std::string) {
|
static void font_setting_changed(const std::string, void *userdata) {
|
||||||
g_fontengine->readSettings();
|
g_fontengine->readSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,22 +91,22 @@ FontEngine::FontEngine(Settings* main_settings, gui::IGUIEnvironment* env) :
|
|||||||
updateSkin();
|
updateSkin();
|
||||||
|
|
||||||
if (m_currentMode == FM_Standard) {
|
if (m_currentMode == FM_Standard) {
|
||||||
m_settings->registerChangedCallback("font_size", font_setting_changed);
|
m_settings->registerChangedCallback("font_size", font_setting_changed, NULL);
|
||||||
m_settings->registerChangedCallback("font_path", font_setting_changed);
|
m_settings->registerChangedCallback("font_path", font_setting_changed, NULL);
|
||||||
m_settings->registerChangedCallback("font_shadow", font_setting_changed);
|
m_settings->registerChangedCallback("font_shadow", font_setting_changed, NULL);
|
||||||
m_settings->registerChangedCallback("font_shadow_alpha", font_setting_changed);
|
m_settings->registerChangedCallback("font_shadow_alpha", font_setting_changed, NULL);
|
||||||
}
|
}
|
||||||
else if (m_currentMode == FM_Fallback) {
|
else if (m_currentMode == FM_Fallback) {
|
||||||
m_settings->registerChangedCallback("fallback_font_size", font_setting_changed);
|
m_settings->registerChangedCallback("fallback_font_size", font_setting_changed, NULL);
|
||||||
m_settings->registerChangedCallback("fallback_font_path", font_setting_changed);
|
m_settings->registerChangedCallback("fallback_font_path", font_setting_changed, NULL);
|
||||||
m_settings->registerChangedCallback("fallback_font_shadow", font_setting_changed);
|
m_settings->registerChangedCallback("fallback_font_shadow", font_setting_changed, NULL);
|
||||||
m_settings->registerChangedCallback("fallback_font_shadow_alpha", font_setting_changed);
|
m_settings->registerChangedCallback("fallback_font_shadow_alpha", font_setting_changed, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_settings->registerChangedCallback("mono_font_path", font_setting_changed);
|
m_settings->registerChangedCallback("mono_font_path", font_setting_changed, NULL);
|
||||||
m_settings->registerChangedCallback("mono_font_size", font_setting_changed);
|
m_settings->registerChangedCallback("mono_font_size", font_setting_changed, NULL);
|
||||||
m_settings->registerChangedCallback("screen_dpi", font_setting_changed);
|
m_settings->registerChangedCallback("screen_dpi", font_setting_changed, NULL);
|
||||||
m_settings->registerChangedCallback("gui_scaling", font_setting_changed);
|
m_settings->registerChangedCallback("gui_scaling", font_setting_changed, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
23
src/game.cpp
23
src/game.cpp
@ -809,16 +809,35 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
|
|||||||
bool *m_force_fog_off;
|
bool *m_force_fog_off;
|
||||||
f32 *m_fog_range;
|
f32 *m_fog_range;
|
||||||
Client *m_client;
|
Client *m_client;
|
||||||
|
bool m_fogEnabled;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
void onSettingsChange(const std::string &name)
|
||||||
|
{
|
||||||
|
if (name == "enable_fog")
|
||||||
|
m_fogEnabled = g_settings->getBool("enable_fog");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SettingsCallback(const std::string name, void *userdata)
|
||||||
|
{
|
||||||
|
reinterpret_cast<GameGlobalShaderConstantSetter*>(userdata)->onSettingsChange(name);
|
||||||
|
}
|
||||||
|
|
||||||
GameGlobalShaderConstantSetter(Sky *sky, bool *force_fog_off,
|
GameGlobalShaderConstantSetter(Sky *sky, bool *force_fog_off,
|
||||||
f32 *fog_range, Client *client) :
|
f32 *fog_range, Client *client) :
|
||||||
m_sky(sky),
|
m_sky(sky),
|
||||||
m_force_fog_off(force_fog_off),
|
m_force_fog_off(force_fog_off),
|
||||||
m_fog_range(fog_range),
|
m_fog_range(fog_range),
|
||||||
m_client(client)
|
m_client(client)
|
||||||
{}
|
{
|
||||||
~GameGlobalShaderConstantSetter() {}
|
g_settings->registerChangedCallback("enable_fog", SettingsCallback, this);
|
||||||
|
m_fogEnabled = g_settings->getBool("enable_fog");
|
||||||
|
}
|
||||||
|
|
||||||
|
~GameGlobalShaderConstantSetter()
|
||||||
|
{
|
||||||
|
g_settings->deregisterChangedCallback("enable_fog", SettingsCallback, this);
|
||||||
|
}
|
||||||
|
|
||||||
virtual void onSetConstants(video::IMaterialRendererServices *services,
|
virtual void onSetConstants(video::IMaterialRendererServices *services,
|
||||||
bool is_highlevel)
|
bool is_highlevel)
|
||||||
|
@ -963,28 +963,39 @@ void Settings::clearNoLock()
|
|||||||
m_defaults.clear();
|
m_defaults.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Settings::registerChangedCallback(std::string name,
|
void Settings::registerChangedCallback(std::string name,
|
||||||
setting_changed_callback cbf)
|
setting_changed_callback cbf, void *userdata)
|
||||||
{
|
{
|
||||||
m_callbacks[name].push_back(cbf);
|
JMutexAutoLock lock(m_callbackMutex);
|
||||||
|
m_callbacks[name].push_back(std::make_pair(cbf, userdata));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Settings::deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata)
|
||||||
|
{
|
||||||
|
JMutexAutoLock lock(m_callbackMutex);
|
||||||
|
std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
|
||||||
|
if (iterToVector != m_callbacks.end())
|
||||||
|
{
|
||||||
|
std::vector<std::pair<setting_changed_callback, void*> > &vector = iterToVector->second;
|
||||||
|
|
||||||
|
std::vector<std::pair<setting_changed_callback, void*> >::iterator position =
|
||||||
|
std::find(vector.begin(), vector.end(), std::make_pair(cbf, userdata));
|
||||||
|
|
||||||
|
if (position != vector.end())
|
||||||
|
vector.erase(position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Settings::doCallbacks(const std::string name)
|
void Settings::doCallbacks(const std::string name)
|
||||||
{
|
{
|
||||||
std::vector<setting_changed_callback> tempvector;
|
JMutexAutoLock lock(m_callbackMutex);
|
||||||
|
std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
|
||||||
|
if (iterToVector != m_callbacks.end())
|
||||||
{
|
{
|
||||||
JMutexAutoLock lock(m_mutex);
|
std::vector<std::pair<setting_changed_callback, void*> >::iterator iter;
|
||||||
if (m_callbacks.find(name) != m_callbacks.end())
|
for (iter = iterToVector->second.begin(); iter != iterToVector->second.end(); iter++)
|
||||||
{
|
{
|
||||||
tempvector = m_callbacks[name];
|
(iter->first)(name, iter->second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<setting_changed_callback>::iterator iter;
|
|
||||||
for (iter = tempvector.begin(); iter != tempvector.end(); iter++)
|
|
||||||
{
|
|
||||||
(*iter)(name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ class Settings;
|
|||||||
struct NoiseParams;
|
struct NoiseParams;
|
||||||
|
|
||||||
/** function type to register a changed callback */
|
/** function type to register a changed callback */
|
||||||
typedef void (*setting_changed_callback)(const std::string);
|
typedef void (*setting_changed_callback)(const std::string, void*);
|
||||||
|
|
||||||
enum ValueType {
|
enum ValueType {
|
||||||
VALUETYPE_STRING,
|
VALUETYPE_STRING,
|
||||||
@ -204,7 +204,8 @@ public:
|
|||||||
void clear();
|
void clear();
|
||||||
void updateValue(const Settings &other, const std::string &name);
|
void updateValue(const Settings &other, const std::string &name);
|
||||||
void update(const Settings &other);
|
void update(const Settings &other);
|
||||||
void registerChangedCallback(std::string name, setting_changed_callback cbf);
|
void registerChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
|
||||||
|
void deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -215,9 +216,12 @@ private:
|
|||||||
|
|
||||||
std::map<std::string, SettingsEntry> m_settings;
|
std::map<std::string, SettingsEntry> m_settings;
|
||||||
std::map<std::string, SettingsEntry> m_defaults;
|
std::map<std::string, SettingsEntry> m_defaults;
|
||||||
std::map<std::string, std::vector<setting_changed_callback> > m_callbacks;
|
|
||||||
// All methods that access m_settings/m_defaults directly should lock this.
|
std::map<std::string, std::vector<std::pair<setting_changed_callback,void*> > > m_callbacks;
|
||||||
mutable JMutex m_mutex;
|
|
||||||
|
mutable JMutex m_callbackMutex;
|
||||||
|
mutable JMutex m_mutex; // All methods that access m_settings/m_defaults directly should lock this.
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user