Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Bolsee <benoit.bolsee@online.be>2009-05-02 00:34:23 +0400
committerBenoit Bolsee <benoit.bolsee@online.be>2009-05-02 00:34:23 +0400
commit07abb9dee2aba5ed161c22f3ec45031f9fdb183a (patch)
tree83740cfff96b12a6240d1e5ceee5f1594e43c984 /source/gameengine/GameLogic
parente13a089d918cbe3709f544ccebbb718a452ac6fa (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.cpp29
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.h8
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,