Programmer Ramblings – Spawning and Runtime Performance on Maneater

I worked on Maneater from approximately September 2018 to November 2019 when I left Tripwire Interactive. A lot of what I tended to focus on through my time on Maneater was CPU-based performance gains on the UE4 game thread, so I wasn’t generally involved in other typical performance bottlenecks (particle cost, GPU time, etc), but there was enough work on the game thread to more than fill my time while I was on the project. Among other things, two of the systems that I was most heavily involved in were a refactor of the spawn system, and work around handling runtime performance optimizations. While I can’t really speak to what performance looks like on the shipping game, I can speak to some of the choices I made along the way, and how those two systems work in tandem to achieve performance gains.

Where the hell do I start?

That really was the first decision to be made. The game I started working on when brought in-house to Tripwire was much different from what Maneater became, but at its core the big problem was that the original game was made for high end PCs. It had a ton of classic spawn points, spawned everything pretty much at once, and didn’t do any performance reduction on the actors in the world. I knew one of our goals at the time was to see if it could get running on Switch, and I absolutely knew it needed to launch on Xbox One and PS4, all three of which are distinctly not high end PCs. With that in mind, I had at least a rough approach planned out:

  • Do all my optimization work on Switch. Any frame time gained there applied to other platforms. If I had the game thread at ~26-28ms on Switch, the other platforms sure as hell would run fine.
  • Fix spawning first. I needed to control how many things were in the scene at one time as a first order of business.
    • This also came with refactoring the design tools. Hand placing spawn points didn’t scale well for level designers, and at runtime iterating over hundreds of hand-placed actors didn’t make sense. This needed to be replaced with something else.
  • With spawning under greater control, start working on more granular framerate improvements:
    • Once I could run at a stable framerate with spawning under control, start optimizing the runtime aspects of the game.
    • As the framerate improved, start spawning more things to fill the now free frame time to give higher AI density in the world.
    • Rinse and repeat.

This formed the basis of my plan to get the game running well. While it wasn’t the only set of systems I was involved in, it was definitely the one I spent the most time on throughout my life on the project.