UE4.27, 揣摩源码, 序列化 (二) FBitReader, FBitWriter
// FBitReader, FBitWriter这两个类仅被网络相关的事务使用
// This class is exclusively used by the netcode
2.1. SVO
和array的正反序列化相同,内部都存在着,对类型是TAarry<uint8>的字节单位的内存的处理
本质都是对内存对象的读写,不过是不同的应用场景
然而不同的是,array的正反序列化里,字节内存块由继承获得,bit的则是以名为Bytes的非公开变量维护,该字节内存数组在构造时决定大小
2.2. 关键继承关系
FBitReader, FBitWriter
struct FBitReader : public FBitArchive
struct FBitWriter : public FBitArchive
FBitArchive
class FBitArchive: public FArchive
class FArchive : private FArchiveState
2.3. 位拷贝函数appBitsCpy
appBitsCpy( uint8* Dest, int32 DestBit, uint8* Src, int32 SrcBit, int32 BitCount )
与memcpy不同,这个函数允许特定位置开始的bit单位的内存拷贝。
经过测试,至少在DestBit和SrcBit为同一个8倍整数时,功能为从这个位置开始,从src拷贝BitCount个bit到dest,优先拷贝某字节的数据低位bit
2.4. 大同小异的实现
如果我们观察SerializeBits, SerializeBitsWithOffset内部的appBitsCpy上下文处理,(不论read还是write)
不论是因为依次正反序列化不同的变量,还是因为多线程优化的考量,
它会因为读或写的需求而递次改变其中一个destbit/srcbit参数。(如果我们观察调用它的区域上下文,另一个参数也被管理着,并在调用时传入serialize产生影响)
因此,这个类存在的意义、显然就是网络传递前后的数据流因其内部并没有以8bits对齐,或者说压根没有对齐、所以特地设立按bit递次正反序列化的方法来处理
而这个功能的基础就是比特级拷贝,也就是2.3的appbitscpy