zoukankan      html  css  js  c++  java
  • 代码替换修复总结

    写于2015-01-09 17:27 由qq空间中转过来,格式有点乱

       奋斗了近两个月了,下了决心,定制一个可执行的计划,对一个老游戏的服务端进行.net化, 前段时间处理的一直都挺顺利,使用C#比较速度的重写了GateServer,LoginServer,RoleServer以及GuildServer. 对于GameServer的庞大工程,则使用了c++cli进行逐步的重构,抽象.     
       首先对一些常用的接口函数使用.net重新封装,核心逻辑部分的c++直接替换调用.net接口.    
       后来对各个模块的网络通信部分使用C#编译的XKSocket库进行处理,摒弃原来c++的还得依赖于windows消息 机制的select socket模型.    
       与GameServer进行网络通信的GateServer,LoginServer,RoleServer,GuildServer都处理的相当顺利,而灾难来 了,那就是GameServer和Player Client的通信.    
       之所以说灾难,那是工程量相当的大,7-8w的代码中,绝大多数函数都涉及或者依赖于Player的管理,而基于一定要 跨过一步的决定,我的代码也没有进行备份,自己一个人开发,也没有使用svn,git等版本管理工具.     
       当把原来的socket通信拿掉接上XKSocket后,与Player管理相关的代码导致了不知道到多少错误.     
       原来代码中使用的数组对玩家进行管理,数组里的内容即对应一个Player对象,而我这里使用了hashtable维护玩家列表, Key是XKSocket底层生成的ConnectionID,Value即Player对象.    
       代码中出现 PlayerArray[iPlyIndex]的频率非常高,同样遍历PlayerArray时 PlayerArray[i]的频率也非常高,由于为了方便 的让使用.net进行控制,对Player进行了一个简单的包装,使用了一个.net的PlyItem包装对应的Player[iPlyIndex].     
       犯了一个致命的错误,即对所有代码中的 PlayerArray[iPlyIndex]和PlayerArray[i] 都替换成了 PlyItem->CppPly  这里要说的重点也就是,在对工程量比较大的代码进行替换过程中,不能因为意思是同一对象或类型,对不同的文本 替换为自己重新定义的代码!!!!!!    
     
        如果当时自己替换后,发现这个问题,还有挽救的机会,随着代码不断的修复,修改,这个问题才浮出水面,而此时自己只能为此买 单,将错就错下去了.
        比如说如下简单代码(随便写的)
    void SyncPlyName(int iPlyIndex)
    {        
        int i=0;      
        for(i=0;i<MaxPlyCount;i++)        
       {            
         PlyArray[i]->send(PlyArray[iPlyIndex]->Name);        
       }
        替换后的代码,即为 
    void SyncPlyName(int iPlyIndex)
    {
             int i=0;
           PlyItem^ plyItem=(PlyItem^)GameSrvMng::Instance->htPlyItem[i];
           if(plyItem==nullptr || plyItem->CppPly==NULL) return ;
           for(i=0;i<MaxPlyCount;i++)
           {
                 plyItem->CppPly->send( plyItem->CppPly->Name);
           }
    }
         显然上在的代码是可以正常编译的, 在这几句简单的代码中自然可以看出问题,但是代码量非常大的情况下,这种大量的错误就会被 隐藏起来..那么各种奇怪的问题,也就出来了.
         虽然发现了这种问题,解决起来不难,但是非常麻烦,因为在改回去的时候,就得注意同样的plyItem->CppPly到底应该改成哪一个对象变量了.       过程中还遇到了其它一些问题,修复过程中的错误方法,导出后来解决难度比较大,但是好在量少,已基本解决完成,而上面的错误,还没有 解决完,而每解决一处都得异常的小心.. 
  • 相关阅读:
    利用委托传值
    引用类型的默认值为Null
    字符串加密与解密 (MD5)
    讲解Guitar Pro如何显示吉他面板功能
    Guitar Pro 7 常见问题之版本更新
    Guitar Pro7常见问题之滑音的讲解
    Guitar Pro 7如何新建吉他谱步骤
    带你演绎Guitar Pro 7制作吉他谱前的步骤
    如何添加音效使乐曲更加丰富?
    Guitar Pro 吉他软件功能介绍
  • 原文地址:https://www.cnblogs.com/dreamzgj/p/4369154.html
Copyright © 2011-2022 走看看