快速结构序列化

时间:2018-08-09 19:36:53

标签: c++ serialization constructor

我正在为一个类编写一个函数,该函数将代表数据包的结构序列化到单个缓冲区,然后将其发送给多人游戏。 为了使该函数尽可能通用,我建议保留一个用于容纳结构的缓冲区,并提供一个模板函数,该函数将在缓冲区上构造该结构并返回对其的引用。这是我尝试过的...

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。

我猜这不起作用的原因是我没有完全理解构造函数的工作原理。当数据包由服务器发送或由客户端接收时,数据包将完全清零。有人可以指出我正确的方向吗?谢谢!

0 个答案:

没有答案