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