网络服务器软件开发/中间件开发,关注ACE/ICE/boost

C++博客 首页 新随笔 联系 聚合 管理
  152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks
  由于工作需要,趁假期这两天补充下RakNet的相关应用,RakNet的官方网站:http://www.jenkinssoftware.com/index.html ,看介绍感觉很不错,侧重于游戏方面的开发,并实现了UDP的可靠传输,具备RPC的功能。我主要看了RPC相关的,从源代码可以得知,RPC的功能经过了几次完善,从RPC-->AutoRPC-->RPC3,心想终于找到c++实现的rpc了,高兴之余开始编译“Remote Procedure Calls”,“AutoRPC”和“RPC3”,其中前两个demo已经被标记为__DEPRECIATED,我先看的RPC3,结果没怎么看明白,所以又回头看了下他的发展史。RakNet的所有基于C/S模型的demo都在一个project中实现,不太适应这种风格,感觉初学者的模仿难度加大。碰到的几个需要注意的问题:
  1.RPC3只有非阻塞的调用模式,即client调用某个函数时立刻返回,调用结果以消息包的形式在随后的某个时刻返回。没有同步的调用,无疑加大了应用程序的复杂度,比如用户登录时获取可用服务器列表,一个同步调用会非常简单明了。如果是同步异步都提供就好了。
  2.异步接收网络消息,没有超时机制。这个问题比较麻烦,循环调用Receive,直到碰到返回NULL表示没有数据包可读了,这时只能sleep,相信大家比较反感这种策略,在通读manual时,注意到作者提到game tick的概念,我揣测作者认为这种策略是正常的.我运行RPC3的demo,CPU占用到50%,如果将Sleep(0),改为Sleep(30)则占用降到百分之几,FAQ中有如下描述:http://www.jenkinssoftware.com/raknet/manual/faq.html
           I get very high pings.
           Use 0 for the sleep timer, and put a Sleep(0) in your main game loop. This will ensure responsive context switches.
          I get very high CPU usage
           Use 30 for the sleep timer. This will ensure RakNet spends most of its time waiting.
  3.要严格保证Receive和DeallocatePacket的顺序,如果packet1 = Receive();packet2 = Receiver();则一定要保证DeallocatePacket(packet1),然后DeallocatePacket(packet2).因为他的内部是靠内存池的指针偏移来实现的。因此,如果想多线程处理似乎避免不了数据包的复制(?)
  总体来说,这个RPC还是比较简单的那种,传统的RPC方案一般提供IDL,然后生成对应的头文件和源文件,比如sunrpc,ice。
  附件里上传了自己改写的RPC3 demo,client和server是分开的,很容易添加新的功能,需要的朋友可以参考下,接触时间不长,不能保证没有错误哦。http://www.cppblog.com/Files/true/RPC3Demo.rar
  现在有个想法:数据库服务器基于RPC实现,不过C++的RPC实现好像很少,谁给推荐个?
posted on 2009-10-05 20:50 true 阅读(5028) 评论(4)  编辑 收藏 引用 所属分类: 网络服务器开发CORBA游戏开发RakNet

Feedback

# re: 体验RakNet的RPC3 2009-10-06 10:16 周龙亭
gSoap,C++实现的WebService  回复  更多评论
  

# re: 体验RakNet的RPC3[未登录] 2010-09-20 16:19 vincent
您好,有一个问题
我现在还不是很了解rpc,只知道它是基于函数的远程调用
而corba是针对对象的
显然在维护世界逻辑的时候,用corba应该会显得更简单一些
但是我看到使用rpc的人还是有很多的
我很好奇原因:)  回复  更多评论
  

# re: 体验RakNet的RPC3 2010-09-20 17:44 true
@vincent
CORBA,过于复杂了,RPC是远程过程调用,就是调用函数,AMI:是异步方法调用,调用的是对象的成员,CORBA和ICE里面都有AMI功能,但是写逻辑真的个人感觉不太适合直接用RPC或者AMI得方式,我一般用来处理一些很简单的功能,比如和中心服务器的交互,像分配全局session id等,而且CORBA有自己的类型系统(int,long,short ,string等),这些类型与客户端与服务器传输时常用的uint8,uint32等等,不一致,最好不要有两种类型系统  回复  更多评论
  

# re: 体验RakNet的RPC3 2012-04-09 04:10 雅歌
“异步接收网络消息,没有超时机制。这个问题比较麻烦,循环调用Receive,直到碰到返回NULL表示没有数据包可读了,这时只能sleep”

不懂你说这话是什么意思。
既然是异步的,你是被回调的,怎么还“循环调用Receive”?而且还要“sleep”?
莫名其妙  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理