MMOG packet sending rate

Started by
11 comments, last by paladinzzz 20 years ago
Fidelio66 brings up an interesting question here. How much packet rate is enough for MMORPG? We certainly neither can require nor afford 20 per-second, but is 1 per second is enough for a good playing experience? I think the character movement is the most demanding part for packet rate and 5 to 10 updates per-second is reasonable, like that in EQ. But I''d also like to make it drop down to 1 per-second if possible.

Another question is, how much performance can we gain to combine several small packets into a big one? The traffic saving should come from reducing the packets header overhead. The drawback is, more packets are easier to lose. Is there a issue that more packets increase the server routing burden through the network?

Certainly higher update rate is better for the game play so if it won''t make too much sense to reduce that, why not do it?
Advertisement
If players and NPC''s walk around, because you are not pointing guns and shooting, it''s not neccesary that the client renders them in the position they are at on the server. It does not need to be exact, nobody will notice if an NPC that walks is at position x at time t while on the server he''s already 2 steps further, or even when clients put him in a slightly different position. When combat starts you can give priority to fighting characters. Apart from that, you can make the client a bit smarter and make the characters walk around sufficiently correct based on occasional position updates.
I believe the MMORPG programming book (forget the name) suggests keeping a priority queue of entities per player, sorted on when to send the next update. Each time it''s time to update the player, elements are pulled off the queue, one update packet is generated (for all of the elements pulled off), and the elements are re-inserted into the queue, at time (now + f(d)) where f(d) is a function of distance from player to entity. That way, closer entities get more frequent updates.

There are a few problems with this, such as using binoculars, or when you''re moving towards an entity. If the entity was far away, but you''re moving towards each other, then you might want an update sooner than the position in the queue would indicate. I believe the solution recommended in that book was to inspect the queue every so often (every 5 seconds?) and fix up anything that looks out of order.

You absolutely want to coalesce updates. If you don''t, you''re wasting at least half your bandwidth. A typical entity update packet has no more than 20 bytes per entity; a typical UDP header (with IP header and ATM framing) is bigger than that. If you drop a packet, all the entities in the packet will be lost, true, but Internet packet dropping is not random; it''s bursty. Thus, several small packets sent right after each other are likely to all get dropped together, anyway. You might as well save the header overhead, and support more simultaneous items in your world.

We send 10 packets per second (plus chat, transactions, etc).
enum Bool { True, False, FileNotFound };

This topic is closed to new replies.

Advertisement