Make the GameGlobalShaderConstantSetter use the settings callback (8% perf improvement in game loop)

Amend the settings callback to support userdata
This commit is contained in:
gregorycu 2015-01-24 13:03:57 +11:00 committed by kwolekr
parent aafbbcd537
commit a555e2d9b0
4 changed files with 27 additions and 11 deletions

View File

@ -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();
} }

View File

@ -809,15 +809,31 @@ 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)
{} {
g_settings->registerChangedCallback("enable_fog", SettingsCallback, this);
}
~GameGlobalShaderConstantSetter() {} ~GameGlobalShaderConstantSetter() {}
virtual void onSetConstants(video::IMaterialRendererServices *services, virtual void onSetConstants(video::IMaterialRendererServices *services,
@ -840,7 +856,7 @@ public:
// Fog distance // Fog distance
float fog_distance = 10000 * BS; float fog_distance = 10000 * BS;
if (g_settings->getBool("enable_fog") && !*m_force_fog_off) if (m_fogEnabled && !*m_force_fog_off)
fog_distance = *m_fog_range; fog_distance = *m_fog_range;
services->setPixelShaderConstant("fogDistance", &fog_distance, 1); services->setPixelShaderConstant("fogDistance", &fog_distance, 1);

View File

@ -965,15 +965,15 @@ void Settings::clearNoLock()
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); m_callbacks[name].push_back(std::make_pair(cbf,userdata));
} }
void Settings::doCallbacks(const std::string name) void Settings::doCallbacks(const std::string name)
{ {
std::vector<setting_changed_callback> tempvector; std::vector<std::pair<setting_changed_callback,void*> > tempvector;
{ {
JMutexAutoLock lock(m_mutex); JMutexAutoLock lock(m_mutex);
if (m_callbacks.find(name) != m_callbacks.end()) if (m_callbacks.find(name) != m_callbacks.end())
@ -982,9 +982,9 @@ void Settings::doCallbacks(const std::string name)
} }
} }
std::vector<setting_changed_callback>::iterator iter; std::vector<std::pair<setting_changed_callback, void*> >::iterator iter;
for (iter = tempvector.begin(); iter != tempvector.end(); iter++) for (iter = tempvector.begin(); iter != tempvector.end(); iter++)
{ {
(*iter)(name); (iter->first)(name,iter->second);
} }
} }

View File

@ -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 *userdata);
enum ValueType { enum ValueType {
VALUETYPE_STRING, VALUETYPE_STRING,
@ -204,7 +204,7 @@ 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);
private: private:
@ -215,7 +215,7 @@ 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; std::map<std::string, std::vector<std::pair<setting_changed_callback,void*> > > m_callbacks;
// All methods that access m_settings/m_defaults directly should lock this. // All methods that access m_settings/m_defaults directly should lock this.
mutable JMutex m_mutex; mutable JMutex m_mutex;
}; };