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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to