用于混合同步和asynchronous程序stream的体系结构,以最大化人造实时但合乎逻辑的游戏玩法?

我试图做的是node.js中的虚拟实时游戏引擎(利用非阻塞I / O)。 当我说'虚假实时'时,我的意思是我希望玩家尽可能地与世界互动,而不会让玩家互相阻碍,或者不得不“排队等待世界”。

也就是说,除非游戏需要它。 例如,在现实生活中,你必须排队等待某些事情,有的像在高速公路的某一段占用空间一样简单。 然而,如果每个人都在自己的空间里,他们可以以独特的速度在自己的车里跳千斤顶或者把甜甜圈旋转起来,这个速度与其他也在采取这些无关行动的人是完全不相关和“并行”的。

相关/同步的行动将是交易,甚至移动。 如果两个玩家进入同一个空间并试图捡起同一个物体,那么突然间如果他们同时到达那里就很重要。

我希望这是有道理的,但我会添加一些代码来尝试举个例子:

setInterval(function() { for(var i = 0; i < someArray.length; i++){ someArray[i].QueuedAction(); } someArray = new Array(); }, 1000); 

如果每隔1秒我们通过这个数组,然后清空它,我们将实际上有一个同步列表。 当这个循环运行时,可能会有许多事件添加到这个数组中,但是这个循环阻止了这些事件修改数组直到完成并清除了数组。 这将是按顺序发生的事情的列表。

但是,如果这需要太长的时间,那么它也将阻止玩家请求他们当前的位置或者客户端请求玩家周围的物体等等。所以这需要迅速发生,以保持实时的幻觉,但为了保持一个逻辑世界的错觉。

有没有我应该评估的模式,可以改善这个有序的非平衡的世界游戏引擎的平衡?

要允许在处理列表时将操作排入列表,可以在处理第一个列表时接收第二个列表。 有了这个,不必每秒都能够通过列表中的所有元素,而是可以在更短的时间内处理尽可能多的项目,然后合并这两个列表。

我不是一个JavaScript程序员,但面向对象的语言,我会去那种伪代码:

 Class EventQueue queueItem( item ) queueBuffer.apped( item ) processItems() beginTime = performance.now() processBuffer.apped( queueBuffer ) queueBuffer.clear() while( beginTime + (1/60) < performance.now() ) { item = processBuffer.popFront() item.QueuedAction() } 

EventQueuetypes的对象将是你的入口点,方法queueItem 。 您必须find一种方法来定期调用processItems方法。 在这个例子中,它会运行一个1/60秒以上,但你可以改变它,并根据你的需要定制它。

也许我简化了你的问题,但这是async / await的好处。

对于需要一个接一个地执行的一系列操作,可以按顺序调用它们:

 await doOneThing(); await doNextThing(); await doFinalThing(); 

而这整个序列本身可以是一个asynchronousfunction,可以等待或asynchronous启动。

较大的示例代码:

 // example actions that are slow async function doA() { await delay(100); } async function doB() { await delay(1000); } // awaiting this function returns in approximately 0 milliseconds async function do_A_and_B_and_return_immediately() { doA(); doB(); } // awaiting this function returns in approximately 1100 milliseconds async function do_A_afterwards_do_B_afterwards_return() { await doA(); await doB(); } async function main() { // this is quick await do_A_and_B_and_return_immediately(); // this is slow await do_A_afterwards_do_B_afterwards_return(); // this seems like what you're asking for - // do a sequential task but don't wait up for it. do_A_afterwards_do_B_afterwards_return() }