【发布时间】:2011-10-28 21:18:29
【问题描述】:
我正在编写一个简单的自上而下的太空游戏,并且正在扩展它以允许通过网络与多个玩家一起玩。我已经阅读了相当多的内容,但这是我第一次这样做,我会很感激一些关于选择合理设计的建议。
我的 GUI 是使用 Swing 编写的。每秒 30 次,计时器触发,并根据内存中 gameWorld 对象中的数据重新绘制我的 GUI(本质上是带有位置的船只和射弹列表等)。游戏世界的物理更新也使用这个计时器进行。因此,对于单人游戏实现,一切都发生在 EDT 上,并且运行良好。
现在,我有单独的线程来处理来自其他玩家的传入数据包。我想根据这些数据包包含的内容更新我的 gameWorld 对象中的数据。我的问题是,我应该使用 invokeLater 来进行这些更改,还是应该使用锁来避免并发问题?
为了说明我的意思:
runMethodOfInputThread() {
while(takingInput) {
data = receiveAndInterpretIncomingPacket(); // blocks
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gameWorld.updateWithNewGameInfo(data);
}
});
}
}
对
runMethodOfInputThread() {
while(takingInput) {
data = receiveAndInterpretIncomingPacket(); // blocks
synchronize (gameWorldLock) {
gameWorld.updateWithNewGameInfo(data);
}
}
}
后者还需要在 EDT 访问游戏世界的任何地方使用类似的同步块,所以在我看来,使用 invokeLater 会更容易实现。但我认为这两种方法都行得通吗?还有其他重要的优点/缺点需要记住吗?
谢谢,
杰里米
【问题讨论】:
标签: java multithreading swing networking