public Bitstream.Buffer Update(float dt, PacketLaneOutput outputFn)
        {
            while (_recvTail != _recvHead)
            {
                if (_recv[_recvTail].buf != null)
                {
                    Bitstream.Buffer ret = new Bitstream.Buffer();
                    Bitstream.Copy(ret, _recv[_recvTail]);
                    _recv[_recvTail++].buf = null;
                    _recvTotal++;
                    return ret;
                }
                else
                {
                    _recvGaps++;
                    _recvTotal++;
                    _recvTail++;
                }
            }

            if (dt >= 0)
            {
                foreach (Bitstream.Buffer b in _send)
                {
                    outputFn(b);
                }
                _send.Clear();
            }

            return null;
        }
        public netki.Bitstream.Buffer Update(float dt, PacketLaneOutput outputFn)
        {
            // dequeue in order.
            if (_recv[_recvPos].buf != null)
            {
                _recvPending--;
                Bitstream.Buffer ret = new Bitstream.Buffer();
                Bitstream.Copy(ret, _recv[_recvPos]);
                _recv[_recvPos++].buf = null;
                return ret;
            }

            // no send permitted.
            if (dt < 0)
                return null;

            // advance ack tail.
            while (_sendAckTail != _sendHead && _sent[_sendAckTail].buf == null)
                _sendAckTail++;

            // all outgoing packets
            for (byte i = _sendAckTail; i != _sendHead; i++)
            {
                if (_sent[i].buf == null)
                    continue;

                // If pending sends
                if (_sendTimer[i] <= 0.0f)
                {
                    Bitstream.Buffer buf = Bitstream.Buffer.Make(new byte[1024]);
                    WrapOut(buf, _sent[i], i);
                    buf.Flip();
                    outputFn(buf);
                    _ackFlushTimer = 0.0f;
                    if (_sendTimer[i] < 0.0f)
                        _resentTotal++;
                    _sendTimer[i] = _resendTime;
                    _sentTotal++;
                }
                else
                {
                    _sendTimer[i] -= dt;
                    if (_sendTimer[i] == 0)
                        _sendTimer[i] = -0.01f;
                }
            }

            if (_ackOutHead != _ackOutTail)
            {
                _ackFlushTimer += dt;
                if (_ackFlushTimer > 0.30f * _resendTime)
                {
                    Bitstream.Buffer buf = Bitstream.Buffer.Make(new byte[1024]);
                    WrapOut(buf, null, 0);
                    buf.Flip();
                    outputFn(buf);
                }
            }

            return null;
        }