0

发送信息消息的最佳方式是什么,例如:位置,健康到服务器,然后将它们广播给所有玩家(如何以一种好的和快速的方式“打包”和“解包”它们?)

我有一个管理结构(消息)的消息系统,例如:

struct position{
    long entityId;
    float x;
    float y;
    float z;
};

现在,我需要以快速的方式“打包”这些结构(我可以将此结构更改为任何其他建议)以将它们发送到服务器(通过网络),然后在客户端“解包”它们。

我对mmo游戏如何做到这一点很感兴趣。

谢谢!

4

1 回答 1

0

如果不能知道两端的架构(或者floatdouble换句话说,被授予特定架构)。

float类型表示可能在一个体系结构中符合IEEE 754规范,但并不是每个体系结构都符合它。始终使用大小已知的类型(例如uint16_t,uint32_t等 from stdint.h)并使用htons()/ ntohs()/ htonl()/ ntohl()(from arpa/inet.h)将主机字节顺序转换为网络字节顺序,反之亦然。

您还需要使用编译器扩展来授予对齐(例如__attribute__ ((align())), 或#pragma pack())以授予两端的结构对齐相同。

如果您不想要[或不能使用]编译器扩展(由于可移植性问题),那么结构不是[直接]的方式。

在这种情况下,您仍然可以在代码中使用结构,但您应该实现自定义序列化/反序列化例程以构建要传输的缓冲区(还要考虑主机到网络和网络到主机的字节顺序,并且永远不要使用float/double类型 [FPU]除非您在序列化例程中涵盖这些转换)。

另外,看看这个问题,并阅读它的所有答案,并给出正面的投票(我只需要补充一点,你应该只stdint.h在处理网络通信时使用类型)。

于 2016-07-10T01:59:49.257 回答