天天看点

cocos2dx之内存泄漏解决机制                            cocos2dx之内存泄漏解决机制

                            cocos2dx之内存泄漏解决机制

      大家好,我是Lampard

      今天与大家探讨一下cocos中发生内存泄漏的解决机制

    c++层面的内存泄漏解决

         写项目难免会有内存泄漏情况,对于c++层面的代码来说我们可以使用vld这个ku来进行内存泄漏的判断。具体操作如下:

1.首先下载安装 vld,下载后双击安装

2.在项目c++目录加载链接vld库    

3.找到程序入口main.cpp,添加引用头   #include <vld.h>

4.启动调试——>执行到我检测内存泄漏的页面——>停止调试

        最后定位到造成内存泄漏的代码行,根据游戏逻辑解决即可。

        reference:VS内存泄漏检测之 vld ( cocos2d-x 检测内存泄漏)

  Lua层面的内存泄漏解决

       代码逻辑一般是写在脚本语言中,现在就看看怎么解决lua层面的内存泄漏。

   对代码逻辑不熟悉的情况

       使用云风大大的snapshot 的库,只提供一个函数,用 C 直接调用 lua API 来遍历 lua State​​​​​​​,它可以对当前的 Lua_State 做一个完整的快照。我们可以在不同时间,对 Lua State 拍两个快照,相比较后,就很容易知道新增加的内存处于何处了。

       reference:使用snapshot定位内存泄漏

   对代码逻辑比较熟悉的情况

      通常产生泄漏的都是一些被反复创建的类型,若对代码逻辑比较熟悉,可以定义一个全局的弱表(使其key为弱引用,然后在每次创建那些可能存在泄漏的对象的时候,都放入这个table,让其作为key,value通常我会用当前时间。)由于弱引用的性质,如果其他引用都消失了,那么在弱引用table中对这个对象的引用也会消失(变成nil),反之,只要还有其它任何一个引用存在,这个弱引用表中对这个对象的引用就继续存在。依赖这个特性,当程序已经跑过释放对象的逻辑后,如果这个表中还存在有这个对象的引用,那么这个对象肯定就是泄漏了。

 至此我们的内存泄漏的解决机制已经完成,谢谢大家!!!

继续阅读