2013-01-17 143 views
3

我正在製作基於回合制的多人遊戲,在回合中工作。基本上一名球員主持一場比賽,另一名球員加入比賽,然後比賽結束。我的服務器需要處理這些匹配,並每隔5秒給客戶端提供更新。我通常會用timer/thread.sleep()來做到這一點。我的問題是我不確定如何爲多個匹配同時做到這一點。我覺得每場比賽使用一個線程將是荒謬的,因爲它會比任何事情都坐得更閒。Java NIO服務器回合制遊戲

我的一個想法是隻有一個線程以5秒爲間隔更新每個匹配。我感覺到的唯一問題是,當很多比賽一旦進行時,最後更新的比賽可能會在比賽中產生一些延遲。 (我不知道這會是多麼的重要,因爲我的比賽是基於時間的,但看起來很原始)。

我的另一種選擇是使用ScheduledExecutorService(線程池),這似乎很有前途。

  1. 我會遇到問題與我的ScheduledExecutorService線程池,因爲我也爲套接字連接運行線程池?

    2.是否有更好的方法來實現我想要實現的目標?

只是爲了澄清我正在尋找一種方法來基本上每場比賽每5秒調用一個函數。例如:

我的遊戲從0開始,您的遊戲在2秒開始。該服務器將調用更新功能:

對於我來說:0,5,10,15,20,25,等...

對於你:2,7,12,17,22,27,等等...

+0

這些遊戲是用Java Swing編寫並在客戶端運行的嗎? – amphibient

+0

這是網絡遊戲嗎?對於本地網絡還是以太網?你使用什麼協議通知(tcp,udp等?) – iMysak

+0

1,沒有你沒有任何問題,除了資源管理問題,一旦你的服務器變得忙碌起來。 2,這取決於你可以看看udp多重化,也看看JMS主題。 – BevynQ

回答

0

如果我理解你的正確「我的一個想法是隻有一個線程以5秒爲間隔更新每個匹配。」 會更好地運行每秒更新腳本,但更新匹配哪個ID mod 5 == 0. 這可以減少HOT的不良影響。

另外thread.sleep()很糟糕,它不能保證嚴格的時間。 Thread.sleep代碼(5000) - 平均睡眠至少5秒(但在不好的情況下,它可以在10秒事件更多)

旁觀Java Timerhttp://www.javacodegeeks.com/2012/07/quartz-2-scheduler-example.html

我覺得使用TimerTask會很好的決定。

又見java timer for game

更新:爲「主題」的通知看起來https://netty.io //如果你不與異步非阻塞I/O用它了:) 你的將是足夠的只有一個線程用於10000個同時連接。 (對於真實的商業項目,其真實的10 - 160 k連接)