[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20362] trunk/blender/source/gameengine: BGE: fix memleaks.

Benoit Bolsee benoit.bolsee at online.be
Sat May 23 16:46:43 CEST 2009


Revision: 20362
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20362
Author:   ben2610
Date:     2009-05-23 16:46:43 +0200 (Sat, 23 May 2009)

Log Message:
-----------
BGE: fix memleaks.

SCA_RandomActuator: The random generator was shared between replicas and not deleted. Added ref counting between replicas to allow deletion at the end.
KX_Camera: The scenegraph node was not deleted for temporary cameras (ImageMirror and shadow), causing 500 bytes leak per frame and per shadow light.
KX_GameActuator: Global dictionary buffer was not deleted after saving.
KX_MotionState: The motion state for compound child was not deleted
KX_ReplaceMeshActuator: The mesh was unnecessarily converted for each actuator and not deleted, causing large memleak.

After these fix, YoFrankie runs without memleak.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
    trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h
    trunk/blender/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h
    trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.h
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h
    trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.h
    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
    trunk/blender/source/gameengine/Rasterizer/RAS_MeshObject.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_MeshObject.h
    trunk/blender/source/gameengine/VideoTexture/ImageRender.cpp

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2009-05-23 14:46:43 UTC (rev 20362)
@@ -729,6 +729,8 @@
 	bool skinMesh = false;
 	int lightlayer = blenderobj->lay;
 
+	if ((meshobj = converter->FindGameMesh(mesh/*, ob->lay*/)) != NULL)
+		return meshobj;
 	// Get DerivedMesh data
 	DerivedMesh *dm = CDDM_from_mesh(mesh, blenderobj);
 
@@ -1043,7 +1045,7 @@
 	// pre calculate texture generation
 	for(list<RAS_MeshMaterial>::iterator mit = meshobj->GetFirstMaterial();
 		mit != meshobj->GetLastMaterial(); ++ mit) {
-		mit->m_bucket->GetPolyMaterial()->OnConstruction();
+		mit->m_bucket->GetPolyMaterial()->OnConstruction(lightlayer);
 	}
 
 	if (layers)
@@ -1057,6 +1059,7 @@
 		delete kx_blmat;
 	if (kx_polymat)
 		delete kx_polymat;
+	converter->RegisterGameMesh(meshobj, mesh);
 	return meshobj;
 }
 
@@ -1712,15 +1715,10 @@
 	case OB_MESH:
 	{
 		Mesh* mesh = static_cast<Mesh*>(ob->data);
-		RAS_MeshObject* meshobj = converter->FindGameMesh(mesh, ob->lay);
 		float center[3], extents[3];
 		float radius = my_boundbox_mesh((Mesh*) ob->data, center, extents);
+		RAS_MeshObject* meshobj = BL_ConvertMesh(mesh,ob,rendertools,kxscene,converter);
 		
-		if (!meshobj) {
-			meshobj = BL_ConvertMesh(mesh,ob,rendertools,kxscene,converter);
-			converter->RegisterGameMesh(meshobj, mesh);
-		}
-		
 		// needed for python scripting
 		kxscene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
 	

Modified: trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2009-05-23 14:46:43 UTC (rev 20362)
@@ -550,12 +550,12 @@
 
 
 RAS_MeshObject *KX_BlenderSceneConverter::FindGameMesh(
-									struct Mesh *for_blendermesh,
-									unsigned int onlayer)
+									struct Mesh *for_blendermesh/*,
+									unsigned int onlayer*/)
 {
 	RAS_MeshObject** meshp = m_map_mesh_to_gamemesh[CHashedPtr(for_blendermesh)];
 	
-	if (meshp && onlayer==(*meshp)->GetLightLayer()) {
+	if (meshp/* && onlayer==(*meshp)->GetLightLayer()*/) {
 		return *meshp;
 	} else {
 		return NULL;

Modified: trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h	2009-05-23 14:46:43 UTC (rev 20362)
@@ -115,7 +115,7 @@
 	struct Object *FindBlenderObject(KX_GameObject *for_gameobject);
 
 	void RegisterGameMesh(RAS_MeshObject *gamemesh, struct Mesh *for_blendermesh);
-	RAS_MeshObject *FindGameMesh(struct Mesh *for_blendermesh, unsigned int onlayer);
+	RAS_MeshObject *FindGameMesh(struct Mesh *for_blendermesh/*, unsigned int onlayer*/);
 
 //	void RegisterSumoShape(DT_ShapeHandle shape, RAS_MeshObject *for_gamemesh);
 //	DT_ShapeHandle FindSumoShape(RAS_MeshObject *for_gamemesh);

Modified: trunk/blender/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp	2009-05-23 14:46:43 UTC (rev 20362)
@@ -59,6 +59,7 @@
 SCA_RandomNumberGenerator::SCA_RandomNumberGenerator(long seed) {
 	// int mti = N + 1; /*unused*/
 	m_seed = seed;
+	m_refcount = 1;
 	SetStartVector();
 }
 

Modified: trunk/blender/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h	2009-05-23 14:46:43 UTC (rev 20362)
@@ -36,6 +36,9 @@
 
 class SCA_RandomNumberGenerator {
 
+	/* reference counted for memleak */
+	int m_refcount;
+
 	/** base seed */
 	long m_seed;
 
@@ -56,6 +59,16 @@
 	float DrawFloat();
 	long GetSeed();
 	void SetSeed(long newseed);
+	SCA_RandomNumberGenerator* AddRef()
+	{
+		++m_refcount;
+		return this;
+	}
+	void Release()
+	{
+		if (--m_refcount == 0)
+			delete this;
+	}
 };
 
 #endif /* __KX_RANDOMNUMBERGENERATOR */

Modified: trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.cpp
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.cpp	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.cpp	2009-05-23 14:46:43 UTC (rev 20362)
@@ -50,7 +50,6 @@
   				 PyTypeObject* T)
     : SCA_ISensor(gameobj,eventmgr, T)
 {
-	// m_basegenerator is never deleted => memory leak
 	m_basegenerator = new SCA_RandomNumberGenerator(startseed);
 	Init();
 }
@@ -59,7 +58,7 @@
 
 SCA_RandomSensor::~SCA_RandomSensor() 
 {
-    /* Nothing to be done here. */
+	m_basegenerator->Release();
 }
 
 void SCA_RandomSensor::Init()
@@ -74,13 +73,18 @@
 CValue* SCA_RandomSensor::GetReplica()
 {
 	CValue* replica = new SCA_RandomSensor(*this);
-	// replication copies m_basegenerator pointer => share same generator
 	// this will copy properties and so on...
 	replica->ProcessReplica();
 
 	return replica;
 }
 
+void SCA_RandomSensor::ProcessReplica()
+{
+	SCA_ISensor::ProcessReplica();
+	// increment reference count so that we can release the generator at this end
+	m_basegenerator->AddRef();
+}
 
 
 bool SCA_RandomSensor::IsPositiveTrigger()

Modified: trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.h	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/GameLogic/SCA_RandomSensor.h	2009-05-23 14:46:43 UTC (rev 20362)
@@ -52,6 +52,7 @@
   					PyTypeObject* T=&Type);
 	virtual ~SCA_RandomSensor();
 	virtual CValue* GetReplica();
+	virtual void ProcessReplica();
 	virtual bool Evaluate();
 	virtual bool IsPositiveTrigger();
 	virtual void Init();

Modified: trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2009-05-23 14:46:43 UTC (rev 20362)
@@ -158,14 +158,14 @@
 		mBlenderShader->ReloadMaterial();
 }
 
-void KX_BlenderMaterial::OnConstruction()
+void KX_BlenderMaterial::OnConstruction(int layer)
 {
 	if (mConstructed)
 		// when material are reused between objects
 		return;
 	
 	if(mMaterial->glslmat)
-		SetBlenderGLSLShader();
+		SetBlenderGLSLShader(layer);
 
 	// for each unique material...
 	int i;
@@ -902,10 +902,10 @@
 }
 
 
-void KX_BlenderMaterial::SetBlenderGLSLShader(void)
+void KX_BlenderMaterial::SetBlenderGLSLShader(int layer)
 {
 	if(!mBlenderShader)
-		mBlenderShader = new BL_BlenderShader(mScene, mMaterial->material, m_lightlayer);
+		mBlenderShader = new BL_BlenderShader(mScene, mMaterial->material, layer);
 
 	if(!mBlenderShader->Ok()) {
 		delete mBlenderShader;

Modified: trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h	2009-05-23 14:46:43 UTC (rev 20362)
@@ -97,7 +97,7 @@
 
 	// --------------------------------
 	// pre calculate to avoid pops/lag at startup
-	virtual void OnConstruction( );
+	virtual void OnConstruction(int layer);
 
 	static void	EndFrame();
 
@@ -112,7 +112,7 @@
 	bool			mModified;
 	bool			mConstructed;			// if false, don't clean on exit
 
-	void SetBlenderGLSLShader();
+	void SetBlenderGLSLShader(int layer);
 
 	void ActivatGLMaterials( RAS_IRasterizer* rasty )const;
 	void ActivateTexGen( RAS_IRasterizer *ras ) const;

Modified: trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp	2009-05-23 14:46:43 UTC (rev 20362)
@@ -42,6 +42,7 @@
 					 SG_Callbacks callbacks,
 					 const RAS_CameraData& camdata,
 					 bool frustum_culling,
+					 bool delete_node,
 					 PyTypeObject *T)
 					:
 					KX_GameObject(sgReplicationInfo,callbacks,T),
@@ -50,7 +51,8 @@
 					m_normalized(false),
 					m_frustum_culling(frustum_culling),
 					m_set_projection_matrix(false),
-					m_set_frustum_center(false)
+					m_set_frustum_center(false),
+					m_delete_node(delete_node)
 {
 	// setting a name would be nice...
 	m_name = "cam";
@@ -64,6 +66,12 @@
 
 KX_Camera::~KX_Camera()
 {
+	if (m_delete_node && m_pSGNode)
+	{
+		// for shadow camera, avoids memleak
+		delete m_pSGNode;
+		m_pSGNode = NULL;
+	}
 }	
 
 
@@ -77,6 +85,13 @@
 	return replica;
 }
 
+void KX_Camera::ProcessReplica()
+{
+	KX_GameObject::ProcessReplica();
+	// replicated camera are always registered in the scene
+	m_delete_node = false;
+}
+
 MT_Transform KX_Camera::GetWorldToCamera() const
 { 
 	MT_Transform camtrans;

Modified: trunk/blender/source/gameengine/Ketsji/KX_Camera.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Camera.h	2009-05-23 14:40:36 UTC (rev 20361)
+++ trunk/blender/source/gameengine/Ketsji/KX_Camera.h	2009-05-23 14:46:43 UTC (rev 20362)
@@ -113,6 +113,11 @@
 	bool         m_set_frustum_center;
 
 	/**
+	 * whether the camera should delete the node itself (only for shadow camera)
+	 */
+	bool		 m_delete_node;
+
+	/**
 	 * Extracts the camera clip frames from the projection and world-to-camera matrices.
 	 */
 	void ExtractClipPlanes();
@@ -138,7 +143,7 @@
 
 	enum { INSIDE, INTERSECT, OUTSIDE } ;
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list