Skip to content

Commit ed7c9c4

Browse files
gregorycuZeno-
authored andcommittedJan 25, 2015
Settings fixes Make the GameGlobalShaderConstantSetter use the settings callback (8% perf improvement in game loop) Ensure variable is set Ensure settings callback is threadsafe
1 parent 2c4a5e1 commit ed7c9c4

File tree

4 files changed

+67
-33
lines changed

4 files changed

+67
-33
lines changed
 

‎src/fontengine.cpp

+13-13
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3636
FontEngine* g_fontengine = NULL;
3737

3838
/** callback to be used on change of font size setting */
39-
static void font_setting_changed(const std::string) {
39+
static void font_setting_changed(const std::string, void *userdata) {
4040
g_fontengine->readSettings();
4141
}
4242

@@ -91,22 +91,22 @@ FontEngine::FontEngine(Settings* main_settings, gui::IGUIEnvironment* env) :
9191
updateSkin();
9292

9393
if (m_currentMode == FM_Standard) {
94-
m_settings->registerChangedCallback("font_size", font_setting_changed);
95-
m_settings->registerChangedCallback("font_path", font_setting_changed);
96-
m_settings->registerChangedCallback("font_shadow", font_setting_changed);
97-
m_settings->registerChangedCallback("font_shadow_alpha", font_setting_changed);
94+
m_settings->registerChangedCallback("font_size", font_setting_changed, NULL);
95+
m_settings->registerChangedCallback("font_path", font_setting_changed, NULL);
96+
m_settings->registerChangedCallback("font_shadow", font_setting_changed, NULL);
97+
m_settings->registerChangedCallback("font_shadow_alpha", font_setting_changed, NULL);
9898
}
9999
else if (m_currentMode == FM_Fallback) {
100-
m_settings->registerChangedCallback("fallback_font_size", font_setting_changed);
101-
m_settings->registerChangedCallback("fallback_font_path", font_setting_changed);
102-
m_settings->registerChangedCallback("fallback_font_shadow", font_setting_changed);
103-
m_settings->registerChangedCallback("fallback_font_shadow_alpha", font_setting_changed);
100+
m_settings->registerChangedCallback("fallback_font_size", font_setting_changed, NULL);
101+
m_settings->registerChangedCallback("fallback_font_path", font_setting_changed, NULL);
102+
m_settings->registerChangedCallback("fallback_font_shadow", font_setting_changed, NULL);
103+
m_settings->registerChangedCallback("fallback_font_shadow_alpha", font_setting_changed, NULL);
104104
}
105105

106-
m_settings->registerChangedCallback("mono_font_path", font_setting_changed);
107-
m_settings->registerChangedCallback("mono_font_size", font_setting_changed);
108-
m_settings->registerChangedCallback("screen_dpi", font_setting_changed);
109-
m_settings->registerChangedCallback("gui_scaling", font_setting_changed);
106+
m_settings->registerChangedCallback("mono_font_path", font_setting_changed, NULL);
107+
m_settings->registerChangedCallback("mono_font_size", font_setting_changed, NULL);
108+
m_settings->registerChangedCallback("screen_dpi", font_setting_changed, NULL);
109+
m_settings->registerChangedCallback("gui_scaling", font_setting_changed, NULL);
110110
}
111111

112112
/******************************************************************************/

‎src/game.cpp

+21-2
Original file line numberDiff line numberDiff line change
@@ -809,16 +809,35 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
809809
bool *m_force_fog_off;
810810
f32 *m_fog_range;
811811
Client *m_client;
812+
bool m_fogEnabled;
812813

813814
public:
815+
void onSettingsChange(const std::string &name)
816+
{
817+
if (name == "enable_fog")
818+
m_fogEnabled = g_settings->getBool("enable_fog");
819+
}
820+
821+
static void SettingsCallback(const std::string name, void *userdata)
822+
{
823+
reinterpret_cast<GameGlobalShaderConstantSetter*>(userdata)->onSettingsChange(name);
824+
}
825+
814826
GameGlobalShaderConstantSetter(Sky *sky, bool *force_fog_off,
815827
f32 *fog_range, Client *client) :
816828
m_sky(sky),
817829
m_force_fog_off(force_fog_off),
818830
m_fog_range(fog_range),
819831
m_client(client)
820-
{}
821-
~GameGlobalShaderConstantSetter() {}
832+
{
833+
g_settings->registerChangedCallback("enable_fog", SettingsCallback, this);
834+
m_fogEnabled = g_settings->getBool("enable_fog");
835+
}
836+
837+
~GameGlobalShaderConstantSetter()
838+
{
839+
g_settings->deregisterChangedCallback("enable_fog", SettingsCallback, this);
840+
}
822841

823842
virtual void onSetConstants(video::IMaterialRendererServices *services,
824843
bool is_highlevel)

‎src/settings.cpp

+24-13
Original file line numberDiff line numberDiff line change
@@ -963,28 +963,39 @@ void Settings::clearNoLock()
963963
m_defaults.clear();
964964
}
965965

966-
967966
void Settings::registerChangedCallback(std::string name,
968-
setting_changed_callback cbf)
967+
setting_changed_callback cbf, void *userdata)
969968
{
970-
m_callbacks[name].push_back(cbf);
969+
JMutexAutoLock lock(m_callbackMutex);
970+
m_callbacks[name].push_back(std::make_pair(cbf, userdata));
971971
}
972972

973+
void Settings::deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata)
974+
{
975+
JMutexAutoLock lock(m_callbackMutex);
976+
std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
977+
if (iterToVector != m_callbacks.end())
978+
{
979+
std::vector<std::pair<setting_changed_callback, void*> > &vector = iterToVector->second;
980+
981+
std::vector<std::pair<setting_changed_callback, void*> >::iterator position =
982+
std::find(vector.begin(), vector.end(), std::make_pair(cbf, userdata));
983+
984+
if (position != vector.end())
985+
vector.erase(position);
986+
}
987+
}
973988

974989
void Settings::doCallbacks(const std::string name)
975990
{
976-
std::vector<setting_changed_callback> tempvector;
991+
JMutexAutoLock lock(m_callbackMutex);
992+
std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
993+
if (iterToVector != m_callbacks.end())
977994
{
978-
JMutexAutoLock lock(m_mutex);
979-
if (m_callbacks.find(name) != m_callbacks.end())
995+
std::vector<std::pair<setting_changed_callback, void*> >::iterator iter;
996+
for (iter = iterToVector->second.begin(); iter != iterToVector->second.end(); iter++)
980997
{
981-
tempvector = m_callbacks[name];
998+
(iter->first)(name, iter->second);
982999
}
9831000
}
984-
985-
std::vector<setting_changed_callback>::iterator iter;
986-
for (iter = tempvector.begin(); iter != tempvector.end(); iter++)
987-
{
988-
(*iter)(name);
989-
}
9901001
}

‎src/settings.h

+9-5
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Settings;
3232
struct NoiseParams;
3333

3434
/** function type to register a changed callback */
35-
typedef void (*setting_changed_callback)(const std::string);
35+
typedef void (*setting_changed_callback)(const std::string, void*);
3636

3737
enum ValueType {
3838
VALUETYPE_STRING,
@@ -204,7 +204,8 @@ class Settings {
204204
void clear();
205205
void updateValue(const Settings &other, const std::string &name);
206206
void update(const Settings &other);
207-
void registerChangedCallback(std::string name, setting_changed_callback cbf);
207+
void registerChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
208+
void deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
208209

209210
private:
210211

@@ -215,9 +216,12 @@ class Settings {
215216

216217
std::map<std::string, SettingsEntry> m_settings;
217218
std::map<std::string, SettingsEntry> m_defaults;
218-
std::map<std::string, std::vector<setting_changed_callback> > m_callbacks;
219-
// All methods that access m_settings/m_defaults directly should lock this.
220-
mutable JMutex m_mutex;
219+
220+
std::map<std::string, std::vector<std::pair<setting_changed_callback,void*> > > m_callbacks;
221+
222+
mutable JMutex m_callbackMutex;
223+
mutable JMutex m_mutex; // All methods that access m_settings/m_defaults directly should lock this.
224+
221225
};
222226

223227
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.