[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