一日一点RakNet(3)--介绍
介绍
安装
请参考Compiler Setup页,有什么问题在这块有解答。如果有额外的问题参考FAQ,http://www.jenkinssoftware.com,或者邮件联系我们。高级用户可以直接跳转到Code tutorial。初学者或想要多了解点RakNet的请继续阅读。
API描述
RakNet致力于网络和网络相关服务的游戏引擎。不仅包含了网络通信,也包括游戏级别复制,补丁升级,NAT穿透,和语音聊天。RakNet可以用于任何的应用,且可以与其他任何使用了RakNet的系统通信,不论它们位于同一个计算机,跨LAN,或跨Internet。尽管RakNet可以用于任何的网络应用,但是它主要致力于在线游戏,实现了网络游戏的共同功能需求;为了方便在线游戏编程提供了一些额外的功能。
网络101
游戏网络连接通常有两种类别:端到端模式和服务器/服务器模式。每一种模式以各种不同的方式和各种协议实现。然而,RakNet支持任意拓扑。
一般来讲,具有最好网络连接的最快的计算机应该充当服务器,其他的计算机作为客户端。
尽管有许多类型的编码数据包的方法,它们或者按照UDP数据包或者按照TCP数据包。TCP用于传输文件非常好,但是不太适合于游戏。使用TCP常常有延迟(导致游戏有很大延迟),并且是以流的形式到达,而不是数据包(这样你必须实现你自己的分包机制)。UDP包就比较好了,UDP包立即发送,并且是以包的形式发送,可以很容易区分数据。然而,额外的灵活性却带来了各种问题:
1. UDP包并不保证到达。你可能可以接收到所有发送的数据包,或者一个也接收不到,或发送数据包的一部分。
2. UDP数据包不保证按序到达。这在编程游戏时是很大的问题。例如你可能会在接收到一个坦克生成的消息之前,接收到一条坦克损毁的消息。
3. UDP数据包保证到达的正确性,但是并不能保证到达的数据不受黑客篡改。
4. UDP包并不需要接受连接。起初这个听起来还不错哦,但是当你意识到没有连接的保护时,游戏很容易遭到黑客时,就不会这么想了。例如,如果你有一个消息“Give such and such invulnerability”,黑客可以复制这条消息,每次在他们想要不受伤害时,可以将这条消息发送服务器。
5. UDP传输没有提供流控制或聚合,那可能过度发送复制件,不能有效数据发送。
RakNet如何帮助解决这些问题?
在最底层,RakNet’s 的端到端类,RakPeerInterface在UDP数据包之上提供了一层,透明地处理这些问题。使得编程者可以集中精力于游戏而不是通信引擎。
1. RakNet可以自动重发没有到达的数据
2. RakNet可以有效地自动排序到达的失序数据包。
3. RakNet可以保护传输的数据,如果数据遭到篡改,可以通知编程人员。
4. RakNet提供了一个快速,简单,连接层,它阻塞了未授权的传输。
5. RakNet透明地处理网络问题,例如流控制和聚合。
当然了,如果RakNet没能够很有效的处理这些问题,例如发送大量数据,使用阻塞操作上锁,或让RakNet很难利用这些优势,它也不会有如此多的应用。幸好情况不是这样的。
与其他的网络API不同:
1. RakNet在发送的数据中加入的控制数据非常少。
2. RakNet不会导致你不适用的功能的额外消耗。
3. RakNet有即时的连接与断开连接。
4. RakNet并不会假设网络是可靠的。RakNet会很好地处理连接问题,而不是仅仅阻塞,上锁或崩溃。
5. RakNet已经成功地用于很多游戏。事实证明它很好用。
6. RakNet很容易使用。
7. RakNet的文档很全面。每一个头文件有每一个类和函数的文档。也有Doxygen参考手册和HTML帮助文档。
RakNet可以为我们做哪些工作?
RakNet工作在字节流一层,带宽是很有效的,但是在你拥有较大控制权时,也要付出时间消耗的代价。RakNet提供了许多功能使得网络更加容易,包括远程调用,BitStream类,和自动对象同步。
大多数的游戏共享一组共同的功能,例如设置游戏玩家限制,密码生成,以及统计数据。RakNet博鳌扩所有这些功能,且又其他额外的功能。如果游戏需要使用RakNet,要检查RakNet还没有集成到你的游戏中。
最后,RakNet包含了一小组程序需要与你的游戏连接工作,例如主服务器或实时语音。
如下列出了一些你在RakNet之外可以做的一些工作:
1. 实现低带宽语音通信
2. 运行一个主服务器用于玩家寻找网络上的游戏。
3. 使用远程功能调用,允许你用变量参数调用其他计算机上的函数。
4. 获得统计数据,例如ping,包丢失,发送字节数,接收字节数,发送数据包,接收到的数据包数量,或其他更多的数据。
5. 每个数据包中可选的时间戳可以让你十分准确地知道一个动作是多长时间以前在另外的一个系统上执行的,尽管ping很流畅。
一日一点RakNet(3)--介绍的更多相关文章
- html5 meta(移动端)介绍及使用
随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移动互联应用开发也越来越受到人们的重视,用html5开发移动应用是最好的选择.然而,每一款手机有不同的分辨率,不同屏幕 ...
- Modernizr.js介绍与使用
Modernizr帮助我们检测浏览器是否实现了某个feature,如果实现了那么开发人员就可以充分利用这个feature做一些工作,反之没有实现开发人员也好提供一个fallback.所以,我们要明白的 ...
- AOP 的利器:ASM 3.0 介绍
引言 什么是 ASM ? ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态 ...
- 介绍几个python的音频处理库
一.eyeD3 直接在google上搜索python mp3 process ,推荐比较多的就是这个第三方库了.先来看看官方介绍吧. About eyeD3 is a Python tool for ...
- modernizr.js的介绍和使用
原文链接:https://www.cnblogs.com/-simon/p/5907053.html Modernizr帮助我们检测浏览器是否实现了某个feature,如果实现了那么开发人员就可以充分 ...
- JDBC(1)简单介绍/数据库的连接
初识JDBC: JDBC是java连接数据库的一个工具,没有这个工具,java将无法和数据库进行连接. JDBC API: JDBC是个“低级”接口,也就是说,他直接用于调用SQL命令. JDBC驱动 ...
- iOS开发-应用崩溃日志揭秘(一)
作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! 如果 ...
- Node实践之二
先从一个简单的demo说起,用cmd打开命令提示符,输入echo Hello,大家是不是看到终端上显示出了Hello字样,事实上这就是一个简单的事件. 回到正题,相信提到node.js,免不了让人想起 ...
- iOS测试常见崩溃
什么是崩溃日志,从哪里能得它? iOS设备上的应用闪退时,操作系统会生成一个崩溃报告,也叫崩溃日志,保存在设备上.崩溃日志上有很多有用的信息,包括应用是什么情况下闪退的.通常,上面有每个正在执行线程的 ...
随机推荐
- iOS APP程序启动原理
UIApplication 程序启动原理 一个应用程序运行就必须要有一个进程,一个进程至少要有一个线程,我们把这个线程叫做主线程,主线程开启之后会开启一个主运行循环,如果不开启一个运行循环,程序开启了 ...
- shell 中的<,<<,>,>>
相信熟悉linux的童鞋不会对这四个符合陌生,shell脚本的文件流有时候真的挺容易搞晕人的,下面我们一起了解一下吧 参考链接:http://www.cnblogs.com/chengmo/archi ...
- java 默认内存大小
https://www.cnblogs.com/jack204/archive/2012/07/02/2572932.html -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设 ...
- jenkins上展示html报告【转载】
转至博客:上海-悠悠 前言 在jenkins上展示html的报告,需要添加一个HTML Publisher plugin插件,把生成的html报告放到指定文件夹,这样就能用jenkins去读出指定文件 ...
- 也记一次性能优化:LINQ to SQL中Contains方法的优化
距离上一篇博文更新已经两个月过去了.在此,先表一表这两个月干了些啥: 世界那么大,我也想去看看.四月份的时候,我入职了上海的一家电商公司,职位是.NET高级开发工程师.工作一个月,最大的感受是比以前小 ...
- 【lua】可变长参数
lua可变长参数 在lua中可以使用...表示可变长参数,在函数内通过表访问可变参数 function rest(...) -- 把可变参数放在表类 local args = { ... } prin ...
- python怎么解压压缩的字符串数据
范例1: gzip import StringIO import gzip compresseddata = gzip方式压缩的字符串(html) compressedstream = StringI ...
- MYSQL注入天书之导入导出介绍
Background-3 导入导出相关操作的讲解 load_file()导出文件 Load_file(file_name):读取文件并返回该文件的内容作为一个字符串. 使用条件: A.必须有权限读取并 ...
- 第8天-setInterval/setTimeout
setInterval是什么? setInterval()方法重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟. setInterval(函数,间隔时间) 例如 function f ...
- RabbitMQ (九) 消息的参数详解
上篇文章讲了声明一个队列时的参数设置,这篇文章主要说一说发布消息时的参数设置. 发布消息时的完整入参是这样的: channel.BasicPublish ( exchange: "test_ ...