加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2014-09-11 14:57:12)
标签:

转载

分类: C/CPP

91通天塔采用TQFramework(C3)手游框架提供的LUA框架进行全LUA游戏开发,在后期内存优化时,发现游戏有内存泄漏。于是遍历LUA代码,把所有用到new, create等等的地方都检查了,然后用完没释放的都进行释放。改了2天,以为OK了, 游戏开起来再挂着,发现还是有内存泄漏。

 

于是又跟踪了好久,感觉是LUA框架有问题。于是用LUA自带的内存观察collectgarbage("count")打印出来,

    print("@@@memory", collectgarbage("count"))

左边是经过的时间,右边是LUA占用的内存:

 

http://s11/mw690/a17b071ctx6DgFbrPzYba&690

从上面大概可以看出内存增长有规律:

前面5秒增加22K,然后过10秒变成增加50K,然后过20秒变成增加100K,然后过40秒增加200K。。。。。(数值取大概)

 (collectgarbage("collect"): 显式进行内存回收)

原因分析

 

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了:

http://s12/mw690/a17b071ctx6DgFiICHp3b&690

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有