我正在开发一款具有AI逻辑,动作等和绘图的游戏。使用Web Workers计算移动和AI逻辑是否有意义?但是我该怎么做 - 因为工人需要了解主线程,如碰撞的某些物体的位置,子弹的数量等等。这感觉是不可能的,因为工人与主线完全分开什么都没有访问。我知道有一个postMessage()系统,但感觉如此......嗯,痛苦?
例如,我有一个步枪手对象代表一个具有精灵,位置,健康等的步枪兵。我希望他巡逻。那么,我如何在工作人员上执行巡逻代码?它几乎需要对该对象的整个访问。
答案 0 :(得分:3)
我认为将WebWorkers用于游戏确实有意义,但是,这意味着您必须保留一个游戏状态对象,该对象可以转换为有效的JSON,您可以将其传递给Web工作者。在光明的一面,你也可以在这些网络工作者中加入大量内在数据。
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中的其他webworkers并处理巡逻事件)
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实际上是一个架构决策,如果你想使用它们,它将涉及大量的重构。没有重构,我怀疑它对你有用。