遊戲用戶資料被覆蓋,問題出在哪裡?
到iT邦幫忙
alice0920(iT邦初學者10級)發問:
最近在研究使用C#寫多人連線遊戲,但出現下列狀況:後來的玩家會覆蓋掉前一個玩家的資料,造成兩個Client端畫面的資料都變成後一個玩家的。請問要如何在每個Client只顯示各自的資料,而不被後來的玩家覆蓋掉呢?
slime(iT邦初學者8級):
應該有一個「現有Session(概念)表」來處理:
當玩家A透過電腦甲登入,若Session表內無相關資料,系統允許登入,並配發Session 1,之後該主機需要更新資料,都要同時告知目前Session 1。
當玩家A透過電腦乙登入,由於Session表內已經有一個A登入,系統必須停止Session 1,或不再配發新的Session,以確保同一遊戲內只有一個A。
當玩家B登入,Session 表內無相關資料,系統允許登入,並配發 Session 2,之後該主機需要更新資料,都要同時告知目前為Session 2,達到不同使用者會取得不同資訊。
sula3065408(iT邦初學者3級):
1. 要抽象化遊戲通訊的行為,應該不是叫Client直接存取資料庫,除了安全的理由,同步問題及資料量也會變麻煩。
2. Socket Server要Multi Client,理論上應該是要做Multi-threaded based Client/Server Socket,先傳入登入資料連線,連線起來之後開出分支的Process或是Thread處理Client要求,Server會給Client端Session number,並且建立以Session number索引的連線資料塊,資料塊可以用矩陣、串鏈或是乾脆存取資料庫都行,而是否要鎖定玩家不可以跨Session,是另外一回事。
資料回傳會給到非預期的Client,該是Server端作法有問題。假設Server監聽Port 978,A Client連上之後,Server要另外派一個Port給Client A,比如10001,那B連線一樣是先問候Port 978,Server可能會給出10002給B,以此類推,那Server程式對Port 10002要求回應的資料,然就不會給到Client A,所以Multi-thread Client/Server架構上應該有Bug吧。
godstamp(iT邦初學者8級):
用看看Photon(www.exitgames.com)吧,TCP和UDP都有。有完整Server端應用範例,甚至於MMORPG都有。
幾乎直接拿範例套用,就能滿足即時遊戲需求,如果需要連接資料庫,只要從Server端應用中,找出監聽接收資料的Method,解析收到的資料即可,要將資料庫資料送回給Client也差不多方式。
不過做遊戲一定會有客制化需求,所以也可以自由設計Server應用的遊戲邏輯。免費使用有限制100人同時在線,但無使用期限,用來測試及學習已綽綽有餘。
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: Donate to Wikileaks.
0 意見:
張貼留言