08年08月12日

Posted on 2008-08-12 20:09 RichardHe 阅读(1420) 评论(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 lonkil
这个Bug可不是一般的Bug。

# re: 08年08月12日  回复  更多评论   

2008-08-12 20:46 by 陈梓瀚(vczh)
囧,我的程序是完全没有全局变量的,不得不有的那几个要么就是singleton专门用来初始化一些必要的API调用,要么在占有的时候绝对会有critical section。我保证在所有new操作在main开始之后开始,所有delete操作在main结束之前结束。

# re: 08年08月12日  回复  更多评论   

2008-08-12 21:08 by RichardHe
@lonkil
是的啊..真汗颜啊!

# re: 08年08月12日  回复  更多评论   

2008-08-12 21:13 by RichardHe
@陈梓瀚(vczh)
弄同步确实是个好方法,不过有时候对方的程序就是异步,弄的你也只能这样.
呵呵..向你学习了!

# re: 08年08月12日  回复  更多评论   

2008-08-13 11:17 by abettor
@陈梓瀚(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 RichardHe
@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 RichardHe
@空明流转
我也知道同步当然是好了.但是对方处理的不是同步.所以我们这边也只能对它单独处理了.能同步的话什么问题都解决了.

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe