小编Jer*_*Law的帖子

网络化摇摆游戏中的多线程:使用invokeLater vs locks

我正在编写一个简单的自上而下的太空游戏,并且正在扩展它以允许通过具有多个玩家的网络进行游戏.我已经做了很多阅读,但这是我第一次这样做,我很欣赏一些关于选择合理设计的建议.

我的GUI是使用Swing编写的.每秒30次,一个计时器触发,并根据内存中游戏世界对象中的数据重新绘制我的GUI(基本上是船只和具有位置的射弹等列表).游戏世界的物理更新也使用此计时器进行.因此,对于单人游戏实现,一切都发生在EDT上,这很好.

现在,我有单独的线程处理来自其他玩家的传入数据包.我想根据这些数据包包含的内容更新我的gameWorld对象中的数据.我的问题是,我应该使用invokeLater进行这些更改,还是应该使用锁来避免并发问题?

说明我的意思:

runMethodOfInputThread() {
    while(takingInput) {
        data = receiveAndInterpretIncomingPacket();  // blocks
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                gameWorld.updateWithNewGameInfo(data);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

VS

runMethodOfInputThread() {
    while(takingInput) {
        data = receiveAndInterpretIncomingPacket();  // blocks
        synchronize (gameWorldLock) {
            gameWorld.updateWithNewGameInfo(data);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

后者还需要在EDT访问gameWorld的任何地方使用类似的同步块,因此在我看来使用invokeLater会更容易实现.但我认为这两种方法都有效吗?是否还有其他重要的优点/缺点?

谢谢,

杰里米

java networking swing multithreading

6
推荐指数
1
解决办法
521
查看次数

标签 统计

java ×1

multithreading ×1

networking ×1

swing ×1