2

我最近一直在玩网络工作者,我设法使用以下技术将 A* 路径查找卸载到工作线程......

  1. 当对象向工作人员发送消息时,将对对象的引用推送到数组上
  2. 当工作人员回发时,从数组中移动下一项

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

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

显然存在一个问题,因为我无法将一组对象传递给工作人员,而且我正在努力想办法解决这个问题。

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

有什么建议么?


您能否举一个示例说明您尝试向网络工作者发布的内容,例如控制台在卸载之前对其进行日志记录

像这样的东西...

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
});

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

4

2 回答 2

0

您可以将其传递给序列化的 JSON。这不是最漂亮的解决方案,但在正确实施 WebWorkers 之前可能是最好的(据我了解,规范允许传入和传出任何对象)

于 2013-02-27T17:10:10.963 回答
0

你想告诉主线程生物 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);
});
于 2013-02-27T19:08:17.790 回答