оптимизация: слегоньца набурмалдил
This commit is contained in:
@@ -92,25 +92,31 @@ const int _compressionThreshold = 32;
|
||||
/// `0` — без сжатия, иначе `(rawLen ~/ compLen) + 1` (множитель размера, по
|
||||
/// которому получатель выделяет буфер под распаковку).
|
||||
Uint8List packPacket(int opcode, Map<dynamic, dynamic> payload, {int seq = 0}) {
|
||||
final header = ByteData(headerSize);
|
||||
final Uint8List raw = msgpack.serialize(payload);
|
||||
|
||||
final List<int> body;
|
||||
final int flag;
|
||||
if (raw.length < _compressionThreshold) {
|
||||
body = raw;
|
||||
flag = 0;
|
||||
} else {
|
||||
body = lz4Compress(raw);
|
||||
flag = (raw.length ~/ body.length) + 1;
|
||||
}
|
||||
|
||||
final out = Uint8List(headerSize + body.length);
|
||||
final header = ByteData.view(out.buffer, out.offsetInBytes, headerSize);
|
||||
header.setUint8(0, 10);
|
||||
header.setUint8(1, CmdType.request);
|
||||
header.setUint16(2, seq, Endian.big);
|
||||
header.setUint16(4, opcode, Endian.big);
|
||||
|
||||
final raw = Uint8List.fromList(msgpack.serialize(payload));
|
||||
|
||||
if (raw.length < _compressionThreshold) {
|
||||
header.setUint32(6, raw.length & 0xFFFFFF, Endian.big);
|
||||
return Uint8List.fromList(header.buffer.asUint8List() + raw);
|
||||
}
|
||||
|
||||
final compressed = lz4Compress(raw);
|
||||
final compLen = compressed.length;
|
||||
final flag = (raw.length ~/ compLen) + 1;
|
||||
header.setUint32(6, ((flag & 0xFF) << 24) | (compLen & 0xFFFFFF), Endian.big);
|
||||
|
||||
return Uint8List.fromList(header.buffer.asUint8List() + compressed);
|
||||
header.setUint32(
|
||||
6,
|
||||
((flag & 0xFF) << 24) | (body.length & 0xFFFFFF),
|
||||
Endian.big,
|
||||
);
|
||||
out.setRange(headerSize, out.length, body);
|
||||
return out;
|
||||
}
|
||||
|
||||
/// Распаковка пакета от сервера
|
||||
|
||||
Reference in New Issue
Block a user