The Witcher 3 is one of the biggest games of the year. After multiple delays, CD Projekt RED have finally managed to release their magnum opus. It differs from the first two Witchers in two significant ways: it was developed from the ground up as a multiplatform game, and it features a large, fully traversable open world. Both of these choices have gameplay as well as technical implications, and the latter are what we will investigate today.
There has been a true flurry of discussion and analysis concerning The Witcher 3's technical aspects. The performance impact of each individual setting has been investigated in detail. As retreading that ground seems superfluous, my focus will instead be on an aspect which I feel has not received sufficient attention: how best to achieve smooth gameplay in The Witcher 3 on PC.
Open world games—particularly open world RPGs—are quite a different beast from more linear games. Their performance can vary strongly according to a huge number of factors: how many NPCs are there on screen, and how many need to be accounted for in total currently? Do we need to stream some assets from disc? How much of the screen is taken up by (potentially multiple layers of) foliage? What about particle effects? And what’s the state of the day and night cycle and thus lighting? That’s just a small subset, but it should help explaining why consistently smooth gameplay is not trivial to achieve—and can be a somewhat mystic art not unlike alchemy.
In order to achieve this lofty goal, I first looked at the basic CPU requirements of the game, then spent significant effort looking at all the in-game as well as external tools at our disposal to improve the smoothness of the experience.
Before we start: a note on frames per second
If you are reading this article, you are likely familiar with the concept of Frames Per Second (FPS) as a performance metric. I will not talk about FPS much in this article—while they work well enough as a comparative indicator of performance impact, to measure the actual smoothness of a gameplay experience they are sorely lacking.
That’s because individual spikes in frametime (the time between 2 consecutive frames are generated) are effectively masked by the implicit time integration of the FPS metric. If you want to learn more about frametimes, look here for a great introduction. For the purposes of this article, you only need to know that a consistent frametime, without sudden spikes or drops, will generally result in smoother gameplay.
Note that the benchmarks in this article were performed on a Haswell-E i7 3820k with a Geforce GTX 970 GPU. However, all the advice and general conclusions derived from it are designed to be applicable to almost any hardware setup.
A basic requirement for smoothness is sufficient CPU headroom. Particularly in open world games, it is not uncommon to encounter CPU bottlenecks which prevent fully leveraging a given graphics hardware configuration. To investigate this issue, I performed a benchmark using a varying number of Intel Haswell CPU cores (1 to 6, and 12 with Hyperthreading) at a range of frequencies from 1.4 to 3.8 GHz.
The figure above illustrates the game’s performance across this spectrum of configurations. The game’s graphics options were set to Ultra, but resolution was kept at the lowest possible 1024x768 in order to minimize GPU bottlenecks. On the Y axis, 99th percentile frametime is plotted. In simple terms, if this metric is below 16.6 ms you can expect not to be CPU limited in achieving smooth 60 FPS gameplay, and if it is below 33.3 ms the same can be said for 30 FPS. These thresholds are colored green and yellow, respectively.
What do these results tell us?
— Core counts above 4 do not offer any advantage in this game, at least not in the scene measured. However, The Witcher 3 scales well up to 4 cores.
— Similarly, a single core, even a Haswell core clocked at 3.8 GHz, is not sufficient to play the game smoothly.
— Dual core processors with high per-core performance (such as a core i3) should be capable of keeping the above the 30 FPS threshold.
— If you have at least a quad core CPU, its per-core sequential performance does not need to be tremendous to achieve consistent 60 FPS—in the benchmark, even 2.2 GHz proved sufficient.
Smoothness: Not quite silky out of the box
Your CPU is sufficient to run the game, you have made choices in terms of graphics settings which are suitable for your hardware—more on that later—but the game still doesn’t feel smooth? Let’s look into that.
The chart above illustrates the peak frametimes (in red) and framerates (in green) over time achieved by the game without any internal or external frame limiting. The left chart uses borderless windowed fullscreen mode without in-game Vsync, while the right one depicts the result for fullscreen with in-game Vsync.
It should be readily apparent here why frametimes are a superior metric to FPS when looking for smooth gameplay. Just looking at the FPS average of around 40, these sequences could appear to be smooth—the truth is far from that. With wildly fluctuating frametimes of up to 100 ms, the no limiting/no Vsync case is almost unplayable, and even engaging Vsync only improves the situation marginally.
The in-game frame limiter option is a significant improvement. However, the frametimes still fluctuate around (and sometimes above) 33ms, resulting in frequent, momentary hitching, especially in conjunction with fixed refresh rate displays.
Reaching Into the Saddlebag
One great thing about gaming on PC is that you are never limited to only the options developers provide for you, or the choices they make. In this case, we are going to make use of one of the most reliable tools for combating framepacing issues: Rivatuner Statistics Server, or RTSS.
An image says more than 1000 words. Still, I’ll try: RTSS achieves an incredibly smooth pacing of frames, which not only looks good on the chart but also feels solid in-game. It’s also quite simple to use: get RTSS here, create a profile for Witcher 3 by clicking on the “+” sign, and set the desired framerate limit. The final result should look like the configuration in the image to the right. Click the expand icon in the corner to view it full-size.
While the “Vsync” configuration looks marginally smoother than the “no VSync” one in the charts above, after a considerable amount of testing I would suggest this setup: disable both the in-game frame limiter and in-game Vsync, use borderless fullscreen mode for correct triple buffering and set the desired framerate limit in RTSS. This combination will result in consistent frame delivery while minimizing input lag.