UE4.27, 揣摩源码, 序列化 (二) FBitReader, FBitWriter

2.  继续看bit序列化,这个设计是网络传输的关键一环

// FBitReader, FBitWriter这两个类被网络相关的事务使用
// This class is exclusively used by the netcode

  2.1. SVO

    和array的正反序列化相同,内部都存在着,对类型是TAarry<uint8>的字节单位的内存的处理

    本质都是对内存对象的读写,不过是不同的应用场景
    然而不同的是,array的正反序列化里,字节内存块由继承获得,bit的则是以名为Bytes的非公开变量维护,该字节内存数组在构造时决定大小

  2.2. 关键继承关系

    FBitReaderFBitWriter
      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

posted @ 2024-12-26 18:05  在找饭吃的陈  阅读(31)  评论(0)    收藏  举报