[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14035] trunk/blender/source/gameengine/ Rasterizer: BGE memleak fix: OpenGL Display Lists not deleted when switching scene

Benoit Bolsee benoit.bolsee at online.be
Sun Mar 9 23:02:34 CET 2008


Revision: 14035
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14035
Author:   ben2610
Date:     2008-03-09 23:02:32 +0100 (Sun, 09 Mar 2008)

Log Message:
-----------
BGE memleak fix: OpenGL Display Lists not deleted when switching scene

This fix also improves performance of Display List for replica objects: Display List ID caching is now enabled for replica objects which avoids a tree search on each frame and for each replica.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.h
    trunk/blender/source/gameengine/Rasterizer/RAS_MeshObject.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp	2008-03-09 21:51:38 UTC (rev 14034)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp	2008-03-09 22:02:32 UTC (rev 14035)
@@ -69,6 +69,11 @@
 	return result;
 }
 
+KX_MeshSlot::~KX_MeshSlot()
+{
+	if (m_DisplayList)
+		m_DisplayList->Release();
+}
 
 
 RAS_MaterialBucket::RAS_MaterialBucket(RAS_IPolyMaterial* mat)

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.h	2008-03-09 21:51:38 UTC (rev 14034)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.h	2008-03-09 22:02:32 UTC (rev 14035)
@@ -69,10 +69,21 @@
  */
 class KX_ListSlot
 {
+protected:
+	int m_refcount;
 public:
-	KX_ListSlot(){}
-	virtual ~KX_ListSlot(){}
-
+	KX_ListSlot(){ m_refcount=1; }
+	virtual ~KX_ListSlot() {}
+	virtual int Release() { 
+		if (--m_refcount > 0)
+			return m_refcount;
+		delete this;
+		return 0;
+	}
+	virtual KX_ListSlot* AddRef() {
+		m_refcount++;
+		return this;
+	}
 	virtual void SetModified(bool mod)=0;
 };
 
@@ -96,7 +107,7 @@
 		m_DisplayList(0)
 	{
 	}
-	~KX_MeshSlot(){}
+	~KX_MeshSlot();
 	bool					Less(const KX_MeshSlot& lhs) const;
 };
 

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_MeshObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_MeshObject.cpp	2008-03-09 21:51:38 UTC (rev 14034)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_MeshObject.cpp	2008-03-09 22:02:32 UTC (rev 14035)
@@ -474,7 +474,9 @@
 	{
 		KX_ArrayOptimizer** ao = m_matVertexArrayS.at(i);
 		if (ao)
+		{
 			delete *ao;
+		}
 	}
 }
 

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp	2008-03-09 21:51:38 UTC (rev 14034)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp	2008-03-09 22:02:32 UTC (rev 14035)
@@ -25,13 +25,23 @@
 #define spit(x)
 //#endif
 
-RAS_ListSlot::RAS_ListSlot()
+RAS_ListSlot::RAS_ListSlot(RAS_ListRasterizer* rasty)
 :	KX_ListSlot(),
 	m_flag(LIST_MODIFY|LIST_CREATE),
-	m_list(0)
+	m_list(0),
+	m_rasty(rasty)
 {
 }
 
+int RAS_ListSlot::Release()
+{
+	if (--m_refcount > 0)
+		return m_refcount;
+	m_rasty->RemoveListSlot(this);
+	delete this;
+	return 0;
+}
+
 RAS_ListSlot::~RAS_ListSlot()
 {
 	RemoveList();
@@ -108,6 +118,18 @@
 	ReleaseAlloc();
 }
 
+void RAS_ListRasterizer::RemoveListSlot(RAS_ListSlot* list)
+{
+	RAS_Lists::iterator it = mLists.begin();
+	while(it != mLists.end()) {
+		if (it->second == list) {
+			mLists.erase(it);
+			break;
+		}
+		it++;
+	}
+}
+
 RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(const vecVertexArray& vertexarrays, KX_ListSlot** slot)
 {
 	/*
@@ -120,10 +142,10 @@
 	if(!localSlot) {
 		RAS_Lists::iterator it = mLists.find(vertexarrays);
 		if(it == mLists.end()) {
-			localSlot = new RAS_ListSlot();
+			localSlot = new RAS_ListSlot(this);
 			mLists.insert(std::pair<vecVertexArray, RAS_ListSlot*>(vertexarrays, localSlot));
 		} else {
-			localSlot = it->second;
+			localSlot = static_cast<RAS_ListSlot*>(it->second->AddRef());
 		}
 	}
 	MT_assert(localSlot);
@@ -157,8 +179,12 @@
 	if(!useObjectColor) {
 		localSlot = FindOrAdd(vertexarrays, slot);
 		localSlot->DrawList();
-		if(localSlot->End()) 
+		if(localSlot->End()) {
+			// save slot here too, needed for replicas and object using same mesh
+			// => they have the same vertexarray but different mesh slot
+			*slot = localSlot;
 			return;
+		}
 	}
 	
 	if (mUseVertexArrays) {
@@ -201,8 +227,12 @@
 		localSlot = FindOrAdd(vertexarrays, slot);
 		localSlot->DrawList();
 
-		if(localSlot->End()) 
+		if(localSlot->End()) {
+			// save slot here too, needed for replicas and object using same mesh
+			// => they have the same vertexarray but different mesh slot
+			*slot = localSlot;
 			return;
+		}
 	}
 
 	if (mUseVertexArrays) {

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h	2008-03-09 21:51:38 UTC (rev 14034)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h	2008-03-09 22:02:32 UTC (rev 14035)
@@ -5,14 +5,17 @@
 #include "RAS_VAOpenGLRasterizer.h"
 #include <vector>
 
+class RAS_ListRasterizer;
 class RAS_ListSlot : public KX_ListSlot
 {
 	unsigned int m_list;
 	unsigned int m_flag;
+	RAS_ListRasterizer* m_rasty;
 public:
-	RAS_ListSlot();
+	RAS_ListSlot(RAS_ListRasterizer* rasty);
 	virtual ~RAS_ListSlot();
 	virtual void SetModified(bool mod);
+	virtual int Release();
 
 	void RemoveList();
 	void DrawList();
@@ -42,6 +45,7 @@
 	void ReleaseAlloc();
 
 public:
+	void RemoveListSlot(RAS_ListSlot* list);
 	RAS_ListRasterizer(RAS_ICanvas* canvas, bool useVertexArrays=false, bool lock=false);
 	virtual ~RAS_ListRasterizer();
 





More information about the Bf-blender-cvs mailing list