我最近一直在玩web worker,我设法通过以下技术将A*路径查找卸载到工作线程…
- 当对象向worker发送消息时,将对对象的引用推入数组
- 当worker返回时从数组中移出下一项
我的游戏有一个功能,生物会对环境中的噪音做出反应。理想情况下,我想实现的是……
- 游戏中的某些东西发出半径 的噪音
- 将噪音的来源和生物列表传递给web worker
- 网络工作者响应一个在噪音范围内的生物列表
显然有一个问题,因为我不能传递一个对象数组给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被正确实现(据我所知,规范允许任何对象传入和传出它们)