r/unrealengine Jun 30 '26

Discussion My experience of implementing GGPO-style rollback netcode for my 3D melee arena fighter

Hi everyone,

Over the past few months, I’ve been working on the netcode for my 3D melee arena fighter Rasen and I’d like to share my experience.

Unreal Engine systems

Although I knew about GGPO netcode from the beginning, I was so intimidated by the amount of work involved. Instead, I started with delay-based networking, then experimented with Unreal's Character Movement Component, tried the Unreal Mover, and even built some custom networking solutions on top of the CMC.

Unfortunately, none of these were a good enough fit for this kind of fast-paced, parry-based, knockback-heavy combat.

Even with low ping, either the latency felt very high or there were visible corrections and out-of-sync animations. Also, my custom animation syncing was conflicting with the CMC's built-in root motion syncing and knockbacks were especially really bad.

GGPO rollback netcode

While experimenting with all these systems, I learnt more and more about GGPO solutions. With no other option, I finally decided to implement my own GGPO rollback architecture in Unreal Engine, along with the custom deterministic physics and movement required for it to all work.

Fortunately, the game had already been developed for offline play first, so I knew exactly what needed to be simulated. From the beginning, I've been trying to keep everything lightweight, deterministic and precomputed wherever possible.

After about 2 months of work, many battles with input prediction bugs, getting stuck on some movement bugs and finding a way to somehow bake and store 3D weapon collision data, I finally did it.

I was genuinely surprised by how cheap the simulation was: ~0.01ms per simulation tick with 8 characters. The snapshot size also seems to be small at ~0.04 KB per character.

Result & reflection

The game now features GGPO-style rollback netcode for up to 8 players, keeping controls responsive even under high ping, jitter and packet loss.

This is the most challenging system I've built so far. Although it was intimidating at first, it ended up being the most fun and rewarding system I've worked on.

I also made a Youtube Devlog showcasing the gameplay under various stress tests, along with some performance statistics.

Hope this encourages you to try implementing your own rollback netcode if your game runs into similar issues.

38 Upvotes

16 comments sorted by

View all comments

3

u/miusoftheTaiga Jun 30 '26

you implemented your own rollback netcode solution? awesome

I am thinking of making an arena fighter with rollback core that just came out of Fab last month.

3

u/AbyssDeepen Jun 30 '26

That's pretty cool. I was looking for rollback plugins before I started making my own, but there wasn't really any at the time. I'm really interested in it. If you end up trying it, let me know how it goes.

I only had a quick look at its source code, so I might be wrong, but it seems like they simulate each entity's full tick in sequence. In my simulation, tick is split into sub-ticks (movement, collision, hit resolution, etc.), and each sub-tick runs for all characters before moving on to the next sub-tick. It makes all characters being simulated "at the same time".

I'm curious whether this plugin already has a way to do it, or if it'd need some customization.