People ask me about this issue all the time, so I thought I’d post this. Hopefully some of you will find it helpful.
To be clear, I am not a networking engineer. Everything in this post is based on information provided by Bungie on their website.
Issue: Lag during co-op campaign and firefight.
Halo Reach uses 2 different network models for online play. Co-op and firefight run on a “syncronis” network model. Let’s say you are playing 4-player co-op. One player is the “host”, the other 3 are “clients”. All 4 players load the level, and all 4 players start the mission at the same time. Now, when a “client” presses a button, such as ‘jump’, their xbox sends a signal to the “host” xbox, telling it what the client player is doing. The host box receives these signals from all 3 clients, then calculates every movement, bullet fired, damage done, etc, and sends the updated information out to all the clients, who’s xboxs then reproduce the changes. But, the host will only send out these updates when it has received signals from all 3 clients. It does this to maintain accurate and consistent information across all 4 players (In other words, all 4 players are seeing the same things in the same places at the same time).
This is where the lag comes in: If just one of the players in the game has a bad connection, it slows down their ability to send information to the host, which means the host has to wait longer before it can send out gameplay updates to the other players. So, even if you are a client with a great connection, and the host has a great connection, you can still get major lag if one of the other clients has a slow connection.
This is experienced as a sort of input delay (the game will not instantly react to your button presses).
But the game plays fine in standard multiplayer?
The reason this does not happen in standard multiplayer is that Bungie uses a different network model for standard multiplayer. When playing “Team Slayer” or any other standard multiplayer mode, the host doesn’t wait for a lagging player before it updates the gameplay and sends info to all other clients. So, if I have a slow connection, and I join a multiplayer match, I won’t directly effect the performance of the other players (unless the laggy player is the Host). A player with a good connection might have a hard time shooting a laggy player, because the host won’t have accurate information of where exactly the laggy player is, but they won’t suffer input delay themselves. This creates a less accurate game for all players (since a laggy player will think they are in one spot, while the other players will see them in a different spot) but it keeps things running smoother than the co-op model.
Why not use the standard multiplayer network code for co-op/firefight?
Both co-op campaign and firefight have lots of AI scripting going on. This makes it very important that all players in a co-op or firefight game are 100% in-sync with with each other. If the host didn’t wait for updates from all players before moving the game forward, then you would have constant crashes.
For example: lets say I’m playing firefight. I’m a client, and I have a very laggy connection. I’m shooting at a grunt. On my screen, I see that I’ve shot the grunt in the head. But, because my connection is so slow, the host doesn’t yet know that I’ve hit the grunt in the head. This means that the host box thinks that Grunt is still alive, and is still running it’s AI routine. Suddenly you have a situation where my xbox and the host xbox have 2 different versions of the match being processed (1 version where the grunt is alive, and 1 version where the grunt is dead). This situation = CRASH.
So, to avoid this, the Host will not move the game forward until it receives update signals from all other players. Again, if just 1 of those players has a bad connection, the entire games slows down.
How do I avoid playing with people who have slow connections?
There is no 100% guaranteed way to avoid being matched with a laggy player, but going into the matchmaking network preferences and selecting “Good Connection” is your best bet.
Hope this helps answer some questions!