2014-03-19 51 views
4

我正在创建一个WebGL游戏,它需要WebWorker进行一些网格处理,以防止主线程上的延迟。在需要时产生WebWorker或重用相同的WebWorker?

我的问题 - 是它更好地产卵/需要时创建新WebWorkers并终止他们当任务完成,或创建一个永久WebWorker在内部排队网格处理?生成(并销毁)新的WebWorkers是否会产生大量开销?

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

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

+1

可能感兴趣 - http://typedarray.org/concurrency-in-javascript/ – vsync

+0

谢谢,vsync。文章有问题:据我所知,工人可以在自己内部创建一名工人。 – wandalen

回答

2

这是不是一个真正的问题的WebGL它只是一个普通WebWorker问题。尽管这取决于我的头顶。工人只是线程。如果100%的线程忙于100%的时间(不等待IO或用户输入或下一帧),那么一旦拥有比线程更多的线程,就不会加速。

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

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

最重要的是,你正在处理这可能是大型数据网格。假设每个网格在处理时使用200meg(如JSON),完成后使用100meg(您已阅读JSON并转换为Float32Arrays等)。换句话说,完成后您将获得1gig的数据(十个100meg网格)

因此,你产卵了10名工人。当它们完成时,将剩下1个数据(最后10个网格),但是当它们运行时,每个使用300meg(200meg读取JSON,100meg存储结果)。这是他们运行时总共3个内存。你可能会用完内存。

在哪里,如果你有与工作要做,你会使用内存最多的队列只是一个网状加工者为1.2演出。工作人员将阅读JSON(200meg)转换为Float32Arrays(100meg),将这些Float32Arrays传递到主页面,然后处理下一个网格。

有3路我看到

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

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

  2. 菌种每一个网格工人。

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

  3. 生成一个工人,并给它的网格队列去努力。

+0

谢谢gman。你是对的,它不是一个WebGL的问题,所以我已经删除了它的标签。所以看起来我现在做的方式是最好的方式,它使用1个WebWorker和一个等待处理的队列。我将不得不进一步优化我的代码。感谢您的详细解答! –

+0

一种查询浏览器中用户计算机在JavaScript中的核心数的方法: https://developer.mozilla.org/en-US/docs/Web/API/NavigatorConcurrentHardware/hardwareConcurrency – wandalen