在需要时生成WebWorker还是重用同一个?

时间:2014-03-19 17:12:43

标签: javascript performance web-worker

我正在创建一个WebGL游戏,它需要WebWorker进行一些网格处理,以防止主线程滞后。

我的问题 - 最好是在需要时生成/创建新的WebWorkers并在作业完成时终止它们,或者创建一个永久的WebWorker,它在内部对网格处理进行排队?产生(并摧毁)新的WebWorkers会产生很大的开销吗?

在需要时创建它们的主要优点是一次运行多次,没有等待处理的积压,这意味着更快的网格生成。

感谢任何建议,以便我可以优化我的代码以获得最佳性能。谢谢!

1 个答案:

答案 0 :(得分:4)

这不是一个WebGL问题,它只是一个普遍的WebWorker问题。尽管取决于我的头脑。工人只是线程。如果您的线程在100%的时间都处于忙碌状态(不等待IO或用户输入或下一帧),那么一旦线程数超过核心数,您就不会获得任何加速。

换句话说,如果你有2个内核,每个运行3个线程而不等待1个内核,则100%的时间将运行1个线程,另一个内核将在50%的时间内运行其他每个线程。总时间与将2个线程合并为1的时间相同。

因此,产生大量线程并不一定是胜利,并且有way来查询用户机器在浏览器中使用JavaScript的核心数量。

除此之外,您还可以处理可能是大数据的网格。让我们说每个网格在处理时使用200meg(就像它在JSON中一样)和100meg完成后(你已经读过JSON并转换为Float32Arrays等)。换句话说,当你和&#39。 #39;你已经完成了1gig数据(10个100meg网格)

所以,你产生了10个工人。当它们完成时,只剩下1 gig的数据(最后10个网格),但是当它们运行时,每个使用300meg(200meg读取JSON,100meg来存储结果)。当他们正在运行时,总共有3个内存。你的内存可能会用完。

如果您只有一个具有工作队列的网格处理工作者来做最大的记忆,那么您使用的是1.2 gig。工作人员会将JSON(200meg)转换为Float32Arrays(100meg),将那些Float32Arrays传递给主页,然后处理下一个网格。

我看到了3条路径

  1. 产生一个工人来处理网格物体。当它完成后终止它。产生一个新的。

    产生一个工人是不是免费的,因为它每次都要加载javascript?

  2. 每个网格生成一个工人。

    见上文为什么这可能不是一个好主意

  3. 产生一个工人并给它一个网格队列来处理。