void DoTick()
        {
            _frameNumber++;
            _sealedFrameNumber = _frameNumber - 10;
            if (_sealedFrameNumber < 1)
            {
                _sealedFrameNumber = 1;
            }

            if (_receivedInputFrameDeltas.Count > 0)
            {
                SWConsole.Crit($"MockIO: DoTick playerFrameCount={_receivedInputFrameDeltas.Count}");
                InputFrameDelta delta = _receivedInputFrameDeltas.Peek();

                if (true)
                {
                    delta = _receivedInputFrameDeltas.Dequeue();
                    //SWConsole.Crit($"MockIO: DoTick playerFrameCount 1 ={_receivedInputFrameDeltas.Count}");
                    _inputFrameDeltas[_frameNumber] = delta;

                    _data.Reset();

                    byte length = (byte)delta.bytes.DataLength;
                    _data.Push(length);
                    _data.PushAll(delta.bytes);

                    SWConsole.Crit($"MockIO: DoTick send PLAYER={delta.frameNumber} roomStep={_frameNumber}");

                    MockHandleInputFrameOperaion operation = new MockHandleInputFrameOperaion(_handler, _pingMilliseconds);
                    operation.inputFrameData = SWBytes.Clone(_data);
                    operation.playerLastInputFrameOnServer = _receivedInputFrameDeltas.Count;
                    operation.predictionFrameNumber        = _predictedFrameNumber;
                    operation.correctFrameNumber           = _correctFrameNumber;
                    operation.roomStep          = _frameNumber;
                    operation.sealedFrameNumber = _sealedFrameNumber;
                    _operationQueue.AddOperation(operation);
                    return;
                }
                //else if(delta.predictedServerFrameNumber < _frameNumber)
                //{
                //    delta = _receivedInputFrameDeltas.Dequeue();
                //    delta.version = 1;
                //    _inputFrameDeltas[delta.predictedServerFrameNumber] = delta;

                //    _data.Reset();

                //    byte length = (byte)delta.bytes.DataLength;
                //    _data.Push(length);
                //    _data.Push(delta.bytes, 0);

                //    SWConsole.Crit($"MockIO: DoTick send PLAYER={delta.frameNumber} roomStep={_frameNumber} prediction={delta.predictedServerFrameNumber}");
                //    _frameNumber--;
                //    _sealedFrameNumber = _frameNumber - 10;
                //    if (_sealedFrameNumber < 1)
                //    {
                //        _sealedFrameNumber = 1;
                //    }
                //    MockHandleInputFrameOperaion operation = new MockHandleInputFrameOperaion(_handler, _pingMilliseconds);
                //    operation.inputFrameData = SWBytes.Clone(_data);
                //    operation.playerLastInputFrameOnServer = _receivedInputFrameDeltas.Count;
                //    operation.predictionError = _predictionError;
                //    operation.roomStep = delta.predictedServerFrameNumber;
                //    operation.version = delta.version;
                //    operation.sealedFrameNumber = _sealedFrameNumber;
                //    _operationQueue.AddOperation(operation);
                //    return;
                //}
            }

            {
                _lastPredictedFrameNumber = _frameNumber;
                InputFrameDelta delta = new InputFrameDelta();
                delta.frameNumber = 0; //playerFrameNumber
                _inputFrameDeltas[_frameNumber] = delta;

                _data.Reset();
                _data.Push((byte)0); //length
                SWConsole.Crit($"MockIO: DoTick send EMPTY={delta.frameNumber} roomStep={_frameNumber}");

                MockHandleInputFrameOperaion operation = new MockHandleInputFrameOperaion(_handler, _pingMilliseconds);
                operation.inputFrameData = SWBytes.Clone(_data);
                operation.playerLastInputFrameOnServer = _receivedInputFrameDeltas.Count;
                operation.predictionFrameNumber        = _predictedFrameNumber;
                operation.correctFrameNumber           = _correctFrameNumber;
                operation.roomStep          = _frameNumber;
                operation.sealedFrameNumber = _sealedFrameNumber;
                _operationQueue.AddOperation(operation);
            }
        }