diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2009-05-02 00:34:23 +0400 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2009-05-02 00:34:23 +0400 |
commit | 07abb9dee2aba5ed161c22f3ec45031f9fdb183a (patch) | |
tree | 83740cfff96b12a6240d1e5ceee5f1594e43c984 /source/gameengine/GameLogic | |
parent | e13a089d918cbe3709f544ccebbb718a452ac6fa (diff) |
BGE performance:
- Vast performance increase when removing scene containing large number of
objects: the sensor/controller map was updated for each deleted object,
causing massive slow down when the number of objects was large (O(n^2)).
- Use reference when scanning the sensor map => avoid useless copy.
- Remove dynamically the object bounding box from the DBVT when the object
is invisible => faster culling.
Diffstat (limited to 'source/gameengine/GameLogic')
-rw-r--r-- | source/gameengine/GameLogic/SCA_LogicManager.cpp | 29 | ||||
-rw-r--r-- | source/gameengine/GameLogic/SCA_LogicManager.h | 8 |
2 files changed, 26 insertions, 11 deletions
diff --git a/source/gameengine/GameLogic/SCA_LogicManager.cpp b/source/gameengine/GameLogic/SCA_LogicManager.cpp index b584b37180f..0b549ded474 100644 --- a/source/gameengine/GameLogic/SCA_LogicManager.cpp +++ b/source/gameengine/GameLogic/SCA_LogicManager.cpp @@ -79,6 +79,13 @@ SCA_LogicManager::~SCA_LogicManager() m_activeActuators.clear(); } +// this function is a performance helper when the scene is destoyed +// without it, the map updated for each object... a massive slow down when there are +// large number of objects. By clearing the map upfront we avoid the waster of time. +void SCA_LogicManager::RemoveSensorMap() +{ + m_sensorcontrollermapje.clear(); +} /* // this kind of fixes bug 398 but breakes games, so better leave it out for now. @@ -171,12 +178,16 @@ void* SCA_LogicManager::FindBlendObjByGameMeshName(const STR_String& gamemeshnam void SCA_LogicManager::RemoveSensor(SCA_ISensor* sensor) { - controllerlist contlist = m_sensorcontrollermapje[sensor]; - for (controllerlist::const_iterator c= contlist.begin();!(c==contlist.end());c++) + sensormap_t::const_iterator mit = m_sensorcontrollermapje.find(sensor); + if (mit != m_sensorcontrollermapje.end()) { - (*c)->UnlinkSensor(sensor); + const controllerlist& contlist = mit->second; + for (controllerlist::const_iterator c= contlist.begin();!(c==contlist.end());c++) + { + (*c)->UnlinkSensor(sensor); + } + m_sensorcontrollermapje.erase(sensor); } - m_sensorcontrollermapje.erase(sensor); sensor->UnregisterToManager(); } @@ -184,7 +195,7 @@ void SCA_LogicManager::RemoveController(SCA_IController* controller) { controller->UnlinkAllSensors(); controller->UnlinkAllActuators(); - std::map<SCA_ISensor*,controllerlist>::iterator sit; + sensormap_t::iterator sit; for (sit = m_sensorcontrollermapje.begin();!(sit==m_sensorcontrollermapje.end());++sit) { (*sit).second.remove(controller); @@ -197,10 +208,10 @@ void SCA_LogicManager::RemoveDestroyedActuator(SCA_IActuator* actuator) m_removedActuators.push_back(SmartActuatorPtr(actuator,0)); // take care that no controller can use this actuator again ! - std::map<SCA_ISensor*,controllerlist>::const_iterator sit; + sensormap_t::const_iterator sit; for (sit = m_sensorcontrollermapje.begin();!(sit==m_sensorcontrollermapje.end());++sit) { - controllerlist contlist = (*sit).second; + const controllerlist& contlist = sit->second; for (list<SCA_IController*>::const_iterator c= contlist.begin();!(c==contlist.end());c++) { (*c)->UnlinkActuator(actuator); @@ -237,8 +248,8 @@ void SCA_LogicManager::BeginFrame(double curtime, double fixedtime) !(is==m_activatedsensors.end());is++) { SCA_ISensor* sensor = *is; - controllerlist contlist = m_sensorcontrollermapje[sensor]; - for (list<SCA_IController*>::const_iterator c= contlist.begin(); + const controllerlist& contlist = m_sensorcontrollermapje[sensor]; + for (list<SCA_IController*>::const_iterator c= contlist.begin(); !(c==contlist.end());c++) { SCA_IController* contr = *c;//controllerarray->at(c); diff --git a/source/gameengine/GameLogic/SCA_LogicManager.h b/source/gameengine/GameLogic/SCA_LogicManager.h index 50383879d8f..17971c219e5 100644 --- a/source/gameengine/GameLogic/SCA_LogicManager.h +++ b/source/gameengine/GameLogic/SCA_LogicManager.h @@ -47,7 +47,8 @@ #include "KX_HashedPtr.h" using namespace std; -typedef list<class SCA_IController*> controllerlist; +typedef std::list<class SCA_IController*> controllerlist; +typedef std::map<class SCA_ISensor*,controllerlist > sensormap_t; /** * This manager handles sensor, controllers and actuators. @@ -101,7 +102,7 @@ class SCA_LogicManager set<class SmartActuatorPtr> m_activeActuators; set<class SmartControllerPtr> m_triggeredControllerSet; - map<SCA_ISensor*,controllerlist > m_sensorcontrollermapje; + sensormap_t m_sensorcontrollermapje; // need to find better way for this // also known as FactoryManager... @@ -116,6 +117,9 @@ class SCA_LogicManager public: SCA_LogicManager(); virtual ~SCA_LogicManager(); + // can ONLY be used during scene destruction, avoid massive slow down when scene has many many objects + void RemoveSensorMap(); + //void SetKeyboardManager(SCA_KeyboardManager* keyboardmgr) { m_keyboardmgr=keyboardmgr;} void RegisterEventManager(SCA_EventManager* eventmgr); void RegisterToSensor(SCA_IController* controller, |