Write entire packet at once (#235)
Optimize `packWithoutCompression` function, close #234 .
This commit is contained in:
@ -55,28 +55,42 @@ func (p *Packet) Pack(w io.Writer, threshold int) error {
|
|||||||
func (p *Packet) packWithoutCompression(w io.Writer) error {
|
func (p *Packet) packWithoutCompression(w io.Writer) error {
|
||||||
buffer := bufPool.Get().(*bytes.Buffer)
|
buffer := bufPool.Get().(*bytes.Buffer)
|
||||||
defer bufPool.Put(buffer)
|
defer bufPool.Put(buffer)
|
||||||
|
|
||||||
|
// Pre-allocate room at the front of the packet for the length field
|
||||||
buffer.Reset()
|
buffer.Reset()
|
||||||
n, err := VarInt(p.ID).WriteTo(buffer)
|
buffer.Write([]byte{0, 0, 0})
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
VarInt(p.ID).WriteTo(buffer)
|
||||||
|
buffer.Write(p.Data)
|
||||||
|
|
||||||
|
payloadLen := uint32(buffer.Len() - 3)
|
||||||
|
|
||||||
|
// Determine where to start writing the header based on the payload size
|
||||||
|
var headerStart int
|
||||||
|
if payloadLen <= 0xFF>>1 {
|
||||||
|
headerStart = 2
|
||||||
|
} else if payloadLen <= 0xFFFF>>2 {
|
||||||
|
headerStart = 1
|
||||||
|
} else if payloadLen <= 0xFFFFFF>>3 {
|
||||||
|
headerStart = 0
|
||||||
|
} else {
|
||||||
|
panic(fmt.Errorf("packet length %d is too large", payloadLen))
|
||||||
}
|
}
|
||||||
// Length
|
|
||||||
_, err = VarInt(int(n) + len(p.Data)).WriteTo(w)
|
// Write the packet length at the beginning of the packet
|
||||||
if err != nil {
|
for i := headerStart; payloadLen != 0; i++ {
|
||||||
|
b := byte(payloadLen & 0b01111111)
|
||||||
|
payloadLen >>= 7
|
||||||
|
|
||||||
|
if payloadLen != 0 {
|
||||||
|
b |= 0b10000000
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.Bytes()[i] = b
|
||||||
|
}
|
||||||
|
_, err := w.Write(buffer.Bytes()[headerStart:])
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// Packet ID
|
|
||||||
_, err = buffer.WriteTo(w)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Data
|
|
||||||
_, err = w.Write(p.Data)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Packet) packWithCompression(w io.Writer, threshold int) error {
|
func (p *Packet) packWithCompression(w io.Writer, threshold int) error {
|
||||||
buff := bufPool.Get().(*bytes.Buffer)
|
buff := bufPool.Get().(*bytes.Buffer)
|
||||||
|
Reference in New Issue
Block a user