What's really going on with Zelda: Link's Awakening performance?
And can overclocking Switch iron out the hiccups?
Sometimes, the lure of a technological puzzle is impossible to ignore. We've already expressed our love and admiration for the Switch remake of The Legend of Zelda: Link's Awakening, but equally, it's fair to say that its performance hiccups and stuttering are somewhat baffling. In a world where Switch can run id Tech 6 ports reasonably well, and virtually lock Super Mario Odyssey to 60fps, why does Link's Awakening have any issues at all? With a spare day in the schedule, I wanted to get some answers.
While most of Link's Awakening runs fairly well, this is a Nintendo game aiming for 60 frames per second - a target that the platform holder's games tend to hit with unerring consistency. Link's Awakening, however, seems to lurch between 60fps and 30fps (or more accurately, between 16.7ms and 33.3ms frame-times) in the strangest of places. Our solution to this problem: speed and power - specifically, much more of it. Link's Awakening runs at the standard Switch clocks of 1020MHz CPU and 768MHz GPU when docked, with the graphics core dropping to 384MHz in portable configuration. In all modes, an exploited Switch can be manually overclocked to push video processing to 921MHz with the ARM Cortex A57s maxing at 1785MHz.
The overworld presents the lion's share of the performance issues - just leaving the initial hut causes a sudden drop in frame-rate, for little discernible reason. Basic traversal causes minor stutter as we move around the initial beach locale, and more serious drops when transitioning between more significant areas of the map - like entering or exiting the Mysterious Forest, for example. What's curious here is that the stutter is fleeting - within a couple of seconds, we're back to 60fps.
As the graphics content can remain almost completely unchanged during traversal (the game does use dynamic resolution, but pixel counts seem static in traversal), logic suggests that the CPU may well be causing the problem - perhaps it's still streaming in and decompressing world data? Well, overclocking the CPU by 75 per cent should sort that out, but it actually makes no difference whatsoever. Increasing GPU clocks to 921MHz does help, but only to a limited degree.
Perhaps a storage issue then? Well, the Switch's NAND is faster than any SD card, but again, swapping to internal storage showed no improvement. Eventually I did crack it: switching to mobile mode with its lower resolution but running at docked clocks resolves the issue - and indeed almost all of the performance hiccups in the game. Despite the evidence to the contrary, Link's Awakening does seem to be GPU-limited, even in scenarios where the complexity of the visuals doesn't change before, during or after a stutter.
It's all rather baffling because the game's hitches kick in and resolve themselves even if the graphics output doesn't change at all. The conclusion seems to be that the GPU is doing more than just rendering the visuals. But what it's actually doing to cause the frame-rate drops is still somewhat mysterious. Maybe aspects of the world are dynamically generated as you play - possibly because of storage constraints. If we look at the footprint of Link's Awakening, it's just 5.8GB. One theory that's been suggested to me is that the game doesn't pre-generate or load in light maps and shadow maps, maybe they are calculated on the fly. Drawing any definitive conclusions is impossible - the only takeaway is that blasting significantly more GPU power at the problem alleviates the issue.
This only addresses one puzzling aspect of Link's Awakening performance - its traversal hiccups. During repeat testing, a number of other inconsistencies came to light: speech dialogues (backed by a close-up zoom on the characters) can see the frame-rate plummet by up to 50 per cent. The initial interior scene from the game's very beginning runs at 60fps but drops to 40fps if you leave the room, then re-enter it. Just the first few minutes of the game throw up some strange inconsistencies - and it's hard to imagine that a developer of Grezzo's pedigree couldn't be aware of it. Again, a GPU overclock to 921MHz in docked mode helps, but running docked clocks with the handheld mode engaged solves almost all of the hiccups.
Thankfully, there are some aspects of Link's Awakening that do not actually defy analysis - such as the Goponga Swamp, which again, can drop hard to 30fps. This one is easy to explain: whatever technique Grezzo is using to render the water is very expensive so when the screen is dominated by water, the GPU can't hit its 16.7ms per-frame render time. As a double-buffer v-sync is used, the game stalls until the next display refresh at 33ms. If successive frames exceed 16.7ms in render time, the game temporarily drops back to 30fps. Moving around the map towards dry land means less water to render and frame-rate suddenly bounces back to the 60fps target. Again, GPU overclocking to 921MHz while docked helps a little, but - you guessed it - docked graphics clocks in mobile mode produces a nigh-on flawless read-out.
Bizarrely, in-depth Link's Awakening performance tests seems to raise more questions than it answers. Ultimately, frame-rate dips didn't impact our fundamental enjoyment of the game to any great degree (and by and large, dungeons run very nicely) but I think there are a couple of key reasons why many commentators and users have remarked on the issue. Firstly, in the overworld at least, the frequency of the dips is clearly noticeable and it just feels rather odd. Secondly, Nintendo's track record of silky-smooth 60fps first-party releases is enviable and for Link's Awakening to exhibit any kind of issue - let alone in the game's very first scenes - is surprising. The game is still a night and day improvement over the E3 showing but our feeling is that there's still work to do and fingers are crossed that a future patch can resolve the problems seen here.