克隆 Lua 状态。

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

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

我正在考虑以下方案:保留“预派生”的 Lua 状态,然后将其简单地克隆给每个代理。这可能吗?

原文链接 https://stackoverflow.com/questions/1383768

点赞
stackoverflow用户130205
stackoverflow用户130205

你可以考虑为每个自治代理使用 Lua 的协程,而不是完全单独的虚拟机。协程是一种更轻量级的解决方案,但可能不适用于你的应用程序。

如果无法更改架构,可以尝试使用 LuaJIT。它可能可以使初始化速度足够快。

更多选项:

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

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

2009-09-05 17:34:21
stackoverflow用户14455
stackoverflow用户14455

还有 Lanes (下载文档),在我的比较中与所有类似产品一起。

关于 Rings,比较表格说:

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

注意:比较表格说 Lanes 只能调度“非循环表” 。它确实可以执行循环和调度函数、upvalues 等。而且它在 Lua 状态之间进行的复制是直接的复制,不需要在中间字符串化内容。这使得它很快。

2009-09-06 08:26:03
stackoverflow用户6236
stackoverflow用户6236

如果您使用的是 Linux 系统,可以尝试 Lua 作者之一开发的基于 LPSM 的实验性库 lper

2009-09-06 09:12:47
stackoverflow用户1836540
stackoverflow用户1836540

注意,适用于 Lua 5.2 及以上版本。

你可以限制对这个虚拟机的访问。创建一个实例,包含所有必要的函数,它不依赖于 _G(全局 Lua 状态),然后为每个客户端创建单独的表。他们将使用这些表作为他们的全局命名空间。通过 _ENV 可以将一个表设置为当前的 _G。这是一个相当难以在一个帖子中解释清楚的话题。简单来说,你需要为新客户端准备一个“虚拟”的 _G,然后只需要为客户端的代码替换 _G。这里是我建议你开始的地方。

以下是重点内容。

local _ENV = t --改变环境。如果没有 local,这将改变整个代码块的环境。

只需删除 local,你就可以改变所有后续代码的 _ENV。祝你实验顺利!

P.S. 别忘了你可以为 _ENV 和 _G 表设置元表并禁止更改该元表。Lua 在这方面非常灵活。

2016-07-23 01:08:12