Hello Kripken
Thank you for composing this requirements list. I included my comments
below between quotes:
> 1. Both reliable and unreliable messages, where 'reliable' means that
> if not received the message is resent, and messages are guaranteed to
> be received in the correct order, and 'unreliable' means that no
> resending is done, and messages sent earlier that arrive later are
> silently ignored (in other words, a "Quake-like protocol"). (All of
> this in UDP, of course.)
This ordered delivery seems to be relevant requirement which is
missing from our requirements list. I am still a bit uncertain whether
we should feed messages to higher level engine which will then deduce
when to wait for earlier messages and when to apply them
independently. If it is implemented in network level entirely then the
messages in the reliable channel will all stall if one message is
delayed.
> 2. Separate 'channels', where the ordering relevant in point #1 is
> maintained only within a channel (this lets the other channel continue
> to push data).
I tend to agree that we need to add some kind of channel concept so
that we can provide reliable messages their own indexing which can be
used whether some message in between is delayed. Whether we should
allow for multiple channels or just 2 namely reliable and unreliable
is something we need to think about carefully.
> 3. Protocol compression.
I am uncertain how good compression levels can be acquired inside one
message. As good levels can maybe be acquired by hand optimizing key
messages. It could be good to allow for compression of extensions at
least as they may be considerably longer than the messages itself.
> 4. A good C/C++ implementation. I recommend using ENet [2], which
> supports reliable and unreliable messages, channels, etc., and is MIT
> licensed. The only problem with it is that it uses exponential backoff
> like TCP (this is disabled in the Intensity Engine).
I agree that we do need good c++ implementation and Enet certainly
looks like a robust library. The reservations I have is that it would
need to be well documented to be viable for standard like
specification. In addition I would think ports to languages like Java,
C# and python at least would be required. Native library bindings
being a pain when applying any library. On the other hand maybe using
network library like ENET could make MXP more desirable as network
library candidate for projects requiring high quality and proven
operation in heavy production use.
> 5. Easy ability to define new message types, with some sort of message
> template file, code autogeneration, etc.
MXP approach is to provide sort of transport layer messages which can
be extended with google protocol buffers to cover application specific
needs. Instead of ending up with a jungle of hundreds of custom
messages like SLUDP we have well defined extensible vocabulary
(message set).
> 6. Some messages, in particular position updates, should have the
> ability to append additional world-specific data, that needs to arrive
> at the same speed as position updates (i.e., fast - this might be
> relevant for animations in some applications, etc.).
We have in a requirement list a custom object modification message
which would carry this kind of application specific data. Our approach
is currently to optimize tightly key signals like movements in their
own messages. We will likely need to do something similar for free
style gesturing where you need to transmit skeletal animation signal
in similar manner as movement.
-tommi