public void Read(BinaryReader reader)
    {
        ushort entityCount = reader.ReadUInt16();

        entities = new EntitySyncData[entityCount];
        for (int i = 0; i < entityCount; ++i)
        {
            var edata = new EntitySyncData();
            entities[i] = edata;

            edata.entityID = reader.ReadUInt16();

            var componentCount = reader.ReadByte();
            edata.components = new ComponentSyncData[componentCount];
            for (int j = 0; j < componentCount; ++j)
            {
                var cdata = new ComponentSyncData();
                edata.components[j] = cdata;

                cdata.componentID = reader.ReadByte();
                var dataSize = reader.ReadUInt16();
                cdata.data = reader.ReadBytes(dataSize);
            }
        }
    }
    FramePacket BuildFramePacket()
    {
        FramePacket packet = new FramePacket();

        var entities = syncedEntities.GetEntities();

        packet.entities = new EntitySyncData[entities.Length];

        int eidx = 0;

        foreach (var ent in syncedEntities.GetEntities())
        {
            var syncData = new EntitySyncData();
            packet.entities[eidx] = syncData;

            syncData.entityID = ent.frameSync.entityID;

            var syncComponents = ent.GetSyncComponents();
            syncData.components = new ComponentSyncData[syncComponents.Length];
            for (int j = 0; j < syncComponents.Length; ++j)
            {
                var pair     = syncComponents[j];
                var compData = new ComponentSyncData();
                syncData.components[j] = compData;

                compData.componentID = (byte)pair.index;

                using (var stream = new MemoryStream()) {
                    var writer = new BinaryWriter(stream);
                    pair.component.WriteBytes(writer);
                    compData.data = stream.ToArray();
                }
            }

            ++eidx;
        }

        return(packet);
    }