2010-09-21 29 views
1

我正在嘗試製作多人網絡遊戲。每個玩家在屏幕上用矩形表示。我使用的OpenGL的圖形和用戶輸入(MOVE-LEFT,MOVE-RIGHT等命令)將由它處理(或GLUT或sumthing)。對等通信線程

我有以下的遊戲架構。

遊戲中有4名玩家(節點)。每個玩家都使用UDP發送和接收數據。每個玩家可以發送數據給其他玩家。

如果來自相應用戶的任何輸入,數據需要由玩家發送。 (例如MOVE-LEFT命令等)。 只要玩家(比如p1)從任何其他玩家(比如p2)接收到任何數據(比如玩家p2在屏幕上的新位置),玩家p1的屏幕應該立即更新。

我在想以下幾行: 創建一個處理圖形的線程。 使用UDP創建另外2個線程,每個線程用於接收和發送數據。

每當圖形線程從用戶獲取'myposition'的輸入時,它就會更新共享全局變量'myposition'。正在等待這個變量的網絡發送線程被激活,並且告訴其他玩家關於它的新位置。

類似地,每當從任何其他玩家'i'收到'位置'更新時,網絡接收線程更新全局變量player [i] .position。圖形線程現在將使用更新後的位置重新繪製場景。

此設計是否正確。如果是的話,這個設計有多好,我該如何改進它

回答

5

網絡遊戲編程是一個話題的怪物,所以很難說「是的,這是你如何設計網絡架構」。它完全取決於你的遊戲需求。你計劃發送什麼樣的數據包?每幀都會發送一個數據包,表明玩家A正在拿着左鍵嗎?這種流量侷限於局域網嗎?

對於在4個客戶端之間同步移動這樣簡單的事情,將發送,接收和呈現放在單獨的線程中似乎是矯枉過正。也許作爲一個起點,你應該從一個更簡單的設計開始,並且當你感覺你的數據包不夠快時,轉向多線程。

例如,您可能希望有一個遊戲循環如下內容(全部在同一個線程):

while (running): 
    readUpdSocketForIncomingPackets(); 
    updateGameObjects(); 
    renderGameObjects(); 
    sendPacketsToPeers(); 

在每一幀的開始,您可以讀取UDP套接字傳入數據包,更新職位(以及其他任何你發送給你的同齡人),然後繪製。隨着遊戲輸入的處理,數據包被創建並累積在數據包隊列中。這樣做,可以讓你執行優化,例如將多個消息填入/合併到一個數據包中,刪除重複的消息(例如,只發送最新的位置更新)等等。因此,在每個遊戲循環結束時,最終隊列數據包被處理併發送給對等體。

但是,這是一個很大的話題,我對許多細節進行了描述。

看看老頭子的博客: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/

他得到了解決網絡遊戲編程的一些基本面的一些偉大的文章。