我正在开发一款具有AI逻辑, Action 等和绘图功能的游戏。使用Web Workers计算运动和AI逻辑是否有意义?但是我该怎么做-因为工作人员需要非常了解主线程,例如某些对象的碰撞位置,子弹数量等,所以这似乎是不可能的,因为工作人员与主线程完全分开根本无法访问。我确实知道那里有一个postMessage()系统,但是感觉如此……嗯,很痛苦吗?

例如,我有一个步枪兵对象,代表一个带有 Sprite ,位置,健康状况等的步枪兵。我希望他巡逻。那么,我该如何在一个工作人员上执行巡逻代码?它几乎需要对该对象的整个访问。

最佳答案

我认为使用WebWorkers进行游戏确实有意义,但是,是的,这意味着您将必须保留一个游戏状态对象,该对象可以转换为可传递给Webworkers的有效JSON。从好的方面来说,您也可以在这些网络工作人员中放入很多内部数据。

var gameState = {
   sprites: {
      {
         type: 'rifleman',  // damage, accuracy, speed etc set inside appropriate webworker.
         owner: 'playerA',
         x: 100,
         y: 100,
         z: 0,
         level: 1, // used to fetch modifiers to dmg, acc, speed etc.

      },
      {
         // each sprite it's own state obj.
      }
   }
}

然后您可以设置一个Webworker进行巡逻和可能发生的事件(您也可以在该Webworker中调用其他Webworker并处理巡逻事件)
var patrolWorker = new WebWorker('patrolWorker');
patrolWorker.onmessage = function(e){
   render(e.data); // your render function, can ALSO be a webworker if you like ;)
}
patrolWorker.postMessage(gameState.sprites);

现在必须弄清楚,使用WebWorkers实际上实际上是一个体系结构决策,如果要使用WebWorkers,它将涉及很多重构。如果不进行重构,我怀疑它是否对您有用。

10-06 04:46