[crossfire] Protocol & compression.

Mark Wedel mwedel at sonic.net
Sun Mar 26 00:02:56 CST 2006


Sebastian Andersson wrote:
> On Sat, Mar 25, 2006 at 01:00:59AM -0800, Mark Wedel wrote:
>>   For other reasons, I still think I'll add animation support to the map2 
>> command.  However, I think it also worthwhile to add something like:
>>
>> S->C: compress <data>
> 
> I've got some experience in this, having implemented it in a mud
> (DUMII) and I suggest a different approach. Have the zlib stream as a
> layer between the socket and the server/client when it is turned on
> and start it like this:

  There are a few likely differences which may or may not effect crossfire in 
different ways:

1) Some data crossfire sends is just not compressible.  The PNG data comes to 
mind - trying to compress it is at best a waste of time, and at worse, increases 
amount of data being transmitted.  The other problem related to this is you'll 
often need to send a bunch of image data at one time (player changes to new 
map), and now there is lots of data you are trying to compress - the time it 
takes to compress that much data could become significant.

2) Latency is a big concern in crossfire, so we really can't add any.  This 
means that for each and every tick, we need to make sure we send all the data we 
have - in lots of cases, this is going to be small data that doesn't compress 
well, so once again, a waste of cpu time (while this may seem trivial, there are 
  certainly times when the server does become cpu bound)

3) The fact that crossfire does queue up data would allow for compressing at a 
higher level (basically, not have send_with_handling actually send data, but 
queue it up, and then at the end of the tick, compress the data).  In that way, 
we can combine several small commands into a larger packet, but still not spend 
time compressing non compressible data.  But doing that adds a fair amount of 
complication - a complete re-write of the socket code would probably be needed 
to reasonable support that.

  while adding a 'compress' prefix (it could be shortened to just gz, so now 
only adding a few bytes), by selectively compressing the big payloads is a very 
easy mechanism to do right now without any real downsides.



More information about the crossfire mailing list