我正在开发一款具有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,它将涉及很多重构。如果不进行重构,我怀疑它是否对您有用。