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); }
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); }
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); }
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(); } } }
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(); } } }