Posted on 2008-08-12 20:09
RichardHe 閱讀(1567)
評論(8) 編輯 收藏 引用
原因:今天游戲出現一個很嚴重的BUG,就是通過帳號服務器驗證時,有時候驗證完以后進入角色選擇時,竟然出現別人的帳號角色;
這可不是一個小BUG,對于一個程序員來說可是致命的錯誤;由于在本地服務器測試時,同時通過驗證帳號服務器的消息是十分少的,
所以在本地一開始沒發現這個BUG;還有就是看來我在程序中使用全局變量實在是不好,才使得這個BUG沒及時發現.
問題是這樣產生的,如果很多消息同時過來請求帳號服務器,那在那個唯一一個對應帳號的數字ID為最后一個.而在登錄LOGIN中的帳號
和ID傳遞時的ID和本身的ID是不一樣的,所以才會出現這個帳號對應別人的角色列表.我恨,這個問題沒意識到.
解決:先在傳遞的時候把帳號和ID綁定,或者用一個HASH_MAP把帳號和ID和服務器列表保存起來,再轉到LOGIN服務器是時再根據用戶
名找到他的ID,從而再轉角色服務器.這樣就不會錯了!
Feedback
# re: 08年08月12日 回復 更多評論
2008-08-12 20:42 by
這個Bug可不是一般的Bug。
# re: 08年08月12日 回復 更多評論
2008-08-12 20:46 by
囧,我的程序是完全沒有全局變量的,不得不有的那幾個要么就是singleton專門用來初始化一些必要的API調用,要么在占有的時候絕對會有critical section。我保證在所有new操作在main開始之后開始,所有delete操作在main結束之前結束。
# re: 08年08月12日 回復 更多評論
2008-08-12 21:08 by
@lonkil
是的啊..真汗顏啊!
# re: 08年08月12日 回復 更多評論
2008-08-12 21:13 by
@陳梓瀚(vczh)
弄同步確實是個好方法,不過有時候對方的程序就是異步,弄的你也只能這樣.
呵呵..向你學習了!
# re: 08年08月12日 回復 更多評論
2008-08-13 11:17 by
@陳梓瀚(vczh)
囧,我的程序是完全沒有全局變量的,不得不有的那幾個要么就是singleton專門用來初始化一些必要的API調用,要么在占有的時候絕對會有 critical section。我保證在所有new操作在main開始之后開始,所有delete操作在main結束之前結束。
——好習慣!現在如果還在面向對象的程序里大量泛濫的使用全局變量,那恐怕肯定是要出問題的了。singleton雖然有點矯情,但是是非常有效的。我的方法是,singleton中的對象必須用get/set訪問,而get/set方法本身就是synchorized的。這樣一來,大家用起來就省心又放心了。
# re: 08年08月12日 回復 更多評論
2008-08-13 12:29 by
@abettor
而get/set方法本身就是synchorized的???
具體怎么實現的啊?
# re: 08年08月12日 回復 更多評論
2008-08-13 12:31 by
一定要同步。vc說的對。
# re: 08年08月12日 回復 更多評論
2008-08-13 13:23 by
@空明流轉
我也知道同步當然是好了.但是對方處理的不是同步.所以我們這邊也只能對它單獨處理了.能同步的話什么問題都解決了.