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内存泄露与查找
相关推荐
它提供了一个直观的视图分析界面,帮助开发者了解程序在运行过程中内存的使用情况,以便及时发现和修复内存泄露问题。通过使用LuaMonitor,开发者可以更有效地管理和优化项目内存。 首先,让我们了解一下内存泄露的...
"游戏脚本设计与实现" ...从提供的游戏脚本实例中,我们可以了解到游戏脚本设计的基本结构、游戏任务的设计、游戏机制的实现、游戏逻辑的编写、lua语言在游戏脚本中的应用、游戏脚本的优化和游戏脚本的测试等知识点。
尤其是在游戏引擎(如Cocos2d-x、Corona SDK等)中,Lua被广泛用作脚本来编写游戏逻辑,而底层图形渲染和物理模拟则通常由C++等编译型语言处理。 ### Lua在游戏开发中的应用 #### 1. 游戏逻辑编写 - **事件驱动...
对于游戏逻辑,Lua提供了丰富的控制流语句,如if-then-else、for循环和while循环,以及函数定义,使得开发者能够灵活地构建游戏规则。同时,Lua支持闭包,这对于实现回调函数和异步操作非常有用。 在游戏性能优化...
2. 内存管理:Lua具有自动垃圾回收机制,但在大型游戏开发中,合理的内存管理仍然至关重要,开发者需要注意避免内存泄漏。 六、扩展与优化 1. 模块化:飞机大战源码可能采用了模块化设计,将游戏的不同部分(如游戏...
在游戏引擎的应用中,Lua可以轻松地与游戏引擎进行通信,利用Lua的堆栈来传递信息,并实现引擎与Lua脚本间的函数互调,从而达到控制游戏逻辑的目的。 在实现Lua脚本与游戏引擎的集成时,关键是构建一个有效的通信和...
2. Lua与游戏逻辑:Lua在游戏中主要负责处理游戏逻辑,如角色行为、碰撞检测、AI算法等。通过学习如何在Lua中编写这些逻辑,你可以更好地理解游戏的核心运作机制。 3. 脚本系统集成:了解如何将Lua脚本与C++或C#等...
《lua版的雷电游戏》是一款基于Lua编程语言开发的飞行射击类游戏,它展示了Lua在游戏开发中的强大应用。Lua是一种轻量级的脚本语言,因其简洁、高效的特性,常被用作游戏的逻辑层或配置文件解析。在这个项目中,...
理解这些基础是掌握Lua的关键,因为它们构成了编写游戏逻辑的基础。 “4.通过例子学习Lua.txt”提供了一种实践性的学习方法,通过实际的代码示例来教授Lua语言。这种方式可以帮助学习者更好地理解和应用所学知识,...
在压缩包中的“lua”文件,可能是包含游戏逻辑的脚本文件,或者是一个包含多个Lua脚本的目录。通常,每个脚本会对应游戏中的一个特定功能或组件,例如角色控制、碰撞检测、游戏得分计算等。 总结来说,"lua-小游戏...
4. **内存管理**:由于C++和Lua有不同的内存管理机制,中间层需要处理对象的生命周期,确保对象在适当的时候被创建、销毁,防止内存泄漏。 5. **异常处理**:C++的异常机制与Lua的错误处理方式不同,中间层需要将...
文件"logic.lua"是整个游戏逻辑的核心。在lua中,我们可能首先定义一个棋盘数据结构,通常会使用二维数组来表示。每个数组元素对应棋盘上的一格,存储着该位置的数字或者为空。游戏开始时,棋盘上随机两个位置会初始...
C#以其强大的类型系统和.NET框架的支持,而Lua则以其轻量级、高性能和易于嵌入的特点,两者结合可以实现灵活的游戏逻辑和高效的数据处理。本例程“C#与Lua交互的例程”旨在演示如何通过LuaInterface库实现C#与Lua的...
- Lua垃圾回收机制:理解如何避免内存泄漏,特别是在与C++交互时。 - Lua闭包和元表:掌握这两项高级特性,能够编写更灵活的代码。 - 性能优化:学习如何在Lua中编写高效的代码,避免不必要的性能开销。 通过...
3. 生命周期管理:确保在C++中管理好Lua对象的生命周期,避免资源泄露。 通过以上方法,你可以有效地在C++项目中集成Lua,利用Lua的灵活性编写可扩展的脚本,同时也能通过C++调用已有的功能,实现两者的无缝结合。...
Lua因其轻量级和灵活性,在游戏开发中广泛使用,常作为游戏逻辑和AI的脚本语言。开发者可以用Lua编写游戏规则、AI行为、界面交互等,与游戏引擎的C++部分紧密结合。 **教程资源** 提供的"Lua中文教程"高清PDF文档...
在你的游戏中应用LUA 在游戏开发中,使用脚本语言可以提高游戏的灵活性和可扩展性,其中LUA是一种常用的脚本语言。下面我们来探讨如何在游戏中应用LUA。 首先,我们需要了解LUA的基本概念和使用方法。LUA是一种轻...
《终极网络服务端编程》的lua server 实现了lua脚本处理服务端逻辑+数据库 lua服务端 c++版服务端客户端(netserver,netclient) lua服务端 就是 c++ netserver项目的lua脚本化版 运行效果 ![image]...
在游戏开发中,Lua常常作为游戏逻辑和用户界面的控制层,而游戏的核心部分则由更底层的语言编写,以保证性能。 “lua注入”是指在游戏运行时,通过某种方式将自定义的Lua代码插入到游戏中,使得可以调用游戏已经...
5. **C接口**:Lua提供了丰富的C API,允许与C/C++等编译型语言进行无缝集成,游戏开发者通常使用Lua作为游戏逻辑层的脚本语言,而将底层性能敏感的部分用C++实现。 6. **面向过程和函数式编程**:Lua支持面向过程...