我正在devise自己的游戏引擎,用于实时CRPG–想想Baulder's Gate。 我现在知道我的大部分规范,目前我正处于规划阶段。
我selectLua有很多原因。
出于第一个原因,我决定尽可能在Lua中处理我的游戏代码。 除了在C ++中处理的低级系统外:audio,物理,animation,渲染,资源管理器(?)。
但是当涉及到线程时,我遇到了一个问题。 我决定使用工作系统。 但我不知道如何着重强调Lua。
我的更新外观看起来像…
Local dt {} While Game.isRunning() { dt = timer.delta(); PreUpdate(dt); //Delayed Raycasts for AI, Physics Triggers UpdateLogic(dt); //AI, UI, Event Handling, etc. UpdateAnimations(dt); //State Machines, Blending, framed scripts UpdatePhysics(dt); Render(dt); }
我应该如何处理这个线程?
我的第一个想法是,我只有一个虚拟机的Lua,并将其设置在主线程上; 那么工作线程只能在C ++中工作。 Lua将有C ++ APIcallback。 当Lua调用这个callback时,它返回到C ++。 C ++将创建一个工作分派。 这个工作被放置在一个qeue中,并在本地代码的其他线程上处理。 我正在考虑遵循这个想法。 大多数游戏似乎都是以串行方式处理游戏逻辑–UpdateLogic(dt) – ,然后asynchronous更新底层系统,multithreading渲染或处理立即触发所需的事件。
我的第二个想法是使用一个使用Lua实例的所有线程的作业系统。 我想用这个系统我可以以线程方式更新实体。 但我可以很快看到问题。 由于实体的数据是可变的,这可能会很快导致逻辑错误。 即使我决定推迟更新数据,我仍然可以看到这成为一个math错误的问题。
任何指导将在这里有所帮助。