2

私は最近 Web ワーカーで遊んでいて、次の手法を使用して A* パス検索をワーカー スレッドにオフロードすることができました...

  1. オブジェクトがワーカーにメッセージを投稿するときに、オブジェクトへの参照を配列にプッシュします
  2. ワーカーがポストバックしたときに、配列から次のアイテムをシフトします

私のゲームには、クリーチャーが環境内のノイズに反応する機能があります。理想的に達成したいことは...

  1. ゲーム内の何かが半径のある音を立てる
  2. ノイズの発生源とクリーチャーのリストを Web ワーカーに渡す
  3. Web ワーカーは、ノイズの範囲内にあるクリーチャーのリストで応答します

オブジェクトの配列をワーカーに渡すことができず、これを回避する方法を考えるのに苦労しているため、明らかに問題があります。

更新された質問: クリーチャー X とクリーチャー Y が音を聞いたことをメインスレッドに (効率的に) 伝えるにはどうすればよいですか?

助言がありますか?


Webワーカーに投稿しようとしているものの例を挙げていただけますか。たとえば、オフロードする直前にコンソールにログを記録してください

このようなもの...

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 に答える