由于工作需要,趁假期这两天补充下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实现好像很少,谁给推荐个?