Hello Paradoxteam,
I am a big fan of our games but one thing which bothers me from the beginning are the out of syncs which more or less happen(ed) in all of them. I think you did a good job to improve the situation (i.e. providing hot joins etc) but I was wondering what kind of network model you are using in your games.
Is it possible that you chose to use a "event/action" driven approach? So something like:
1) client/player generates an action
2) server checks/applies the action to its game state
3) server distributes the action to all (clients)
If this is NOT the case: I would be very interested in your approach.
If this is the case: Is there a good reason to chose this approach over a "state" driven approach? I know the action driven approach is very (very very) common but I my humbled opinion it is also the main reason why multiplayer experiences is very frequently suboptimal.
What is a state driven approach:
1) client/player generates an action
2) server checks/applies the action to its game state and marks the changed data as dirty
3) server distributes the new state of all updated data to all (clients)
Comparison (what is the difference):
One can argue that an OoS can happen in both approaches. This is totally true but lets assume the server distributes only actions like "move one up/down". In case of an action driven system the client state will stay out of sync if a desync happens because only CHANGES are sent. In case of an state driven system a desynced client state will be simply overwritten with the next update which fixes the desync.
Another argument is the latency/generated traffic. While this might holds true for fast paced games like shooters etc its general validity is arguable. I.e. sending an "move forward for (10,0,0) at heartbeat 1234" is not less payload then sending "position (43521,123,543) at heartbeat 1234".
I know questions about design choices are not very popular from a dev perspective (i.e. they are basically a pain in the ass with mostlikely no net gain at all) but sometimes sharing information helps to raise awares and increase the support of the community. So any information regarding this topic are very much appreciated.
If the information is already somewhere around please give me a short headsup. My current research did not unearth any details regarding the topic.
best regards
I am a big fan of our games but one thing which bothers me from the beginning are the out of syncs which more or less happen(ed) in all of them. I think you did a good job to improve the situation (i.e. providing hot joins etc) but I was wondering what kind of network model you are using in your games.
Is it possible that you chose to use a "event/action" driven approach? So something like:
1) client/player generates an action
2) server checks/applies the action to its game state
3) server distributes the action to all (clients)
If this is NOT the case: I would be very interested in your approach.
If this is the case: Is there a good reason to chose this approach over a "state" driven approach? I know the action driven approach is very (very very) common but I my humbled opinion it is also the main reason why multiplayer experiences is very frequently suboptimal.
What is a state driven approach:
1) client/player generates an action
2) server checks/applies the action to its game state and marks the changed data as dirty
3) server distributes the new state of all updated data to all (clients)
Comparison (what is the difference):
One can argue that an OoS can happen in both approaches. This is totally true but lets assume the server distributes only actions like "move one up/down". In case of an action driven system the client state will stay out of sync if a desync happens because only CHANGES are sent. In case of an state driven system a desynced client state will be simply overwritten with the next update which fixes the desync.
Another argument is the latency/generated traffic. While this might holds true for fast paced games like shooters etc its general validity is arguable. I.e. sending an "move forward for (10,0,0) at heartbeat 1234" is not less payload then sending "position (43521,123,543) at heartbeat 1234".
I know questions about design choices are not very popular from a dev perspective (i.e. they are basically a pain in the ass with mostlikely no net gain at all) but sometimes sharing information helps to raise awares and increase the support of the community. So any information regarding this topic are very much appreciated.
If the information is already somewhere around please give me a short headsup. My current research did not unearth any details regarding the topic.
best regards