zoukankan      html  css  js  c++  java
  • SmartFoxServer项目完成总结

    总体来说,如果是想做一个比较简单的虚拟现实服务,拿sfs来做还是很方便的,省去了前期构造服务器网络,实现数据库接口,数据同步等等一些基础功能的时间,可以一上来就直奔主题,开发自己项目相关的功能. 
    Sfs的接口封装也比较简单,基本上看到接口名就能知道是做什么用的,参数是什么意义,而且他的文档也比较详细,对于非服务器开发专业人员也比较方便.sfs的定义也主要在此,比如他最早支持的flash客户端api. 

      而随着sfs的成功,也开始将目标转向了目前新兴的iphone, android, sillverlight, unity等 客户端.这次使用c# client api做了一个winform测试程序,使用起来也是非常的方便. 

      第一次拿sfs做商业项目,也还是遇到了一些问题,总结一下,另外还有一些未完善的地方,后面再花时间继续实现. 

      CustomLogin的处理在zone extension里,必须先join room才能使用xt message.所以需要先写一个zone extension,在这里处理登录验证,注意验证成功后需要向客户端发送room list, 客户端必须收到room list消息才能做后面的操作,这是sfs限制死了的.

      本来我想在extension里让客户端验证成功后直接join room,未果,调试良久才发现,客户端未收到room list,不能join room. 

      Sfs的user variables只支持bool, integer, string类型,其他类型的数据不能同步.这个问题困扰了我差不多一个小时,最后在客户端一步步跟踪属性同步过程时才发现,其他类型的variable都被忽略掉了. 

      于是,为了同步float坐标数据,我不得不加上了float.toString(),数据量又大了不少. 

      Sfs消息定义的方式,不要像sample里那样,直接写字符串名字,改用枚举或者常量定义.每个extension name和command name都只有一个字节,在枚举中也可以定义出128个,完全够用. 

      这样可以省不少带宽占用量,可以在client上开启debug message开关,看一下一个简单的消息发送会占多少字节. 

       如果想同时在eclipse和netbeans下对一个项目进行开发,注意文件编码的问题.eclipse下创建的文件默认编码为gbk,netbeans下创建的文件默认为utf-8,而在eclipse下导入文件时他并不会自动检测文件的编码,所以,你需要在文件的属性里手动设置一下编码方式.另外,netbeans下要在文件中显示中文字符只能使用utf-8,使用gbk会出乱码,如果出现此类错误,修改一下文件编码方式以及指定新的编码即可. 

      要关于利用IDE编译环境.在项目最开始的一周里,我使用trace来进行调试,一次次的通过trace打印出中间变量,然后再修改代码,再启动服务器,再看trace信息……在我快要陷入崩溃绝望之时,终于,决定建一个好用的集成调试环境.在尝试eclipse失败后,我成功的在netbeans中打下了断点,单kh步跟踪,于是,整个世界变得清静多了…… 

      关于如何在netbeans中调试extension,可以参考我之前的一篇文章 

      sfs中服务器与客户关通信的协议有三种:xml,json和raw string,使用json会比xml节省不少字节,但其仍然占用比较大的带宽开销.如果是数据交互量比较小的应用,这个问题不会太大,但对于即时战斗类MMO来说,可能会成为一个比较大的问题.尝试了一下使用raw string的方式传递结构体,但是没找到比较好的方法,以后有机会再继续,如果可能的话,结合google proto buffer和raw string方式,将会是一个比较好的方案. 

      在处理extension message时,按照示例所提供的方法,先取出cmd,然后使用equal的方式一个个进行比较,然后转到对应的处理函数.对于消息种类比较小的应用来说还没发现问题,但是对于有大量自定义消息的应用,这里就需要修改一下了. 

      sfs的db extension目前看起来只能在当前线程中处理,并且是阻塞式的,暂时没有尝试使用多个线程操作数据库,也没有把数据库操作改为异步操作.这也是未来需要进一步改进的地方. 

      暂时不清楚SFS是否会为每个room开启一个单独的线程,或者是每个extension一个线程.如果zone里房间数比较多的话,分多个线程处理也是需要的,未来也需要继续考虑一下多线程的问题. 

      Sfs的实现是把一个room当成了一个广播单元,这对于开房间类的游戏来说没有问题,但是如果相用它来做MMO就需要注意一下,因为user variables的同步是以整个room为单位的,也就是当一个房间里人数达到几百人甚至几千人的时候,某个玩家的进入和退出房间消息,属性修改消息的广播量都会是巨大的.但是在没有源码的情况下想要修改这个不大容易,也就是限制了sfs的应用环境.

      原文转自:
    http://www.cppblog.com/helloqing ... 0/08/08/122648.html

  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/shuishenwuyu/p/3894558.html
Copyright © 2011-2022 走看看