用于游戏开发的JavaScript多线程

时间:2011-06-14 19:59:00

标签: javascript multithreading html5 web-worker

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

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

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

5 个答案:

答案 0 :(得分:4)

您可能想要了解Web Workers,我对它们没有任何经验,但已经听说过它们。可能会引导你走向正确的方向。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

web-workers是js中最接近多线程的东西 目前。
完全停止。

答案 3 :(得分: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;
}

您绝对可以通过这种方式确定代码的优先级。但是,有缺点。保存状态不会导致易于遵循的代码(尤其是循环内的循环)。它也不是那么快,因为你经常检查时间和保存状态。

答案 4 :(得分:0)

我建议使用功能性方法来构建游戏的各个方面。参见例如http://www.flapjax-lang.org