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;
 }
示例#3
0
 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)));
 }
示例#4
0
        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);
        }
示例#5
0
 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);
     }
 }
示例#6
0
        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);
                }
            }
        }
示例#7
0
        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);
            }
        }
示例#8
0
        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));
            }
        }
示例#9
0
        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);
        }