[ENet-discuss] 1.2.2 and 1.3.0 *PRE*-release
Lee Salzman
lsalzman1 at cox.net
Thu May 20 16:34:39 PDT 2010
1. This more depends on the data itself than on size, since the
compressor can manage to start working on anything over about 10 bytes.
However, keep in mind it is compressing the entire UDP packet, including
ENet protocol headers, so almost every UDP packet sent is going to be
above this limit. The compressor uses an adaptive scheme which does not
send any frequency tables, so the size overhead allows it to operate
well even on packets numbered in the tens of bytes.
2. Same as for any compressor, redundant data. But if your data is
redundant, you probably did something wrong in your application to begin
with. So it's a catch-22. :)
It managed to squeeze only about 5-10% off of Sauerbraten's physics
state that is blasted out in extreme volume, but that data was very very
well packed. Compression ratios were much better on non-physics data I
was sending but at too low a volume for it to matter. YMMV depending on
how clever you were encoding your network data in the first place.
3. It doesn't send a compressed packet if the compressed size exceeds
the uncompressed size. So it's mostly just the CPU penalty of touching
the data and trying to compress it, even if ENet decides to just send
the original packet instead.
4. Yes, both ends of the connection must have this enabled for it to
work. Even to decode a compressed packet the user has to have supplied
the decoder to use. Since it works through a callback which could use
any compression library you wanted instead, but the protocol has no way
of really saying what kind of compression was used or marshalling it
from the user, so I just kept it simple here.
5. The problem was that I was wanted it to be able to compress packet
headers, and keep in mind that ENet aggregates many sends into one UDP
packet if it can. Compressing one small user packet would be kind of odd
in this circumstance, since I might have to invoke the compressor
multiple times for one UDP packet. Keep in mind the compressor is also
adaptive, so it trains its frequency estimation as it walks through the
data. It will start compressing better the longer the packet gets, up to
a point. So for the moment I just decided to compress the entire UDP
packet always, and so long as the packet gets smaller, send the
compressed version.
Lee
M. Rijks wrote:
> The 1.3 edition sounds excellent, Lee - it already includes three
> wanna-haves for me. =)
>
> I've tried catching up on range coders using a Wikipedia article, but
> I have to admit that the inner workings are entirely unclear to me. :(
> So I'll go with some questions I think I can handle the answers of:
>
> 1. What's the minimum size for a packet for this kind of compression
> to become effective?
> 2. What kind of data is best compressed with it?
> 3. Is there a size penalty for attempting to compress data that can't
> be compressed?
> 4. Do I understand it correctly that the hosts must be set for
> compression on both ends of a connection for this to work correctly?
> Or are compressed packets somehow flagged so Enet 1.3 can recognize
> and decompress them when coming in?
> 5. Wouldn't it have been more convenient to decide compression per
> packet (in which case packets *would* need to be flagged, of course) ?
> I expect there is little sense in compressing very small packets
> especially because there may be overhead in terms of size and
> processing...
>
> Thanks!
>
> Martin
>
More information about the ENet-discuss
mailing list