6

我正在考虑用纯 JavaScript 和 html5 开发游戏,而不使用任何第三方插件。我面临的问题是我找不到将游戏的不同“模块”分成单独线程的方法,例如渲染作业、游戏逻辑、资产加载等。

Web Workers 似乎能够将代码分离到不同的线程中,但它们的问题是我可以在它们之间传递的信息有限。例如,对于渲染作业,我需要为游戏的每次更新传递整个“世界”,包括所有实体、网格、纹理等,因为工作线程不能共享内存。它可以进行优化,例如仅在初始化时发送静态对象(网格、纹理),然后仅在更新时发送对象的状态(它是世界变换),但它仍然不是

有没有办法在它们之间发送大数据或让它们共享一些对象?还是有完全不同的方法来实现真正的多线程?我知道使用插件/齿轮有更简单的方法来实现这一点,但我只需要使用开放网络中可用的方法;

4

5 回答 5

4

您可能想研究 Web Workers,我没有使用它们的经验,但听说过它们。可能会引导你走向正确的方向。

http://ejohn.org/blog/web-workers/

于 2011-06-14T20:02:58.007 回答
4

JavaScript 的 Web Worker 在某种程度上是一种更好的并发编程模型。例如,它是事件驱动的,没有共享对象。这意味着您无法进入网格锁定(因为根本没有锁定)并且对象无法通过同时被两个线程修改而进入无效状态。

问题是你不能轻易地将传统的游戏系统叠加在这个模型的顶部。所以你需要以一种新的方式设计游戏系统来采用这种编程模型,我认为这可能会很昂贵。

于 2011-06-15T03:04:17.040 回答
0

web-workers是 js 中最接近多线程的东西。
在这一刻。
句号。

于 2011-06-14T20:05:32.180 回答
0

Sans Web Workers 据我所知,没有真正的方法可以在 javascript 中进行多线程处理。

不过,您可以使用一些逻辑来确定应该花费多少时间来完成某些任务。您可以创建将信息存储在状态中的函数(因此可以退出循环,然后在以后重新拾取)。每个循环只知道它在保存状态并退出函数之前有多少时间。

所以 for 循环也会有一个时间条件......

//Loop over some iterator, exit if time is up
for (i = 1; i < max || timeNotUp(); i++)
{
}

//If exiting normally 
if (i == max)
{ //do somthing
}
//otherwise, save state
else
{
    this.i = i;
    this.otherStuff = otherStuff;
}

您绝对可以通过这种方式优先处理您的代码。但是,也有缺点。保存您的状态不会导致代码干净且易于遵循(尤其是循环中的循环)。它也没有那么快,因为你不断地检查时间和保存状态。

于 2011-06-14T21:45:44.760 回答
0

我推荐一种功能性方法来编写游戏的各个方面。参见例如http://www.flapjax-lang.org

于 2011-07-27T17:01:07.263 回答