forked from bartvdbraak/blender
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:
parent
e13a089d91
commit
07abb9dee2
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user