Lag, Lies, and the Speed of Light: What's wrong with Street Fighter V?
For the last month or so, gamers have been complaining about how crappy Street Fighter V feels online. The game stutters, lags, and slows down constantly. We have heard tons of complaints about how Capcom needs to “fix their servers” or “make their connections faster,” but neither of these complaints actually addresses what’s wrong here. Capcom’s problem isn’t slow servers or connection speeds – it’s the fundamental laws of physics. They haven’t screwed up because there’s lag in online matches. Rather, they’ve screwed up because we notice the lag in online matches.
Believe it or not, it’s impossible to have a truly lagless online match. We are always limited by the universal speed limit: the speed of light.
For full effect, imagine I’m explaining this in my best Carl Sagan voice.
Let’s Do the Math
Say I want to play a game of Street Fighter V with renowned Street Fighter champion Daigo Umehara. We uh… met at a cousin's… wedding… yeah, that's it. Daigo lives in Japan and I live in the greater New York area. According to Google, it is 6,738 miles from New York to Japan, if you travel in a direct line (or in this case, an arc over the surface of the Earth.)
Now let’s assume that Tom and Tony Cannon, the creators of the award-winning fighting game netcode GGPO, one-up themselves and create a form of communication that can transfer information directly between two points at the speed of light.
First of all, the Canon brothers are now billionaires.
Second of all, the speed of light is 670,616,629 miles per hour, or about 186,282 miles per second. A quick look should tell you that if Daigo and I were connected directly to each other (no servers or intermediaries of any kind), the data of our button presses should get to each other in a fraction of a second. But what fraction of a second?
It’s approximately .0361 of a second. A human being takes about a third of a second to blink, or .3333 in decimal notation. It would literally travel in the blink of an eye, or about a tenth of the blink of an eye to be specific.
And this is why fighting gamers don’t blink.
Slower Than the Speed of Light
Fighting games run at sixty frames per second or, to put that in decimal notation, one frame is .0166 of a second. Notice something interesting here? Even if we transferred information at the fastest speed possible, my New York to Japan match would still not be lagless. Even at the speed of light, the information will take a little over two frames to get to Daigo, and since you can’t have half of a frame in a fighting game we have to round up. Our match would have a constant three frames of lag.
That is not insignificant! Human beings can easily react within three frames. Some fighting game characters have three frame normals! If a player were to throw one of those at you, and you were standing in complete neutral when it started, you couldn’t block on reaction even if you wanted to. The information about the block simply wouldn’t get to your opponent in time.
And you’ve probably heard of combos that require “one frame links.” This means that the timing of the combo’s button presses needs to be correct within one sixtieth of a second. If Daigo’s and my fantasy match had three frames of lag, one frame links would be almost impossible.
Still don’t believe me? Try it out for yourself. Boot up a fighting game like Skullgirls, which allows you to set your own network latency, and set it to three frames. Better yet, simulate it in training that can fake online latency, like Marvel vs. Capcom 3’s. The latency will immediately start messing you up. Yes, you can eventually adjust, but adjusting is a dirty compromise when what we want is truly lagless matches.
Lie to Us, GGPO
Remember, this example was a generous best case scenario. In actuality, no network system will transmit information that quickly. You have servers and network loads to contend with, and actual transmission speed will fluctuate up and down over the course of a match. Not to mention, our fantasy speed-of-light netcode hasn’t been created yet. So how can matches between New York and Japan sometimes feel so smooth?
This is where rollback netcode, which is what GGPO is, shines. It’s not new. In fact, shooters have been using this sort of code for some time now. It’s just an intelligent way to manage latency that not all fighting game developers have caught on to just yet.
Rollback netcode doesn’t “reduce” lag so much as it hides it. Instead of directly transmitting inputs from one player to another, rollback netcode allows two instances of the game to run independently of each other. It then compares the states of both games frame-by-frame in order to figure out what the actual game state is. As a result, your actions always happen immediately, but if any of these actions don’t mesh with the actual game-state, the netcode “rolls the game back” to a point where actions matched up. This is why you sometimes see characters teleporting around in shooters. This is also why sometimes sound effects will be a little bit off in fighting games.
Let’s imagine an example. I’m playing against Daigo in a three frame lagged match using our fantasy speed of light netcode again. I throw out a three frame normal. Daigo, being the greatest Street Fighter player alive, notices the move at frame one and holds back to block it.
If we were directly transferring information to each other, Daigo’s block would not get transmitted to me by the time my attack went off. Daigo would be hit, end of story. Sucks to be him. But in rollback netcode, we both see two different things. Daigo sees his character immediately block, while I don’t. When the three frames are up, Daigo has blocked on his end and was hit on my end.
The netcode, now having both game states to look at, can go back in time and see that Daigo was holding back and should have blocked. So, on frame four, my game adjusts to show Daigo blocking, even if, at frame three, he was hit. This usually goes by so quickly few would even notice it, and good netcode can do this calculation between frames.
Since our fantasy netcode had just over two frames of lag, it can do its fantasy gamestate comparison before the third frame is rendered and the actual hit comes out. As a result, we BOTH see Daigo block on frame three, and we both feel our inputs execute immediately. For all intents and purposes, our gameplay feels instant and identical, as if Daigo were sitting right next to me on the couch.
It’s not that the lag is gone. It’s just that our netcode has lied to us in such a way that makes us feel like it’s not even there.
The Future of Lying
Better netcode isn’t about finding ways to get information from place to place faster. It’s about finding ways to lie more effectively. When Street Fighter V feels unplayable, it’s not because its servers are gunked up or its information isn’t getting to you fast enough. It’s just not lying to you effectively.
The rollback experience feels better because a three frame difference only matters so many times during a match. This is when we see the game stutter, as opposed to a three frame delay on every single input both of us make the entire match. One has a lot less impact than the other.
But smart netcode can lie even better than this. For example, the netcode can use delays to its advantage. If our inputs were slowed to a one frame delay at points in the match where it doesn’t matter, then the game would rollback only when two frame differences come about, which are even rarer. This would give the illusion of the game running even smoother and faster, at the expense of a small but manageable button delay.
Netcode can also lie to us by processing input information separate from game state information. For example, one frame links don’t really exist in Street Fighter V, because there is a two frame “buffer” for inputs. Basically, you can press the button up to two frames early and still get a one frame link.
An intelligently lying netcode can transfer that information at the moment of the button press, not the moment of move execution. Therefore, if it takes a little over two frames to transmit information, and I press my button two frames early, on Daigo’s end it will appear as if my execution was perfect and, once again, instant.
Understanding Our Limitations and Fixing Street Fighter V
We are probably never going to break the speed of light. I’m not a theoretical physicist, but unless PlayStation 5 makes use of quantum entanglement, that’s as fast as information will ever be transferred.
But you can have a perfect game of Street Fighter without perfect information transfer. Humans are fallible, and that’s a good thing. As long as we don’t notice the discrepancies caused by lag, then the game is, for all intents and purposes, lagless. Imagine how smooth and seamless gameplay will appear in the future as we develop things such as A.I. that can predict an opponent’s next move.
So why does Street Fighter V feel so crappy right now? Simply put, it isn’t lying to us. It’s just delaying inputs when network latency goes up. Compare this to Skullgirls, the best liar on the market that uses GGPO, and you’ll see its input delay is almost four times as long. Heck, it’s twice as long as Ultra Street Fighter IV’s was.
So that’s what Street Fighter V needs to do, start lying. It needs to fix its software, its code, not its hardware and its servers. With that done, online matches would feel more playable.
Get on that Capcom. Lie to me. Lie to me and tell me I have a chance at beating Daigo!
Or, you know, just use GGPO. It’s out there and it already works.
P.S. Forcing VSync to be enabled, so players don’t see how well the game runs offline without it, is a pretty bad lie.
For more information on Street Fighter V’s lag and latency issues, check out this latency comparison by Battle(non)sense: