Posted on 2008-08-12 20:09
RichardHe 阅读(1540)
评论(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
@空明流转
我也知道同步当然是好了.但是对方处理的不是同步.所以我们这边也只能对它单独处理了.能同步的话什么问题都解决了.