這真的不是一個簡單的問題。在最基本的層面上,你可以說網絡提供了與原始循環的MoveEnemies部分相同的數據。所以,你可以簡單地取代你的循環:
while(user doesn't exit)
check for user input
run AI
send location to server
get locations from server
resolve collisions
draw graphics
play sounds
end while
不過,還需要考慮到延遲,所以你真的不希望與呼叫網絡暫停主循環。爲了克服這一點,是很平常看到的網絡引擎儘可能快,因爲它可以坐在第二個線程,輪詢服務器上的數據和配售對象的新位置爲共享內存空間:
while(connectedToNetwork)
Read player location
Post player location to server
Read enemy locations from server
Post enemy locations into shared memory
然後主循環看起來像:
while(user doesn't exit)
check for user input
run AI
read/write shared memory
resolve collisions
draw graphics
play sounds
end while
這種方法的好處是,你的遊戲循環會以最快的速度,因爲它可以運行,但來自服務器的信息時,纔會更新當一個完整的帖子,並從服務器已完成。當然,你現在遇到了跨線程共享對象的問題,以及隨附的鎖等樂趣。
在服務器端循環大致相同,每個播放器有一個連接(通常每個播放器也在一個單獨的線程上,以便一個連接的延遲不會影響其他連接)當客戶機向服務器請求讀取所有從共享存儲器塊中的其他球員位置的敵人的位置,並將其回運行像
while (PlayerConnected)
Wait for player to post location
Place new location in shared memory
循環。
這是一個非常簡化的概述,還有更多的調整可以提高性能(例如,服務器可以將敵方位置發送給客戶端而不是客戶端請求它們),並且您需要決定某些地方邏輯上作出決定(客戶是否決定他是否已經出手,因爲他有最先進的爲自己最新的情況,或者服務器停止作弊)
忍者 - 心靈! +1 – GWLlosa 2009-05-01 15:52:17