2013-10-31 169 views
2

我有一個運行的Python遊戲服務器。遊戲是基於回合的。玩家抱怨持續幾個回合的短暫滯後峯值(即他們的客戶等待一段時間,然後突然他們突然收到幾圈的更新)。我希望找到一些方法來提高網絡一致性,但我不知道還有什麼可以做的。Python遊戲服務器 - 優化網絡

下面是我在做什麼:

  • 異步插座
  • TCP_NODELAY標誌設置
  • epoll的輪詢

以下是我收到劇本:

for (fileno, event) in events: 
    if fileno == self.server_socket.fileno(): 
     self.add_new_client() 
    elif event & select.EPOLLIN: 
     c = self.clients[fileno] 
     c.read() # reads and processes all input and generates all output 
     ... 

這就是我的發送方式更新:

if turn_finished: 
    for user in self.clients.itervalues(): 
     for msg in user.queued_messages: 
      msg = self.encode(msg) 
      bytes_sent = user.socket.send(msg) 
      ... 

每當我寫入或從套接字讀取,我檢查所有字節發送並記錄任何套接字錯誤。這些東西幾乎從不出現在日誌中。

如果我只做了一個socket.send()調用會更好嗎?

有什麼我可以檢查或調整在Linux(Ubuntu)的主機?

數據遲到客戶端似乎存在一些問題。任何人都可以提供任何建議來調試這個問題?


關於發送的消息:

如果玩家是空閒的,他們通常會收到0-3獲得更新一轉。如果玩家處於與其他玩家行動的中間,他們通常會在其屏幕上每玩家收到2-3次更新。更新通常約爲20字節長。有幾個更新(一次只發送給一個玩家),大小爲256和500-600字節。

通常大約有10-50名玩家在一次活動,在同一屏幕上不超過10名玩家。


P.S. - 我用PyPy運行。我已經配置好,一切看起來不錯。所有玩家移動都在< 3 ms內處理,並且絕大多數時間服務器都空閒。

+1

TCP_NODELAY對此有點矯枉過正,因爲它允許tcp發送更少的數據包(減少數據包檢查等待,減少數據包丟失的可能性,減少開銷),它可能實際上提高了重新啓用它的性能。 – Serdalis

+0

感謝Serdalis的反饋。 – graw

回答

0

這聽起來像你需要調試客戶端,並找出它在「卡住」時所做的事情。

只有當你明白原因後,你才能找到解決方案。