[游戏]服务器和客户端之间的同步策略[steeven]

 Client              
 Player{ //Game.Me
1void CommandA{
 cmd = new Command(methodInfo,args[]);
 server.channel.Send(cmd)
 }
 }
 Unit{
 event LocationChanged;
 ID; //该单元的在游戏中的唯一标志
 OwnerID;//该单元属于谁
 _Location;
 Location{
8set{
 _Location = value;
 if (LocationChanged != null)
 LocationChanged(this,EventArgs.Empty);
 
 
 }
                 Server 
 Channel{ //server端,每个channel属于某个用户
 int ID; //Player id
2void OnCommand{
 server.CommandQueue.Add(ID,cmd);
 }
 }
 Server{
 void Main{
 while(true)
3if (CommandQueue.count>0)
 processCommand();
 }
4ProcessCommand(){
 Player p = FindPlayer(CommnadQueue.Peek().ID);
 cmd.method.invoke(p,p.Peek().args)//如果不用reflection,需要一个大的switch
 }
7BroadcastCommand(players,cmd){
 foreach(p in players)
 p.channel.send(cmd);
 }
 }
 Player{//注意这里的Player是服务器端
5void CommandA{
 //check condition
 unit.Location = xxx; '//perform command
 //也许同步策略加到这里
 }
 Unit{
 event LocationChanged;
 ID; //该单元的在游戏中的唯一标志
 OwnerID;//该单元属于谁
 _Location;
 Location{
6set{
 if (value != _Location){ //发生变化
 IList players = … //同步策略
 Server.Broadcast(players,new command(ID,methodInfo,value));
 }
 _Location = value;
 if (LocationChanged != null)//也可能通过这里注册Location同步策略分析器
 LocationChanged(this,EventArgs.Empty);
 
 
 }
 注释:                          
我更希望通过AOP把某些方法自动重定向或者同步到Server/Client端执行,编程上可以简化很多

转载于:https://www.cnblogs.com/ourgame/archive/2004/05/27/11869.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值