[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20022] trunk/blender/source/gameengine: BGE performance:

Benoit Bolsee benoit.bolsee at online.be
Fri May 1 22:34:24 CEST 2009


Revision: 20022
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20022
Author:   ben2610
Date:     2009-05-01 22:34:23 +0200 (Fri, 01 May 2009)

Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp

Modified: trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.cpp	2009-05-01 19:02:23 UTC (rev 20021)
+++ trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.cpp	2009-05-01 20:34:23 UTC (rev 20022)
@@ -79,6 +79,13 @@
 	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::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 @@
 {
 	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 @@
 	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 @@
 	!(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);

Modified: trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.h	2009-05-01 19:02:23 UTC (rev 20021)
+++ trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.h	2009-05-01 20:34:23 UTC (rev 20022)
@@ -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 @@
 	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 @@
 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,

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-05-01 19:02:23 UTC (rev 20021)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-05-01 20:34:23 UTC (rev 20022)
@@ -628,6 +628,8 @@
 {
 	if (GetSGNode()) {
 		m_bVisible = v;
+		if (m_pGraphicController)
+			m_pGraphicController->Activate(m_bVisible);
 		if (recursive)
 			setVisible_recursive(GetSGNode(), v);
 	}

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2009-05-01 19:02:23 UTC (rev 20021)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2009-05-01 20:34:23 UTC (rev 20022)
@@ -208,6 +208,8 @@
 	// It's still there but we remove all properties here otherwise some
 	// reference might be hanging and causing late release of objects
 	RemoveAllDebugProperties();
+	// early removal of sensor map to avoid massive slow down when there are many objects
+	m_logicmgr->RemoveSensorMap();
 
 	while (GetRootParentList()->GetCount() > 0) 
 	{





More information about the Bf-blender-cvs mailing list