Lua优化:破解全局变量的使用困局

本文深入探讨Lua中的全局变量,解释其模拟实现及潜在危害,包括内存泄漏和线程安全问题。UWA的本地资源检测服务提供对全局变量使用的规则,建议限制全局变量的使用以提高代码质量。文章还列举了未定义变量、只读变量修改等常见问题及解决方案,并强调了性能优化的重要性。

之前,我们从C#代码的角度,为大家介绍了CPU耗时和堆内存的知识点,详见文末的知识点汇总。本期,我们将开启对本地资源检测中LuaCheck功能的解读,并结合简单的代码实例来讲解Lua检测中的具体情况,力图以浅显易懂的表达,让职场萌新或优化萌新能够深入理解。

Lua中的全局变量实现

全局变量在大多数语言中都属于“双刃剑”:全局变量可以表达程序中的全局概念,但是全局变量的使用会带来很多隐患。对于Lua这样的嵌入式语言,它是由宿主应用通过调用代码段(Chunk)来实现功能的。但“程序”概念并不明确,所以Lua语言为了解决这个问题,选择不使用全局变量,转而对全局变量进行模拟,把所有的全局变量保存在一个称为全局环境(global environment)的普通表中。

Lua 5.2版本中修改了environment的概念,新增使用一个名为_ENV、以语法糖形式存在的预定义上值来模拟全局变量。例如一个代码段:

local z=10
x=y+z

因为Lua语言把所有的代码段都当作匿名函数进行处理,实际上编译器会将代码段编译成如下形式:

local _ENV = smoe value
return function (...)
    local z = 10
    _ENV.x = _ENV.y + z
end

当_ENV的值是全局环境(global environment)表的时候,Lua便模拟出“x、y是全局变量”的情况。但实际上Lua语言是没有全局变量概念的,关于_ENV知识的详细解读可以阅读云风大神的Blog


Lua中全局变量的危害

1)在程序开发过程中,Lua语言中的全局变量不需要声明就可以使用,因此随着功能模块的增多,全局变量就会变得非常不稳定,稍有不慎便会重定义覆盖全局变量,产生各种不易查找的灾难性Bug。

2)对于不是局部变量的访问,Lua会重定向到全局环境表_G。而局部变量始终具有优先访问权,因此如果一个全局变量和一个局部变量同名且同时存在,那么访问该变量时,得到的始终是局部变量的值。

3)如果没有人为设置,Lua中通过模拟得到的全局变量,均会被_G表引用。但如果该全局变量引用了Unity中的Object对象,就会导致Unity中的Object对象被Destroy之后,_G表中的全局变量依然引用着该Object对象,引发泄露问题。更多关于Lua造成的堆内存泄露问题可以阅读本篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值