コード例 #1
0
        public MemoryStream SerializeSinaglePackage(UpdateLatestPacakge msg)
        {
            MemoryStream stream = ObjectAllocatorHolder <MemoryStream> .Allocate();

            stream.Seek(0, SeekOrigin.Begin);
            var  binaryWriter = MyBinaryWriter.Allocate(stream);
            long bodyLength;
            var  old = MessagePool.GetPackageBySeq(msg.Head.BaseUserCmdSeq);

            if (old != null)
            {
                msg.Head.Serialize(binaryWriter);
                bodyLength = SerializeComponents(binaryWriter, old.UpdateComponents, msg.UpdateComponents);
            }
            else
            {
                msg.Head.BaseUserCmdSeq = -1;
                msg.Head.Serialize(binaryWriter);
                bodyLength = SerializeComponents(binaryWriter, _emptyUpdateComponents, msg.UpdateComponents);
            }

            AssertUtility.Assert(bodyLength < 65535);
            msg.Head.ReWriteBodyLength(binaryWriter, (short)bodyLength);
            binaryWriter.ReleaseReference();
            return(stream);
        }
コード例 #2
0
        public VNetPacketMemSteam SerializeSinaglePackage(UpdateLatestPacakge msg)
        {
            VNetPacketMemSteam stream = VNetPacketMemSteam.Allocate();

            stream.Stream.Seek(0, SeekOrigin.Begin);
            var  binaryWriter = MyBinaryWriter.Allocate(stream.Stream);
            long bodyLength;
            var  old   = MessagePool.GetPackageBySeq(msg.Head.LastAckUserCmdSeq);
            int  count = 0;

            if (old != null)
            {
                msg.Head.Serialize(binaryWriter);
                bodyLength = SerializeComponents(binaryWriter, old.UpdateComponents, msg.UpdateComponents, out count);
            }
            else
            {
                msg.Head.LastAckUserCmdSeq = -1;
                msg.Head.Serialize(binaryWriter);
                bodyLength = SerializeComponents(binaryWriter, _emptyUpdateComponents, msg.UpdateComponents, out count);
            }

            AssertUtility.Assert(bodyLength < 65535);

            msg.Head.ReWriteComponentCountAndBodyLength(binaryWriter, (short)bodyLength, (byte)count);
            binaryWriter.ReleaseReference();
            return(stream);
        }
コード例 #3
0
        public object Deserialize(Stream inStream)
        {
            ReusableList <UpdateLatestPacakge> list = ReusableList <UpdateLatestPacakge> .Allocate();

            BinaryReader binaryReader = new BinaryReader(inStream);
            int          count        = binaryReader.ReadByte();

            for (int i = 0; i < count; i++)
            {
                UpdateLatestPacakge pacakge = UpdateLatestPacakge.Allocate();

                pacakge.Head.Deserialize(binaryReader);
                var seq        = pacakge.Head.UserCmdSeq;
                var bodyLenght = pacakge.Head.BodyLength;
                if (MessagePool.GetPackageBySeq(seq) == null)
                {
                    var baseSeq = pacakge.Head.BaseUserCmdSeq;
                    var old     = MessagePool.GetPackageBySeq(baseSeq);
                    if (old != null)
                    {
                        pacakge.CopyUpdateComponentsFrom(old.UpdateComponents);
                    }



                    for (int c = 0; c < pacakge.Head.ComponentCount; c++)
                    {
                        var opType = (ComponentReplicateOperationType)binaryReader.ReadByte();

                        var patch = CreateEmptyComponentPatch(opType);
                        patch.DeSerialize(binaryReader, _componentSerializerManager);
                        ApplyPatchTo(patch, pacakge.UpdateComponents);

                        patch.ReleaseReference();
                    }

                    if (pacakge.Head.ComponentCount == pacakge.UpdateComponents.Count)
                    {
                        MessagePool.AddMessage(pacakge);
                        pacakge.AcquireReference();
                        list.Value.Add(pacakge);
                    }
                    else
                    {
                        _logger.WarnFormat("Skip package {0} with length {1} baseSeq;{2}", pacakge.Head.UserCmdSeq, pacakge.Head.BodyLength, pacakge.Head.BaseUserCmdSeq);
                    }
                }
                else
                {
                    _logger.DebugFormat("Skip package {0} with length {1}", pacakge.Head.UserCmdSeq, pacakge.Head.BodyLength);
                    binaryReader.BaseStream.Seek(bodyLenght, SeekOrigin.Current);
                }


                pacakge.ReleaseReference();
            }

            return(list);
        }
コード例 #4
0
        public void SyncToEntity(IPlayerUserCmdGetter getter, UpdateLatestPacakge package)
        {
            PlayerEntity playerEntity = getter.OwnerEntity as PlayerEntity;
            IGameEntity  gameEntity   = playerEntity.entityAdapter.SelfAdapter;
            int          count        = package.UpdateComponents.Count;

            for (var i = 0; i < count; i++)
            {
                IUpdateComponent component = package.UpdateComponents[i];
                var id     = component.GetComponentId();
                var target = gameEntity.GetComponent(id);
                if (target == null)
                {
                    target = gameEntity.AddComponent(id);
                }

                var p = GetProfile(component.GetComponentId());
                try
                {
                    p.BeginProfileOnlyEnableProfile();
                    ((INetworkObject)target).CopyFrom(component);
                    if (id == (int)EComponentIds.SendUserCmd)
                    {
                        UserCmd cmd = UserCmd.Allocate();
                        CopyForm(cmd, component as SendUserCmdComponent);
                        playerEntity.userCmd.AddLatest(cmd);
                        cmd.Seq        = package.Head.LastUserCmdSeq;
                        cmd.SnapshotId = package.Head.LastSnapshotId;
                        cmd.ReleaseReference();
                    }
                }
                finally
                {
                    p.EndProfileOnlyEnableProfile();
                }
            }
        }
コード例 #5
0
        public void SyncToEntity(IUserCmdOwner owner, UpdateLatestPacakge package)
        {
            PlayerEntity playerEntity = owner.OwnerEntity as PlayerEntity;
            IGameEntity  gameEntity   = playerEntity.entityAdapter.SelfAdapter;

            foreach (var component in package.UpdateComponents)
            {
                var target = gameEntity.GetComponent(component.GetComponentId());
                if (target == null)
                {
                    target = gameEntity.AddComponent(component.GetComponentId());
                }
                ((INetworkObject)target).CopyFrom(component);
                if (component is SendUserCmdComponent)
                {
                    UserCmd cmd = UserCmd.Allocate();
                    CopyForm(cmd, component as SendUserCmdComponent);
                    playerEntity.userCmd.AddLatest(cmd);
                    cmd.Seq        = package.Head.UserCmdSeq;
                    cmd.SnapshotId = package.Head.LastSnapshotId;
                    cmd.ReleaseReference();
                }
            }
        }