6

伙计们,有没有办法克隆一个 Lua 状态?

在我的游戏应用程序中,Lua 虚拟机的初始化过程非常繁重(大约 1 秒,因为一次加载了许多脚本)。我为每个自治代理都有一个单独的 Lua VM,一旦创建了代理,它的 Lua 初始化会严重影响 FPS。

我正在考虑以下模式:如何保持“预分叉”Lua 状态,然后为每个代理简单地克隆?可能吗?

4

4 回答 4

4

您想考虑为每个自治代理使用 Lua 的协程,而不是完全独立的 VM。协程是一种更轻量级的解决方案,但可能适合也可能不适合您的应用程序。

如果你不能改变架构,你可以试试LuaJIT。它可能会使初始化足够快以满足您的目的。

更多选择:

  1. Rings:“Rings 是一个库,它提供了一种从 Lua 内部创建新 Lua 状态的方法。它还提供了一种在创建者(主)和创建的(从)状态之间进行通信的简单方法。”

  2. Pluto:“Pluto 是一个库,它允许用户将“Lua 宇宙”的任意大部分写入一个平面文件,然后再将它们读回相同或不同的 Lua 宇宙。

于 2009-09-05T17:34:21.617 回答
1

如果你在 Linux 上,你可以试试Lua 作者之一的基于 LPSM 的实验lper

于 2009-09-06T09:12:47.793 回答
1

还有 Lanes(下载文档)以及与我所知道的所有类似产品的比较。

关于戒指比较表说:

Rings 提供单独的 Lua 状态,但没有多线程。这使它变得简单,但它不会使用多个 CPU 内核。

注意:比较表说 Lanes 只会编组“非循环表”。它确实执行循环,并且执行编组函数、upvalues 等。它在 Lua 状态之间进行复制作为直接副本,不需要在中间对内容进行字符串化。这使它很快。

于 2009-09-06T08:26:03.560 回答
1

注意,适用于 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 在这里非常灵活。

于 2016-07-23T01:08:12.753 回答