[转载]使用LUA开发游戏,发现内存耗费成倍增长

标签:
转载 |
分类: C/CPP |
91通天塔采用TQFramework(C3)手游框架提供的LUA框架进行全LUA游戏开发,在后期内存优化时,发现游戏有内存泄漏。于是遍历LUA代码,把所有用到new, create等等的地方都检查了,然后用完没释放的都进行释放。改了2天,以为OK了, 游戏开起来再挂着,发现还是有内存泄漏。
于是又跟踪了好久,感觉是LUA框架有问题。于是用LUA自带的内存观察collectgarbage("count")打印出来,
左边是经过的时间,右边是LUA占用的内存:
http://s11/mw690/a17b071ctx6DgFbrPzYba&690
从上面大概可以看出内存增长有规律:
前面5秒增加22K,然后过10秒变成增加50K,然后过20秒变成增加100K,然后过40秒增加200K。。。。。(数值取大概)
原因分析
C3手游框架里面的LUA框架是参照COCOS2D-X提供的LUA框架的,因此我到cocos2d-x官网下了SDK,运行看下helloLua的内存消耗情况。
但是跑起来很OK,挂了半个小时,一直在30M左右上下浮动~
看来是我们自己改造的LUA框架有问题
于是百度,GOOGLE,主要现象是内存成倍增长,但是都没发现类似情况~
于是只好自己分析。
内存随着时间成倍增加,这个感觉应该是和堆栈分配有关系,但是看我们LUA框架代码,大部分用到LUA地方都有进行释放了呀。。。
挨个对照COCOS2D-X提供的LUA框架和我们的LUA框架,发现在一般的方法,比如执行字符串,执行文件,等等ExecuteString,ExecuteScriptFile,ExecuteGlobalFunction函数写法都一样,于是范围缩小到我们自己写的几个函数里面。我们自己封装的执行对话框内部函数ExecuteTableFunction,GetTableFuntion等几个,仔细阅读代码后,终于发现问题了:
1)堆栈用完没有及时恢复
2)没有及时使用垃圾回收
1)在函数异常返回或者正常处理返回时,堆栈要进行恢复:
lua_pop(L, 1);
//
lua_settop(L, 0);
2)在调用lua_pcall()时,要调用lua_gc(L, LUA_GCCOLLECT, 0);进行垃圾回收;
在这些修改后,重新进行编译运行,这个时候再打印内存,发现就很OK了: