Gamer needs to be a server We need a lot of bandwidth Early during Shadowrun, design wanted guarentee that they could do 16 players and really wanted to do more Not able to guarentee Design was not done, not sure what would require updating and how often Reality is that we always need to be smart about how we update
Home environment is hostile Machines can move
How do we adjust bandwidth? How do we adjust game state replication? When/why do we migrate? How we ensure hosts / how do we pick?
Connection Control Global Control History Control
Goal set by Global Control UDP Padding
Packet Loss Subsequent Acks Timeouts Counters to filter out spurious
Global Control Divide bandwidth among connections Grow till exceed and then backoff Ability to look at behavior across connections
More then 50% in recovery Single bad connection does not cause signal Could prohibit growth, but we account for that
Even distribution for the most part Some need extra due to voice Bandwidth might be limited for bad connections
Bad connection Counter accumulates every period with congestion Decrements every period without Thresh means its bad – in dog house Can recover Bandwidth limited No longer restricts growth
History Control Continuity Over Time Grow while able to deliver Back down if fail Measurements occur during periods
Period starts when goal is set Period canceled if goal is changed Ends when goal is met for some time Success if no recoveries - recorded Unknown if some recovers – no recorded Failure if too many recoveries - recorded
All success and failures recorded Circular buffer Holds hours of play From history can calculate reliable percentage / failure percentage
Reliable bandwidth used as goal No history get conservative value Step up bandwidth will be tried
FailurePercentage less then or equal to 5% Consecutive successes after first step up will continue to step up Failure will cause it to fall back to lower bandwidth
After failure, many successes needed to try again 1 in 20 ratio picked – 2 hours of play
Good connection, Open Nat, Good Ping Default used Success Recorded Step up tried Success Recorded
Step up again will continue Till failure Connections will hit RTT thresholds Latency spike across all connections Some lag in game will occur All connections in recovery
Global control will notice majority recoveries causing recovery This will happen multiple times This will lead to failure Another step up will not occur for 20 periods
Hiccup will be filtered at either connection of global level Sustained problem will be recorded If continues will trash history Player no longer reliable and will essentially be removed from pool
Reliable bandwidth primary consideration Best reflects player/box ability to cope Must be able to meet game needs If best can’t be found, considers other possibilities in bands
Pool built from criteria Tie breakers applied Ping, Nat Type, Host reliability
Importance of type Time of last Client importance
Updates sent based on priority Time intensive task Both dev wise and runtime Requires iteration / tweaking / gameplay Critical for polish
Host migration Big debate for Shadowrun Halo 2 approach appears to encourage bad behavior Went with host initiated migration only – removing ability / incentive
Searches by good hosts put themselves into games without good hosts
Home sucks History identifies good hosts Design for consistency instead of rapid global adjustment Consistent good hosts picked / rewarded
Quick to respond to changing conditions Bad hosts eliminated relative quickly Games likely to disband anyway
Beta – good results Good hosts found time and time again when reset Bad hosts culled quickly