public TickObjectEnumerator(Msg_SC_Snapshot snapshot) { mSnapshot = snapshot; mTickObject = null; mIndex = -1; mLength = snapshot.TickObjectLength; }
public TickObjectEnumerator(TickObject tickobject) { mSnapshot = null; mTickObject = tickobject; mIndex = -1; mLength = tickobject.TickObjectLength; }
public Offset <Msg_SC_Snapshot> SampleSnapshot(FlatBufferBuilder fbb, bool full) { return(Msg_SC_Snapshot.CreateMsg_SC_Snapshot( fbb, tickCount, mSnapshotOverTick, full, mTickObjects.SampleSnapshot(fbb, full))); }
MessageHandleResult SnapshotHandler( NetConnection connection, ByteBuffer byteBuffer, NetIncomingMessage message) { Msg_SC_Snapshot snapshot = InstancePool.Get <Msg_SC_Snapshot>(); Msg_SC_Snapshot.GetRootAsMsg_SC_Snapshot(byteBuffer, snapshot); SyncManagerClient.Instance.FullUpdate(snapshot); GameStateLog.Info("apply full update"); TransitTo <InGame>(); return(MessageHandleResult.Finished); }
public void FullUpdate(Msg_SC_Snapshot snapshot) { mServerTick = snapshot.TickNow; mSimulateTicks = 0; mTickObjects.FullUpdate(new TickObjectDictionary.TickObjectEnumerator(snapshot)); mHasFullUpdated = true; if (null != mProcessing) { ByteBufferPool.Dealloc(ref mProcessing); } while (mCachedSnapshots.Count > 0) { ByteBuffer bb = mCachedSnapshots.Dequeue(); ByteBufferPool.Dealloc(ref bb); } }
void Simulate() { if (null == mProcessing && mCachedSnapshots.Count < cacheSnapshots) { return; } if (null == mProcessing) { mProcessing = mCachedSnapshots.Dequeue(); } int simulateCount = 1; uint sot = Game.Instance.snapshotOverTick; if (mCachedSnapshots.Count > cacheSnapshots - 1) { uint k = (uint)mCachedSnapshots.Count; uint ticksToSimulate = (k + 1) * sot - mSimulateTicks; uint ticksSupposeToSimulate = cacheSnapshots * sot - mSimulateTicks; simulateCount = Mathf.Max(1, Mathf.FloorToInt((float)ticksToSimulate / ticksSupposeToSimulate)); } Msg_SC_Snapshot ss = InstancePool.Get <Msg_SC_Snapshot>(); Msg_SC_Snapshot.GetRootAsMsg_SC_Snapshot(mProcessing, ss); for (int i = 0; i < simulateCount; ++i) { mServerTick = ss.TickNow - sot + mSimulateTicks; float nt = (float)(mSimulateTicks + 1) / sot; mTickObjects.Simulate(nt, new TickObjectDictionary.TickObjectEnumerator(ss)); ++mSimulateTicks; ++mServerTick; if (mSimulateTicks >= sot) { mSimulateTicks = 0; ByteBufferPool.Dealloc(ref mProcessing); if (mCachedSnapshots.Count <= 0) { break; } mProcessing = mCachedSnapshots.Dequeue(); Msg_SC_Snapshot.GetRootAsMsg_SC_Snapshot(mProcessing, ss); } } }
MessageHandleResult SnapshotHandler( NetConnection connection, ByteBuffer byteBuffer, NetIncomingMessage message) { Msg_SC_Snapshot snapshot = InstancePool.Get <Msg_SC_Snapshot>(); Msg_SC_Snapshot.GetRootAsMsg_SC_Snapshot(byteBuffer, snapshot); if (snapshot.Full) { SyncManagerClient.Instance.FullUpdate(snapshot); return(MessageHandleResult.Finished); } else { SyncManagerClient.Instance.AddDelta(snapshot.TickNow, byteBuffer, message); return(MessageHandleResult.Processing); } }
public void AddDelta(uint tick, ByteBuffer byteBuffer, NetIncomingMessage msg) { if (!mHasFullUpdated || tick <= mServerTick) { TCLog.WarnFormat("drop delta update, hasFullUpdated:{0}, tick:{1}, current serverTick:{2}", mHasFullUpdated, tick, mServerTick); } else { mCachedSnapshots.Enqueue(byteBuffer); int choke = msg.ReadInt32(); InputManager.Instance.UpdateChoke(choke); for (int i = 0; i < Game.Instance.snapshotOverTick; ++i) { InputManager.Instance.AckInput(msg.ReadUInt32()); } Msg_SC_Snapshot snapshot = InstancePool.Get <Msg_SC_Snapshot>(); Msg_SC_Snapshot.GetRootAsMsg_SC_Snapshot(byteBuffer, snapshot); mTickObjects.ApplyDeltaForPredict(new TickObjectDictionary.TickObjectEnumerator(snapshot)); } }
static VectorOffset SampleSnapshot(IList <ITickObject> list, FlatBufferBuilder fbb, bool full) { var tickObjectOffset = default(VectorOffset); if (null != list && list.Count > 0) { var boxArray = OffsetArrayPool.Alloc <TickObject>(list.Count); foreach (var obj in list) { boxArray.offsets[boxArray.position++] = TickObject.CreateTickObject( fbb, obj.id, obj.type, SampleData(obj, fbb, full), SampleEvents(obj, fbb, full), SampleSnapshot(obj.children, fbb, full)); } Msg_SC_Snapshot.StartTickObjectVector(fbb, boxArray.position); tickObjectOffset = Helpers.SetVector(fbb, boxArray); OffsetArrayPool.Dealloc(ref boxArray); } return(tickObjectOffset); }