[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15884] trunk/blender/source/gameengine: BGE patch: logic optimization part 2: remove inactive sensors from logic manager.

Benoit Bolsee benoit.bolsee at online.be
Wed Jul 30 19:41:54 CEST 2008


Revision: 15884
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15884
Author:   ben2610
Date:     2008-07-30 19:41:47 +0200 (Wed, 30 Jul 2008)

Log Message:
-----------
BGE patch: logic optimization part 2: remove inactive sensors from logic manager.

With this patch, only sensors that are connected to 
active states are actually registered in the logic
manager. Inactive sensors won't take any CPU,
especially the Radar and Near sensors that use a
physical object for the detection: these objects
are removed from the physics engine.

To take advantage of this optimization patch, you
need to define very light idle state when the 
objects are inactive: make them transparent, suspend
the physics, keep few sensors active (e,g a message
sensor to wake up), etc.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ActuatorEventManager.h
    trunk/blender/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_AlwaysEventManager.h
    trunk/blender/source/gameengine/GameLogic/SCA_EventManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_EventManager.h
    trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.h
    trunk/blender/source/gameengine/GameLogic/SCA_KeyboardManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_KeyboardManager.h
    trunk/blender/source/gameengine/GameLogic/SCA_LogicManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_MouseManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_MouseManager.h
    trunk/blender/source/gameengine/GameLogic/SCA_PropertyEventManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_PropertyEventManager.h
    trunk/blender/source/gameengine/GameLogic/SCA_RandomEventManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_RandomEventManager.h
    trunk/blender/source/gameengine/GameLogic/SCA_TimeEventManager.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_TimeEventManager.h
    trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp
    trunk/blender/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_NearSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_NearSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_RayEventManager.cpp
    trunk/blender/source/gameengine/Ketsji/KX_RayEventManager.h
    trunk/blender/source/gameengine/Ketsji/KX_TouchEventManager.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TouchEventManager.h
    trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.cpp
    trunk/blender/source/gameengine/Ketsji/KX_TouchSensor.h
    trunk/blender/source/gameengine/Physics/BlOde/OdePhysicsEnvironment.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
    trunk/blender/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
    trunk/blender/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Scene.cpp
    trunk/blender/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h
    trunk/blender/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2008-07-30 17:41:47 UTC (rev 15884)
@@ -2441,13 +2441,13 @@
 		int layerMask = (groupobj.find(blenderobj) == groupobj.end()) ? activeLayerBitInfo : 0;
 		bool isInActiveLayer = (blenderobj->lay & layerMask)!=0;
 		BL_ConvertSensors(blenderobj,gameobj,logicmgr,kxscene,keydev,executePriority,layerMask,isInActiveLayer,canvas,converter);
+		// set the init state to all objects
+		gameobj->SetInitState((blenderobj->init_state)?blenderobj->init_state:blenderobj->state);
 	}
-	// apply the initial state to controllers
-	for ( i=0;i<logicbrick_conversionlist->GetCount();i++)
+	// apply the initial state to controllers, only on the active objects as this registers the sensors
+	for ( i=0;i<objectlist->GetCount();i++)
 	{
-		KX_GameObject* gameobj = static_cast<KX_GameObject*>(logicbrick_conversionlist->GetValue(i));
-		struct Object* blenderobj = converter->FindBlenderObject(gameobj);
-		gameobj->SetInitState((blenderobj->init_state)?blenderobj->init_state:blenderobj->state);
+		KX_GameObject* gameobj = static_cast<KX_GameObject*>(objectlist->GetValue(i));
 		gameobj->ResetState();
 	}
 

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertSensors.cpp	2008-07-30 17:41:47 UTC (rev 15884)
@@ -733,11 +733,11 @@
 			gameobj->AddSensor(gamesensor);
 			
 			// only register to manager if it's in an active layer
+			// Make registration dynamic: only when sensor is activated
+			//if (isInActiveLayer)
+			//	gamesensor->RegisterToManager();
 			
-			if (isInActiveLayer)
-				gamesensor->RegisterToManager();
 			
-			
 			for (int i=0;i<sens->totlinks;i++)
 			{
 				bController* linkedcont = (bController*) sens->links[i];

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp	2008-07-30 17:41:47 UTC (rev 15884)
@@ -48,19 +48,10 @@
 
 }
 
-
-
-void SCA_ActuatorEventManager::RegisterSensor(SCA_ISensor* sensor)
-{
-	m_sensors.push_back(sensor);
-}
-
-
-
 void SCA_ActuatorEventManager::NextFrame()
 {
 	// check for changed actuator
-	for (vector<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
+	for (set<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
 	{
 		(*it)->Activate(m_logicmgr,NULL);
 	}
@@ -69,7 +60,7 @@
 void SCA_ActuatorEventManager::UpdateFrame()
 {
 	// update the state of actuator before executing them
-	for (vector<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
+	for (set<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
 	{
 		((SCA_ActuatorSensor*)(*it))->Update();
 	}

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ActuatorEventManager.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ActuatorEventManager.h	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ActuatorEventManager.h	2008-07-30 17:41:47 UTC (rev 15884)
@@ -44,7 +44,6 @@
 	virtual ~SCA_ActuatorEventManager();
 	virtual void NextFrame();
 	virtual void UpdateFrame();
-	virtual void	RegisterSensor(SCA_ISensor* sensor);
 	//SCA_LogicManager* GetLogicManager() { return m_logicmgr;}
 };
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp	2008-07-30 17:41:47 UTC (rev 15884)
@@ -51,16 +51,9 @@
 
 void SCA_AlwaysEventManager::NextFrame()
 {
-	for (vector<class SCA_ISensor*>::const_iterator i= m_sensors.begin();!(i==m_sensors.end());i++)
+	for (set<class SCA_ISensor*>::const_iterator i= m_sensors.begin();!(i==m_sensors.end());i++)
 	{
-		SCA_ISensor* sensor = *i;
-		sensor->Activate(m_logicmgr, NULL);
+		(*i)->Activate(m_logicmgr, NULL);
 	}
 }
 
-
-
-void SCA_AlwaysEventManager::RegisterSensor(SCA_ISensor* sensor)
-{
-	m_sensors.push_back(sensor);
-}

Modified: trunk/blender/source/gameengine/GameLogic/SCA_AlwaysEventManager.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_AlwaysEventManager.h	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/GameLogic/SCA_AlwaysEventManager.h	2008-07-30 17:41:47 UTC (rev 15884)
@@ -39,7 +39,6 @@
 public:
 	SCA_AlwaysEventManager(class SCA_LogicManager* logicmgr);
 	virtual void NextFrame();
-	virtual void	RegisterSensor(SCA_ISensor* sensor);
 
 
 };

Modified: trunk/blender/source/gameengine/GameLogic/SCA_EventManager.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_EventManager.cpp	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/GameLogic/SCA_EventManager.cpp	2008-07-30 17:41:47 UTC (rev 15884)
@@ -45,17 +45,14 @@
 {
 }
 
+void SCA_EventManager::RegisterSensor(class SCA_ISensor* sensor)
+{
+	m_sensors.insert(sensor);
+}
 
-
 void SCA_EventManager::RemoveSensor(class SCA_ISensor* sensor)
 {
-	std::vector<SCA_ISensor*>::iterator i =
-	std::find(m_sensors.begin(), m_sensors.end(), sensor);
-	if (!(i == m_sensors.end()))
-	{
-		std::swap(*i, m_sensors.back());
-		m_sensors.pop_back();
-	}
+	m_sensors.erase(sensor);
 }
 
 void SCA_EventManager::NextFrame(double curtime, double fixedtime)

Modified: trunk/blender/source/gameengine/GameLogic/SCA_EventManager.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_EventManager.h	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/GameLogic/SCA_EventManager.h	2008-07-30 17:41:47 UTC (rev 15884)
@@ -30,12 +30,14 @@
 #define __KX_EVENTMANAGER
 
 #include <vector>
+#include <set>
 #include <algorithm>
 
 class SCA_EventManager
 {
 protected:
-	std::vector <class SCA_ISensor*>				m_sensors;
+	// use a set to speed-up insertion/removal
+	std::set <class SCA_ISensor*>				m_sensors;
 
 public:
 	enum EVENT_MANAGER_TYPE {
@@ -61,7 +63,7 @@
 	virtual void	NextFrame();
 	virtual void    UpdateFrame();
 	virtual void	EndFrame();
-	virtual void	RegisterSensor(class SCA_ISensor* sensor)=0;
+	virtual void	RegisterSensor(class SCA_ISensor* sensor);
 	int		GetType();
 
 protected:

Modified: trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/GameLogic/SCA_IObject.cpp	2008-07-30 17:41:47 UTC (rev 15884)
@@ -337,13 +337,32 @@
 
 void SCA_IObject::SetState(unsigned int state)
 {
-	m_state = state;
-	// update the status of the controllers
+	unsigned int tmpstate;
 	SCA_ControllerList::iterator contit;
-	for (contit = m_controllers.begin(); contit != m_controllers.end(); contit++)
+
+	// we will update the state in two steps:
+	// 1) set the new state bits that are 1
+	// 2) clr the new state bits that are 0
+	// This to ensure continuity if a sensor is attached to two states
+	// that are switching state: no need to deactive and reactive the sensor 
+	
+	tmpstate = m_state | state;
+	if (tmpstate != m_state)
 	{
-		(*contit)->ApplyState(m_state);
+		// update the status of the controllers
+		for (contit = m_controllers.begin(); contit != m_controllers.end(); contit++)
+		{
+			(*contit)->ApplyState(tmpstate);
+		}
 	}
+	m_state = state;
+	if (m_state != tmpstate)
+	{
+		for (contit = m_controllers.begin(); contit != m_controllers.end(); contit++)
+		{
+			(*contit)->ApplyState(m_state);
+		}
+	}
 }
 
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ISensor.cpp	2008-07-30 17:41:47 UTC (rev 15884)
@@ -41,7 +41,8 @@
 void	SCA_ISensor::ReParent(SCA_IObject* parent)
 {
 	SCA_ILogicBrick::ReParent(parent);
-	m_eventmgr->RegisterSensor(this);
+	// will be done when the sensor is activated
+	//m_eventmgr->RegisterSensor(this);
 	this->SetActive(false);
 }
 
@@ -133,6 +134,7 @@
 	{
 		// sensor is detached from all controllers, initialize it so that it
 		// is fresh as at startup when it is reattached again.
+		UnregisterToManager();
 		Init();
 	}
 }
@@ -203,6 +205,11 @@
 	m_eventmgr->RegisterSensor(this);
 }
 
+void SCA_ISensor::UnregisterToManager()
+{
+	m_eventmgr->RemoveSensor(this);
+}
+
 void SCA_ISensor::Activate(class SCA_LogicManager* logicmgr,	  CValue* event)
 {
 	

Modified: trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h	2008-07-30 17:22:57 UTC (rev 15883)
+++ trunk/blender/source/gameengine/GameLogic/SCA_ISensor.h	2008-07-30 17:41:47 UTC (rev 15884)
@@ -115,6 +115,8 @@
 	void SetLevel(bool lvl);
 
 	void RegisterToManager();
+	void UnregisterToManager();
+
 	virtual float GetNumber();
 
 	/** Stop sensing for a while. */
@@ -129,7 +131,7 @@
 	void ClrLink()
 		{ m_links = 0; }
 	void IncLink()
-		{ m_links++; }
+		{ if (!m_links++) RegisterToManager(); }
 	void DecLink();
 	bool IsNoLink() const 
 		{ return !m_links; }

Modified: trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_JoystickManager.cpp	2008-07-30 17:22:57 UTC (rev 15883)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list