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