游戏lua内存优化

  最近由于项目原因,我开始研究lua的回收机制,内存泄漏以及内存优化,于是在网上开始搜寻资料。

  http://www.huomo.cn/developer/article-e8c5.html这篇文章讲述了游戏过程中遇到一些内存泄漏的问题,其中最容易犯的一个问题就是将局部变量声明为一个全局的变量,这样做的话,即使使用了collectgarbage("collect")内存依然不会被回收,里面还谈到了在写游戏逻辑的时候,需要注意到的四个点,其中第二点,我曾今为了找这个问题找了一早上来查一个崩溃bug,原因就是在c++中删除了lua中的某个怪物,而并没有通知lua,所以在写游戏逻辑的时候务必保证c++,lua中的对象删除,添加要一致,lua调用c++的一个create接口,一定要记得不用的时候remove这个对象,否则会造成内存泄漏。

  http://stackoverflow.com/questions/4064451/luas-gc-and-realtime-game这个是stackoverflow 上面关于lua gc的一个问题,介绍了lua手动gc的方法。

  http://lua-users.org/lists/lua-l/2005-09/msg00603.htmlhttp://lua-users.org/lists/lua-l/2005-09/msg00604.html介绍了如何按照lua gc step方式进行垃圾回收。

  http://lua-users.org/lists/lua-l/2008-07/msg00041.html讨论了手动回收内存的方式,以及遇到的一些问题的解释。

  如果一个变量不用的话,记得将其置为nil,相关测试代码如下:   

  print(collectgarbage("count"))

  local tableTest = {}
  for i=1,300 do
    tableTest[#tableTest + 1] = i
  end
  print(collectgarbage("count"))
  print(collectgarbage("collect"))
  print(collectgarbage("count"))
  tableTest = nil --内存清除
  print(collectgarbage("collect"))
  print(collectgarbage("count"))

  运行结果如下: 

  20.3701171875
  28.4306640625
  0
  27.39453125
  0
  19.36328125

  如此看来,不用的内存一定要置为nil啊

  尝试这样内存回收

  collectgarbage("setpause",100)
  collectgarbage("setstepmul",2000)
  collectgarbage("stop")
  print(collectgarbage("count"))
  local tableTest = {}
  for i=1,300 do
    tableTest[#tableTest + 1] = i
  end
  print(collectgarbage("count"))
  -- print(collectgarbage("collect"))
  tableTest = nil --内存清除
  collectgarbage("step",1)
  print(collectgarbage("count"))

原文地址:https://www.cnblogs.com/liyanze/p/4640706.html