我正在为一个类编写一个函数,该函数将代表数据包的结构序列化到单个缓冲区,然后将其发送给多人游戏。 为了使该函数尽可能通用,我建议保留一个用于容纳结构的缓冲区,并提供一个模板函数,该函数将在缓冲区上构造该结构并返回对其的引用。这是我尝试过的...
template <typename T>
T& writePacket()
{
auto addr = m_writeOffset;
*m_writeOffset = T();
m_writeOffset += sizeof(T);
return *addr;
}
其中m_writeOffset是指向下一个可用字节的u8 *指针。
我敢肯定,返回一个指向结构所在的缓冲区的位置的指针会容易得多,但是我的每个数据包支撑都包含一个用于报头的静态字节,这使客户端可以识别数据包类型。以下是一些我可能发送的数据包的示例:
typedef u8 packet_header;
#pragma pack(push, 1)
struct CP_AttackEntity
{
static const packet_header header = 0;
u16 targetUID;
};
#pragma pack(pop)
#pragma pack(push, 1)
struct CP_EntityMoved
{
static const packet_header header = 3;
u16 uid;
Vec2<u16> pos;
};
#pragma pack(pop)
u8,u16只是uint8_t等的typedef。
我猜这不起作用的原因是我没有完全理解构造函数的工作原理。当数据包由服务器发送或由客户端接收时,数据包将完全清零。有人可以指出我正确的方向吗?谢谢!