`
colen
  • 浏览: 62591 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

游戏逻辑层在Lua中的内存泄漏与防范

阅读更多

Lua会造成内存泄露的表征分析:

#因素一:(实例型)实体资源的创建持有者和调用者,相互之间如果太过信任,那么对调用者就会形成过高的要求,创建者可以让任意的调用者进行任意的create,调用者消费后以为创建者会管理(销毁),但其实并非如此,比如有这样一个实体管理器xxxManager,它有接口createXXX/removeXXX, 那么,创建和销毁的权利都丢给了调用者,如果调用者光create而不remove,那么,xxxManager就会产生越来越多的xxx(xxx可真多丫),从而产生了内存泄露

#因素二:逻辑层的角色数据如果没有跟随角色,将会导致前者和后者在生命周期上非不严格对应, 或者说角色对自己的数据的持有太松散,这样,如果角色在玩家下线后,即使被roleManager销毁了,但它所对应的数据,并没有得到销毁, 这样,也产生了泄露

#因素三:singleton单实例对象,本身是在内存中持久存在的, 这样,从内存泄露的角度上看,它们对数据的持有的风险是很高的, 如果它们中的任意一个,有这样的一个接口addPlayer(player), 而在player下线时也没有进行即时的清除, 那么,泄露又产生了

#因素四:如果框架层接口太过于开放的话,也会给脚本层lua带来泄露的风险, 最典型的比如计时器,lua的某个方法启动了一个计时器而又忘了关掉它, 这就麻烦了.

因此, 虽然lua有gc,但是脚本中的游戏逻辑层,也会产生内存泄露,并且,泄露还很容易,泄露的地方还很多

根源是什么?

这究竟是怎么回事呢? 由于以上的泄露,其实都是逻辑泄露(跟c/c++的泄露本质不同),那么我们可以从设计上,来探根源:

#每个层自身职责的定义如果不够严谨,它们之间存在一些不必要的耦合的话,这里表现为(框架)层与(脚本)层,(实体)层与(逻辑)层,(全局资源层)与(逻辑)层,以上的泄露就很容易产生, 举个简单例子:实体由实体层管理持有, 而逻辑层(在任何一个接口)却能直接的去创建,或者销毁一个资源实体,实体的生命横跨实体层和逻辑层, 生命周期发生了外泄, on the other hand,从设计的角度书,就是实体让两个层产生了耦合!

#实体资源本应该有的强依赖关系没有建立起来, 在游戏中最重要的就是角色和角色数据(比如任务),material,task,等,本身并不能独立存在,它们的生命周期完全依赖于角色的生命周期(原型数据除外),所以,必须理清所有的实体的生命周期,已经它们之间的联系,该强耦合的强耦合.

#对逻辑层singleton的全局性对象持有实体资源的风险意识不够,根据上面一条,逻辑层全局子系统不能够直接持有任何一个实体(即使是原型).

设计上怎么做?

也就是说,我们在搭建脚本层的游戏框架上的时候,就首先对内存泄露有足够和清醒的认识, 在设计上, 做出更好的规划,让脚本层更健壮, 针对以上的原因,我们很容易的,有这样的做法:

#实体管理器如果是本身持有了实体,那么,就不应该开发create/remove接口,而是选择直接

#所有实体资源,主要是目前的玩家逻辑数据, 必须直接帮在role上,确保role的销毁比如会引发它们的销毁

#全局资源性的数据,可以考虑放在weak table中

监测机制的产生?

监测,就是必须存在这样一个机制:我们能够利用某些接口/命令,清晰全面的得知脚本层在是否存在,在哪里存在内存泄漏.毕竟,逻辑型泄漏的代码,很容易就可以写出来并且不能100%的杜绝,建立起这样一个机制,在分析游戏服务器端的健壮性,稳定性上,都是很有帮助的.

#计数法. 在垃圾收集中,计数法是比较原始的算法, 效率低,不能解决循环引用. 不过,如果我们把它用在实体管理器与实体,主实体与非主实体上,有可能可行,因为,这些对象间,并没有产生循环引用,另外,我们也通过在不同类型的类上采用不同的时间间距,来达到比较好的性能. 也就是说,引入计数法,即可监测,其实还可以做垃圾收集

#对全局资源, 可以考虑引入mark-sweep算法/复制算法来管理,

如何让垃圾收集更加的高效?

lua gc 采用mark-sweep算法, 效率不高,并且好像没有看到有自己回收的地方, 如果在游戏应用层调用collectgarbage("collect"),不可避免会影响服务器的性能,所以, 我们可以对lua中的模块进行(javaGC类似的)分代, 不同代的数据使用不同的保存,封装和清除策略,保证在最大效率的情况下准确的完成垃圾收集!

BTW,这里有另一篇对Lua的内存泄露文章,供大家开阔视野:

Lua内存泄露与查找

0
0
分享到:
评论

相关推荐

    Lua内存泄露检测工具LuaMonitor下载.rar

    Lua内存泄露检测工具LuaMonitor下载.rar 对于Lua的性能检测提供良好的视图分析 可以获取当前内存图,方便对应项目的内存管理 可以获取热点函数相关信息

    Lua脚本在游戏引擎中的应用

    Lua是一种免费、开放的中间代码型的脚本语言,作者在研究了它的结构和 特点的基础上,对Lua运行环境中的堆栈结构进行了分析,由于引擎与Lua脚本 均能够操作堆栈中的数据,因此通过把堆栈作为两者信息传递的中间层,...

    在你的游戏中应用LUA

    在你的游戏中应用LUA 在游戏开发中,使用脚本语言可以提高游戏的灵活性和可扩展性,其中LUA是一种常用的脚本语言。下面我们来探讨如何在游戏中应用LUA。 首先,我们需要了解LUA的基本概念和使用方法。LUA是一种轻...

    lua server 实现了lua脚本处理服务端逻辑+数据库

    《终极网络服务端编程》的lua server 实现了lua脚本处理服务端逻辑+数据库 lua服务端 c++版服务端客户端(netserver,netclient) lua服务端 就是 c++ netserver项目的lua脚本化版 运行效果 ![image]...

    lua游戏开发实践指南源码

    它完美地展示了在游戏开发和设计中使用Lua的各种技术细节以及常用的方法与技巧,同时包含大量可操作性极强的实例,无论你是有一定Lua基础的游戏开发者,还是Lua的初学者,本书都能让你领略到Lua的强大魅力。

    游戏引擎以Lua脚本驱动的经典扫雷游戏(加壳版)

    4、Lua/MyMine/MyGame.lua中含有完整扫雷游戏算法(作者自主设计开发) 其它说明: 1、本例程仅供用于为广大Lua语言追随者提供入门学习资料 2、本例程Lua相关程序与算法非开源作品,未经作者本人允许,请勿用于...

    一个用lua写的游戏脚本实例

    一个用lua写的游戏脚本实例,是word格式的,值得一看,通过这个例子你可以了解到游戏中的脚本是怎么写的

    简约游戏引擎 Android游戏引擎 java游戏引擎 lua游戏引擎

    Android游戏引擎 里面是个eclipse工程 倒入之后进行相关配置 即可调试运行 游戏逻辑采用lua 编写lua代码即可作游戏 游戏函数调用请查看源代码 hyperbolic类 顺便一提 lua代码支持中文 英文差的朋友别担心哦 有不懂的...

    Lua游戏开发实践指南教学.pdf 完整版

    Lua游戏开发实践指南教学.pdf 完整版

    Lua游戏开发指南

    《Lua游戏开发实践指南》全书一共15章:第1~3章简单地介绍了Lua语言的特性、授权,以及在游戏开发中的强大用途;第4~5章详细讲解了Lua语言的基本语法和核心要素;第6~7章讲解了Lua与C/C++程序的整合以及与C++的交互...

    游戏引擎以Lua脚本驱动的经典扫雷游戏

    4、Lua/MyMine/MyGame.lua中含有完整扫雷游戏算法(作者自主设计开发) 其它说明: 1、本例程仅供用于为广大Lua语言追随者提供入门学习资料 2、本例程Lua相关程序与算法非开源作品,未经作者本人允许,请勿用于商业...

    2048 源码 lua 逻辑实现

    2048 源码 lua 逻辑实现

    Lua游戏开发实践指南

    Lua游戏开发实践指南

    Lua中文教程pdf+LuaForWindows

    Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。5.0.2版的Lua的内核小于120KB。 分享一个Lua语言的中文pdf文档,有书签的,里面还有lua的运行环境,希望更多的人可以来学习Lua这一优美小巧的语言...

    lua注入学习的好东西

    如果游戏使用lua,就可以用它注入游戏,调用运行游戏注册过的lua函数或字符串

    基于串口屏LUA脚本—逻辑运算以及字符处理功能V1.0

    本文将介绍如何使用 LUA 脚本在串口屏中实现简单的逻辑运算以及字符处理,本文中部分使用的运算函数和字符处理函数来自于 LUA 的 math 库和 string 库,使用这些函数时可以借助网上的资料了解使用方法。

    游戏脚本语言lua中文教程

    lua中文教程 很好很强大的游戏脚本语言很值得学习

    Lua游戏脚本语言入门

    在 Lua 中,可以使用单行注释和多行注释。单行注释使用两个减号"--",从注释开始一直延续到行末为止,相当于 C++ 语言中的"//"。多行注释使用"--[["和"]]“,注释开始和结束,相当于 C 语言中的"/*…*/"。在注释中,...

    lua-小游戏

    lua小游戏

    Lua中文教程,高清PDF文档

    Lua中文教程,高清PDF文档,官方发布

Global site tag (gtag.js) - Google Analytics