Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于游戏开发的JavaScript多线程技术_Javascript_Multithreading_Html_Web Worker - Fatal编程技术网

用于游戏开发的JavaScript多线程技术

用于游戏开发的JavaScript多线程技术,javascript,multithreading,html,web-worker,Javascript,Multithreading,Html,Web Worker,我正在考虑用纯JavaScript和html5开发一个游戏,而不使用任何第三方插件。我面临的问题是,我无法找到一种方法将游戏的不同“模块”分割成不同的线程,如渲染作业、游戏逻辑、资产加载等 Web工作人员似乎能够将代码分成不同的线程,但问题是我可以在它们之间传递的信息有限。例如,对于渲染作业,我需要传递整个“世界”,所有实体、网格、纹理等用于游戏的每次更新,因为工作线程无法共享内存。它可以进行优化,比如只在初始化时发送静态对象(网格、纹理),然后在更新时只发送对象的状态(它的世界变换),但这仍然

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

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


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

你可能想调查一下网络工作者,我对他们没有经验,但听说过他们。可能会把你引向正确的方向

是js中最接近多线程的东西。
目前。

句号。

sanswebworkers据我所知,在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;
}
//在某个迭代器上循环,如果时间到了就退出
对于(i=1;i

您完全可以这样对代码进行优先级排序。但是,也有缺点。保存您的状态不会产生干净易懂的代码(尤其是循环中的循环)。它也没有那么快,因为你经常检查时间和保存状态

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


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

我建议您采用一种功能性方法来组合游戏的各个方面。参见,例如.

我指的是网络工作者。我做了一个小编辑来澄清这一点。正如我所说,工作人员似乎能够实现多线程,但我在他们之间共享信息的方式存在问题。JS的第一个“并行”运行方法是基于事件的编程。当然,这只使用一个CPU(-core),但在该限制范围内,可扩展性非常好。最近添加的webworkers(就现实世界的可用性而言)是迄今为止唯一一种通过一个(JS)软件扩展一次CPU(core)的实用方法。虽然没有从要求Javascript“真正”并行性的有效性中抹去任何东西,您提出问题的方式让我建议您阅读基于事件的编程模型。例如(对于使用该模型的软件,是的,两者都不是用JS编写的),基于事件的nginx-webserver的性能远远优于基于线程的Apache,尤其是在重载情况下。举一个例子,不使用那些更传统的并行方式在Javascript中部分是有意的,并解释为什么“webworkers”仍然没有被广泛使用。