web worker语言 - 在JavaScript中将碰撞检测(和其他处理器密集型循环)卸载到WebWorker中



我最近一直在玩web worker,我设法通过以下技术将A*路径查找卸载到工作线程…

  1. 当对象向worker发送消息时,将对对象的引用推入数组
  2. 当worker返回时从数组中移出下一项

我的游戏有一个功能,生物会对环境中的噪音做出反应。理想情况下,我想实现的是……

  1. 游戏中的某些东西发出半径
  2. 的噪音
  3. 将噪音的来源和生物列表传递给web worker
  4. 网络工作者响应一个在噪音范围内的生物列表

显然有一个问题,因为我不能传递一个对象数组给worker,我正在努力想一个解决这个问题的方法。

更新问题:我如何(有效地)告诉主线程生物X和生物Y听到了声音?

有什么建议吗?


你能给一个你想要发送到web worker的例子吗,例如在卸载它之前控制台记录它

像这样…

var iNoiseRadius = 100;
var aCreatures = [
    {id: 1, x: 0, y: 0},
    {id: 2, x: 200, y: 0},
    {id: 3, x: 100, y: 100},
    {id: 4, x: 50, y: 400},
    {id: 5, x: 100, y: 0}
];
....
oWorker.postMessage({
    type: 'noise',
    originator: aCreatures[2],
    radius: iNoiseRadius,
    creatures: aCreatures
});

在发布消息和收到响应之间的时间内,生物数组可能会发生变化,因此数组索引是无用的。

你要尽可能有效地告诉主线程生物X和Y听到了声音。

逻辑答案是返回在半径内的生物id列表。这样的话,你必须在主线程中再次遍历列表。

你也可以使用工人的postMessage在被发现时张贴半径内每个生物的id。伪代码:

// In the WebWorker
forEach(creature in creatures) {
  if (creature is within radius distance of originator) {
    postMessage(creature.id);
  }
}
// In the Main Thread
noiseDetectionWorker.addEventListener('message', function(event) {
  notificyCreatureOfNoise(event.data);
});

可以传递序列化的JSON。这不是最漂亮的解决方案,但可能是最好的,直到WebWorkers被正确实现(据我所知,规范允许任何对象传入和传出它们)

最新更新