RAKNET内核 - BitStream在游戏中的高级概念和使用例子
来源:互联网 发布:翻墙软件 自由 编辑:程序博客网 时间:2024/05/22 06:44
如果您还不知道RakNet如何发送一个数据包,请先阅读《RAKNET内核 - 数据包的感念》,本文讲基于该篇文章的例子做进一步的的补充,来阐述实际游戏使用BitStream数据流的方式。
官方参考资料:http://www.jenkinssoftware.com/raknet/manual/bitstreams.html
1. 什么是BitStream
BitStream就是字节流的意思,在网络传输中字节流的概念相当于开源节流,只发送应该发送的数据,不会像C++编程里面的内存占用情况。一些数据没必要发送整个结构体的建议使用下面的方式来节省网络流量。因为对于玩家或者其它app的终端用户来说,流量直接影响网速,游戏的响应速度是玩家体验的前提条件,连玩都玩不了就谈不上优化游戏和增加副本等玩法了。
我会使用一个小例子说明游戏服务器和玩家客户端之间如何处理一个Boss的即时坐标的,有时候Boss动了,有时候它根本没动,那么我没必要每次都传送该Boss的坐标吧。
虽然这个例子也是每次都传送Boss的即时状态,但是对于坐标没有改变时可不传。
2. 游戏服务端
if (kbhit()){ Gets(message,sizeof(message)); puts(message); // 输出自己敲打的信息 server->Send(message, (int) strlen(message)+1, HIGH_PRIORITY, RELIABLE_ORDERED, 0, RakNet::UNASSIGNED_SYSTEM_ADDRESS, true); // 下面的代码是本例子新增的,当服务端输入stand的时候代表Boss没动,当输入move的时候Boss移动到Vector3(4,5,6) if (strcmp(message, "stand")==0) { RakNet::BitStream bs; bs.Write((RakNet::MessageID)ID_TIMESTAMP); bs.Write(RakNet::GetTime()); bs.Write((unsigned char) 253); bs.Write(false); server->Send(&bs, HIGH_PRIORITY, RELIABLE, 0, RakNet::UNASSIGNED_SYSTEM_ADDRESS, true); } if (strcmp(message, "move")==0) { RakNet::BitStream bs; bs.Write((RakNet::MessageID)ID_TIMESTAMP); bs.Write(RakNet::GetTime()); bs.Write((unsigned char) 253); bs.Write(true); bs.Write(4.0f); bs.Write(5.0f); bs.Write(6.0f); server->Send(&bs, HIGH_PRIORITY, RELIABLE, 0, RakNet::UNASSIGNED_SYSTEM_ADDRESS, true); }}
3. 玩家客户端
case 253:printf("BitStream...");getFromBitStream(p);break;
Define Function getFromBitStream()
void getFromBitStream(RakNet::Packet* p) { RakNet::MessageID useTimeStamp; RakNet::Time timeStamp; unsigned char typeId; float x,y,z; bool isMovable; RakNet::BitStream bs(p->data, p->length, false); bs.Read(useTimeStamp); bs.Read(timeStamp); bs.Read(typeId); bs.Read(isMovable); if (isMovable) { bs.Read(x); bs.Read(y); bs.Read(z); printf("Boss的坐标移动至 {x: %f, y:%f, z:%f}\n", x, y, z); } else { printf("Boss没动\n"); }}
4. 运行效果
5. 总结
- BitStream可以很方便的逻辑层发送数据而无需经过定义需要发送的数据的格式。
- 实际游戏项目的需要判断的逻辑条件非常,您会发现本文介绍的例子多了一些判断条件,这样就可能影响游戏的运行性能和用户体验。
上面两条就是我们考虑使用Struct还是BitStream所需要考虑的问题,当我们传送的数据有固定的格式,建议使用Struct。当BitStream无固定格式的方式发送数据导致性能低下的时候应该马上改良,尽可能的使用Struct。
您可以修改并重新发布本文,如果您能留下本文的参考连结,万分谢谢!
如果您对本文存在疑问,欢迎留言或者直接对本文评论,我会在看到的第一时间回复您。
- RAKNET内核 - BitStream在游戏中的高级概念和使用例子
- RakNet(15) -- BitStream
- 一日一点RakNet(16)--BitStream
- 在RakNet发包的时候使用 RakNet::UNASSIGNED_SYSTEM_ADDRESS
- 在RakNet发包的时候使用 RakNet::UNASSIGNED_SYSTEM_ADDRESS
- cursor类的用法和概念(在Android中的使用)
- 关于sqlite在VC中的配置和例子使用
- lua在游戏中的使用
- 内核中的时间概念
- CSS在使用中的高级技巧汇总
- 游戏开发——随机数和概率在游戏中的使用
- untiy 3d ShaderLab第 1 章Shader(着色器)的概念和在 3D 游戏中的作用
- linux内核同步机制中的概念介绍和方法
- linux内核同步机制中的概念介绍和方法
- ListView在mobile中的使用例子
- tab控件在SDK中的使用例子
- gson在android中的使用例子
- zip和*在python中的具体例子
- Android image 文件系统
- WCF - 安全(Security)
- 黑马程序员---集合框架(Collection)和泛型
- 破解压缩密码的程序
- python核心编程6-14习题的解题思路
- RAKNET内核 - BitStream在游戏中的高级概念和使用例子
- SOJ3600 Balanced Interval
- android MediaPlayer音频播放demo
- [数字信号处理] FIR滤波器基础
- 素材
- 用过SDE连接,添加数据集Dataset
- UINavigationController 改变返回按钮标题
- IBM X3650 M2服务器内存安装
- 有关GetPrivateProfileString的使用方法