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.
This commit is contained in:
Benoit Bolsee 2009-05-01 20:34:23 +00:00
parent e13a089d91
commit 07abb9dee2
5 changed files with 32 additions and 13 deletions

@ -79,6 +79,13 @@ SCA_LogicManager::~SCA_LogicManager()
m_activeActuators.clear(); 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. // 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) void SCA_LogicManager::RemoveSensor(SCA_ISensor* sensor)
{ {
controllerlist contlist = m_sensorcontrollermapje[sensor]; sensormap_t::const_iterator mit = m_sensorcontrollermapje.find(sensor);
if (mit != m_sensorcontrollermapje.end())
{
const controllerlist& contlist = mit->second;
for (controllerlist::const_iterator c= contlist.begin();!(c==contlist.end());c++) for (controllerlist::const_iterator c= contlist.begin();!(c==contlist.end());c++)
{ {
(*c)->UnlinkSensor(sensor); (*c)->UnlinkSensor(sensor);
} }
m_sensorcontrollermapje.erase(sensor); m_sensorcontrollermapje.erase(sensor);
}
sensor->UnregisterToManager(); sensor->UnregisterToManager();
} }
@ -184,7 +195,7 @@ void SCA_LogicManager::RemoveController(SCA_IController* controller)
{ {
controller->UnlinkAllSensors(); controller->UnlinkAllSensors();
controller->UnlinkAllActuators(); controller->UnlinkAllActuators();
std::map<SCA_ISensor*,controllerlist>::iterator sit; sensormap_t::iterator sit;
for (sit = m_sensorcontrollermapje.begin();!(sit==m_sensorcontrollermapje.end());++sit) for (sit = m_sensorcontrollermapje.begin();!(sit==m_sensorcontrollermapje.end());++sit)
{ {
(*sit).second.remove(controller); (*sit).second.remove(controller);
@ -197,10 +208,10 @@ void SCA_LogicManager::RemoveDestroyedActuator(SCA_IActuator* actuator)
m_removedActuators.push_back(SmartActuatorPtr(actuator,0)); m_removedActuators.push_back(SmartActuatorPtr(actuator,0));
// take care that no controller can use this actuator again ! // 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) 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++) for (list<SCA_IController*>::const_iterator c= contlist.begin();!(c==contlist.end());c++)
{ {
(*c)->UnlinkActuator(actuator); (*c)->UnlinkActuator(actuator);
@ -237,7 +248,7 @@ void SCA_LogicManager::BeginFrame(double curtime, double fixedtime)
!(is==m_activatedsensors.end());is++) !(is==m_activatedsensors.end());is++)
{ {
SCA_ISensor* sensor = *is; SCA_ISensor* sensor = *is;
controllerlist contlist = m_sensorcontrollermapje[sensor]; const controllerlist& contlist = m_sensorcontrollermapje[sensor];
for (list<SCA_IController*>::const_iterator c= contlist.begin(); for (list<SCA_IController*>::const_iterator c= contlist.begin();
!(c==contlist.end());c++) !(c==contlist.end());c++)
{ {

@ -47,7 +47,8 @@
#include "KX_HashedPtr.h" #include "KX_HashedPtr.h"
using namespace std; 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. * This manager handles sensor, controllers and actuators.
@ -101,7 +102,7 @@ class SCA_LogicManager
set<class SmartActuatorPtr> m_activeActuators; set<class SmartActuatorPtr> m_activeActuators;
set<class SmartControllerPtr> m_triggeredControllerSet; set<class SmartControllerPtr> m_triggeredControllerSet;
map<SCA_ISensor*,controllerlist > m_sensorcontrollermapje; sensormap_t m_sensorcontrollermapje;
// need to find better way for this // need to find better way for this
// also known as FactoryManager... // also known as FactoryManager...
@ -116,6 +117,9 @@ class SCA_LogicManager
public: public:
SCA_LogicManager(); SCA_LogicManager();
virtual ~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 SetKeyboardManager(SCA_KeyboardManager* keyboardmgr) { m_keyboardmgr=keyboardmgr;}
void RegisterEventManager(SCA_EventManager* eventmgr); void RegisterEventManager(SCA_EventManager* eventmgr);
void RegisterToSensor(SCA_IController* controller, void RegisterToSensor(SCA_IController* controller,

@ -628,6 +628,8 @@ KX_GameObject::SetVisible(
{ {
if (GetSGNode()) { if (GetSGNode()) {
m_bVisible = v; m_bVisible = v;
if (m_pGraphicController)
m_pGraphicController->Activate(m_bVisible);
if (recursive) if (recursive)
setVisible_recursive(GetSGNode(), v); setVisible_recursive(GetSGNode(), v);
} }

@ -287,11 +287,11 @@ public:
/** /**
* Gets the maximum number of logic frame before render frame * Gets the maximum number of logic frame before render frame
*/ */
static int KX_KetsjiEngine::GetMaxLogicFrame(); static int GetMaxLogicFrame();
/** /**
* Sets the maximum number of logic frame before render frame * Sets the maximum number of logic frame before render frame
*/ */
static void KX_KetsjiEngine::SetMaxLogicFrame(int frame); static void SetMaxLogicFrame(int frame);
/** /**
* Gets the framerate for playing animations. (actions and ipos) * Gets the framerate for playing animations. (actions and ipos)

@ -208,6 +208,8 @@ KX_Scene::~KX_Scene()
// It's still there but we remove all properties here otherwise some // It's still there but we remove all properties here otherwise some
// reference might be hanging and causing late release of objects // reference might be hanging and causing late release of objects
RemoveAllDebugProperties(); RemoveAllDebugProperties();
// early removal of sensor map to avoid massive slow down when there are many objects
m_logicmgr->RemoveSensorMap();
while (GetRootParentList()->GetCount() > 0) while (GetRootParentList()->GetCount() > 0)
{ {