I tested 10ms, 100ms 250ms, 1000ms and 3000ms. (all set to lag only in one direction, because of oddities of how localhost connections work)
Once you get to 250ms, the effect of the lag become noticable, but its not until 1000ms that you can really see the inefficiencies of the byond network protocol.
There are still quite a few things that are ask for something -> wait for reply -> ask for more things -> wait for reply, repeat until it has the info it wants.
For instance, while on 3000ms latency, if I run the verb jump-to-area "engineering" where that area has a lot of objects, the following happens:
3 seconds passes.
DS is told its being moved to a new loc, it blanks out the shown turfs, then asks for turf info for its new loc
3 seconds passes.
DS updates with turf info, but not object info, it asks for that information
3 seconds passes.
DS updates with some of the info on objects in view, it asks for the rest
3 seconds passes.
DS updates with some more of the info on objects in view it asks for the rest.
3 seconds passes.
DS finally has all of the info on objects in view.
basically, it took 5 round trip operations to process getting moved to a new loc. at 3 seconds of lag, this is 15 seconds total, at a more reasonable number of 300ms, this is 1.5 seconds total.
Now, If that were pipelined, that could be as low as 3000ms(3 seconds) for the extreme example, and 300ms for the more reasonable example.
Such examples exist all over the place, So i wanted to bring this to attention as an optimization avenue.
First step would be to reduce the assumed network state to just auth and handshaking. DS shouldn't care about rather or not it asked for info, this way it can handle the data regardless of what commands were queued, all info about the command it needs should be implied by the command.
Take IRC for example, it is shockingly stateless, RFC states that to a client, sending a command, and getting a reply, should be fully separate. Clients should handle errors like "cannot join #channel, banned" regardless of if they remember trying to enter that channel.
Second step would be to than pipeline requests.
Ask for all of the info at once, both turf and object info. or send one request, then another, without wait (and ds might need to be setup to send it all at once, rather than wait for the client to request more if it doesn't fit it all in the packet)
And that brings me to the final step: Preempt the client.
There is good bet DD can be trained to know what info the client will want, so it could start sending it when it tells the client about the new loc.
The filter I used in clumsy was:
tcp and outbound and ip.DstAddr >= 127.0.0.1 and ip.DstAddr <= 127.255.255.255 and (tcp.DstPort == 31337)
(31337 is the port i use for local DD instances when testing.)
Another note, is that if map threading were finished, most of the possible shortfalls of such a system (mainally in the final step) basically disappear.
DS does ask for icons and sounds after the fact, if it doesn't have them already, but I expect that shouldn't come up much as those are typically included in the original resource download.