如何在游戏引擎中使用全局lua_State *?

时间:2013-12-12 21:26:39

标签: c optimization lua game-engine

在我的引擎中,目前每个实体都有自己的lua_State *链接到它。基本实体类有一个函数linkScript(const char *scriptPath),它将调用luaL_dofile(luaState, scriptPath)。所有这一切都很好,但游戏仍然很小。我一直在读书,我注意到我正在做的事情被认为是不好的做法。建议我有一个全局lua_State *并将所有函数加载到全局内存中。起初,我认为自己“好吧,很简单”,但我很快遇到了一个问题:每个Lua文件都定义了自己的init()tick()并应用了一些EventHooks。如果没有每个脚本覆盖以前脚本对这些函数的定义,如何共享全局lua_State *?每个帧和/或每次触发事件时都会调用这些函数。我需要能够区分每个脚本的实现。

1 个答案:

答案 0 :(得分:3)

您基本上希望将每个脚本视为具有自己功能的对象。当您加载脚本并运行它时,您不希望它的函数进入全局名称空间,而是进入特定于它的表中,并且具有一个存储所有这些表的全局表。

有很多方法可以做到这一点,但我想到的是:你创建一个全局表allObjects,然后为每个脚本创建:

-- object1Script.lua
allObjects.object1 = {
    init = function() 
        ...
        end, 
    tick = function()
        ...
        end
}

您为每个脚本执行上述操作,但每个脚本在allObjects表中创建一个不同的条目,第一个脚本创建object1,第二个脚本创建object2等等。如果您不这样做我想命名你可以使用数组的脚本,即allObjects.insert( { ... table of init, tick etc functions ...} )。大概你会遍历allObjects表来适当地调用每个“对象”的init()或tick()等。

我认为以上是基本方法,希望它能激发你找到自己的方法。