[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