伙计们,有没有办法克隆一个 Lua 状态?
在我的游戏应用程序中,Lua 虚拟机的初始化过程非常繁重(大约 1 秒,因为一次加载了许多脚本)。我为每个自治代理都有一个单独的 Lua VM,一旦创建了代理,它的 Lua 初始化会严重影响 FPS。
我正在考虑以下模式:如何保持“预分叉”Lua 状态,然后为每个代理简单地克隆?可能吗?
注意,适用于 Lua 5.2 及更高版本
您可以只限制对此 VM 的访问。创建一个具有所有所需功能的实例,该实例不依赖于 _G(全局 Lua 状态),然后为每个客户端创建单独的表。他们将用作他们的全局命名空间。可以通过 _ENV 将表设置为当前 _G。这是一篇很难在一篇文章中解释的话题。简而言之,您为新客户准备“虚拟”_G,然后将 _G 替换为客户的代码。我建议你从那里开始。
这就是重点。
local _ENV = t -- change the environment. without the local, this would change the environment for the entire chunk
只需删除local
,您将更改 _ENV 以获得所有进一步的代码。祝实验顺利!
PS不要忘记您可以为_ENV和_G表设置元表并禁止更改该元表。Lua 在这里非常灵活。