【问题标题】:How do I use a global lua_State * in a game engine?如何在游戏引擎中使用全局 lua_State *?
【发布时间】:2013-12-13 10:12:09
【问题描述】:

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

【问题讨论】:

    标签: c optimization lua game-engine


    【解决方案1】:

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

    有很多方法可以做到这一点,但想到的一种是:创建一个全局表 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() 等。

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

    【讨论】:

    • 完美,正是我所需要的。一个非常简单的解决方案,我很惊讶我什至没有想到这一点。
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多