Frame Rates in CounterStrike Throughout History

While watching a CounterStrike: Global Offensive stream on Twitch there were questions about the streamer’s resolution. A popular resolution for competitive players is 800×600. There are a few reasons for this, mostly revolving around performance. Thinking about this superfluous bit of information sent my brain down a rabbit hole, eventually ending up at “I wonder how each version of CS runs on modern hardware.” I booted up each of the main versions of CS, 1.6, Source, and Global Offensive, and got to work.

By default, CS is limited in the number of frames per second it can display, so those limits had to be removed. Next, I set the resolution to 800×600 so we were measuring against some kind of standard. There weren’t many, if any, visual options for CS 1.6 so there wasn’t much to do there. In Source, I turned up all the settings to their maximum values, except for HDR, which I disabled because it’s not something I would have enabled anyway. In Global Offensive I normally run with rather conservative settings. I turned down a few options, like texture filtering, to better match how a competitive player would have their game setup. Here are the results.

Frames per second in each of the three main releases of CounterStrike
Frames per second in each of the three main releases of CounterStrike

So… wow, these numbers are kind of all over the place. Let’s take a closer look and see what’s going on here.

In 1.6, the oldest of the three versions, we have an average frame time of 3.9 ms (253.5 fps) with a standard deviation of 1.5 ms. Frame times drop as low as 2 ms (500 fps), and the 90th percentile (that is, what 90% of the frame times will be better than) is 5 ms (200 fps). In Source, a version that’s still quite old but much more optimized, we have an average frame time of 3.5 ms (285.7 fps) with a standard deviation of 1.6 ms. The results are, as near as makes no difference, identical between these two games. Even the 90th percentile is only 0.8 ms lower at 5.8. It would appear, then, that these older titles are hitting some kind of limitation with the game engine, rather than hardware. Global Offensive had an average frame time of 8.4 ms (119.0 fps) with a standard deviation of 1.9 ms. Why does GO have a higher deviation compared to the other versions when the graph appears much more stable? Part of it is the way the graph displays the relationship between frame time and frame rate, but another reason is that at these longer frame times (8.4 ms compared to 3.5) each millisecond of frame time has less of an impact in the overall frame rate. The difference between 2 ms and 4 ms is 250 fps, but 8 to 10 is only 25. Here’s the same chart display only the frame rate.

Same chart as earlier, displaying frame rate linearly.

Here the difference is frame rate looks much more severe in 1.6 and Source. Is there anything we can do about that? We could enable V-sync, which would delay the presentation of the frame to the monitor until the previous frame has finished drawing, but that would introduce a delay between what’s happening in the game and when it’s displayed on the screen. We’ll leave V-sync disabled but tell the game to limit the frame rate using the fps_max command and set it to 300 for 1.6 and Source, and 130 for GO.


Limiting the maximum number of frames to make gameplay smoother.
Limiting the maximum number of frames to make gameplay smoother.

This had two unexpected effects. First, while the average frame time only decreased from 3.5 ms to 3.4, the standard deviation dropped from 1.6 ms to only 0.5!  Second, the frame rate didn’t get any more stable in 1.6. Global Offensive is expectedly smoother, but still bumpy, because we’re running to limitations of my CPU and GPU, but it’s odd to me that 1.6 didn’t see any smoothing.cs 1. I set fps_max to 300, 250, and 200 to see if we could get smoother frame times, and…

CS 1.6 with fps_max set to 300, 250, and 200.
CS 1.6 with fps_max set to 300, 250, and 200.

Surprisingly, while lower fps_max values did stabilize the frame rate some amount (standard deviation was 1.2, 1.0, and 1.2 ms respectively), I never saw the same kind of stability as I did with Source capped at 300 fps. It’s unfortunate, but it’s likely due to a lack of modern optimizations in the game engine, like hardware-based smoke and particle effects and multicore rendering. Average frame times were 4.1 ms (241.7 fps), 4.5 ms (221.2 fps), and 5.2 ms (192.8 fps), which is a little disappointing, but at that 200+ fps level, you’re going to be hard-pressed to notice a difference anyway.

Going back to the original thing that got me thinking about this, how does resolution affect frame rate in the most recent version of CounterStrike?

800×600 vs 1680×1050 vs 2376×1485

Using nVidia’s Dynamic Super Resolution I was able to run the game at 2376×1485, basically the 16:10 equivalent of 1440p. In order to do this, I had to use nVidia’s optimized presets, so I opted for the performance option and ran new benchmarks with the new settings. At 2376×1485 the average frame time was 5.6 ms (179.4 fps) with 7.5 ms (133.3 FPS) in the 90th percentile. At 800×600 you would expect to see double or triple that frame rate, but surprisingly I got an average frame time of 6.3 ms (158.7 fps) with 8.4 ms (119.0 fps) in the 90th percentile. 1680×1050 saw similar results. It seems, in this instance, that increasing the resolution actually increased frame rate as well.

What did we learn? Well, just because a game is old doesn’t mean it’ll run at a million FPS; the engine needs to be designed to scale with increased CPU and GPU capabilities. As we saw, updated game engines are not able to run faster, but smoother as well. We also learned that GPUs work better when they’re given a healthy workload.

The benefits to gaming at 800×600 don’t appear to be performance related. Instead, it’s more likely tied to what old school players are used to. The only significant change is when using a stretched 4:3 resolution, the whole game appears wider, including player models and doorways. On the flip-side, you’re also limiting your field of view. Some players may even prefer this, as it keeps focus on what’s in front of you. TL;DR, it’s just about preference and what’s comfortable. There’s no performance to be gained either way.

Let’s Clear the Air: Decoding Technical Jargon

With Sony revealing the PlayStation Slim and Playstation Pro yesterday, along with Microsoft’s reveal of the Xbox One S at E3, there have been a lot of terms use that the average consumer may not be familiar with. Terms like “teraFLOPS of compute performance” and HDR make consoles and video cards sound impressive but what do they actually mean?

Let’s start with FLOPS, or Floating-point Operations per Second. Computers can basically do two kinds of math: with decimal places (floating-points) and without decimal places (integers). Floating-point math is critical for scientific computation, including simulating 3D objects and environments, which is basically what a game is. Processor speed is measured in Hertz (Hz), or cycles per second. If a processor is able to execute 100-million instructions per second its speed is rated at 100,000,000 Hz or 100 megahertz (MHz). Modern processors are typically in the range of 3 gigahertz (GHz), or 3-billion instructions per second. Depending on the processor it might be able to perform a single floating-point operation per clock cycle, or maybe it can do 4, 6, or 8 (which also depends on how much precision (how many decimal points) are used in the math). This is one of the reasons that CPUs rated at the same speed can produce different results. So if our 3 GHz processor can perform 8 FLOPS per cycle, that’s 3-billion times 8, or 24-billion FLOPS (24 gigaFLOPS). Of course, modern processors might have 4, 6, or 8 cores, so if we assume we’re looking at a 4-core CPU we need to multiply that number by 4, so we now have 96 gigaFLOPS.

CPUs have to perform a wide variety of computational tasks. Being a jack-of-all-trades means they aren’t quite as fast as a processor that’s dedicated specifically to floating-point calculations. This is where video cards (GPUs) come in. GPUs are purpose-built for doing as much floating-point math as possible. That means that, while a typical desktop CPU might perform somewhere in the 50-100 gigaFLOP range, mid-range GPUs can perform in the 3-5,000 gigaFLOP (3-5 teraFLOP) range.

Now that we know what a FLOP is and how it’s calculated we can look at what Sony claims the Playstation 4 is capable of. This chart from AnandTech shows the GPU performance between the original and Slim Playstation 4 models at 1.84 teraFLOPS (1,840 gigaFLOPS) and the Playstation 4 Pro at 4.2 teraFLOPS (4,200 gigaFLOPS). That 2.3x performance jump means that games can run at higher resolutions, texture and model detail, higher and smoother frame rates, or any combination thereof. Is it enough for native 4K? Probably not. Comparing that 4.2 teraFLOP number to a desktop GPU, it’s right in between a GTX 970 and 980, meaning it’s closer to a 1440p or 2K resolution performer unless you really dial down the rest of the graphics settings.

“But the PS4 Pro supports 4K. How is that possible if it isn’t powerful enough for 4K games?” It might not be able to render typical games in 4K resolution, but it might be possible to render it at 2K resolution and upscale the images to 4K. It’s basically like resizing an image in Photoshop, but with a little bit of sharpening and other effects to make it look kind’a like it maybe was originally rendered in 4K. Similarly, if you have a 1080p display, the system could still render a game at 2K and down-sample that image to 1080p, resulting in sharper, more natural images. This technology is already available on the desktop with nVidia’s Dynamic Super Resolution. The PS4 Pro is, however, capable of playing 4K video through services like Netflix and YouTube, though it looks like the Pro does not include Ultra-HD Blu-Ray support, so you won’t be able to watch your 4K movies on your new Playstation.

One of the other new features that was announced is HDR, or High Dynamic Range. Imagine you’re indoors on a bright, sunny day. You’re taking a picture of your friend, who is standing in front of an open window. One of two things is likely to happen: First, your camera may correctly determine your friend needs to be exposed correctly, leaving the background “blown out”, virtually pure white, or it may try to expose for the outdoors, leaving your friend as a blacked out silhouette. This is an example of a low dynamic range. When you look at your friend with your eyes, though, you can see your friend clearly as well as what’s outside with no trouble at all. This is an example of high dynamic range. HDR video aims to provide a more lifelike range of color and brightness than a typical TV or computer monitor is capable of.

That’s all I can think of for now. If you have any questions about fancy-pants words companies are throwing around in their press announcements leave a comment below.

Pre-PAX Prime PC Preperations

A little over a year ago I decided to undertake a somewhat unique approach to water cooling: using surface area and evaporation to silently remove heat from the computer. If you want details, the build thread is here on the Linus Tech Tips forums. The long and short of it is, while it did work, summer temperatures made the water evaporate at an annoying rate and the cheap pump I was using generated more noise than I was happy with. That, and I couldn’t move my computer downstairs if I wanted to setup an HTC Vive.

I pieced together a massively overkill water cooling loop with the idea that excessive cooling meant less noise. The end result was this:


I tried to make the diagonal lines work, but what I really wanted was something with a lot more 90-degree bends. The lines running into and out of the CPU cooler weren’t the same length, ran across the case at slightly different angles, and when combined with the mostly-horizontal line running from the radiator back to the reservoir, I was pretty unhappy with how it looked. The performance was fine, and I achieved a perfectly stable 4.4 GHz overclock with relative silence. The HZXT Hue+ also provided nice, ever-changing mood lighting which really set the build off.

This year I decided to bring my PC to PAX. There’s a LAN across the street every year, and I figured I could edit and post content without relying on my laptop, play some games, and just have a nice space to myself when I needed a break from the madness of PAX. This was the perfect opportunity to address some of the issues I had with the system.


First up was the tubing. One of the issues I had with the tubing was how it ran all over the case and was visually too messy for my taste. To resolve this I wanted to move the radiator to the front of the case. Despite there seeming to be enough room, I just couldn’t manage to cram the radiator, fans, and reservoir all in the hard drive bay. My backup plan was to keep the radiator in the front, but rotate it so the inlet and outlet were now in the front of the case. This allowed me to make shorter, more direct lines between components and get those parallel 90-degree bends I wanted so badly.

Swapping the radiator back and forth was a massive pain in the ass because every time I would have to remove the bolts holding the fans on, reconnect them, realize I put them on the wrong way and have to do it again. Eventually, I got it all sorted and everything was fine.

Except when I realized I ran the water loop backward through the water block. Luckily that was an easy fix; I just had to flip the block upside down.

Now that the radiator lines are in the front of the case there is no room for a hard drive. The 3 TB hard drive now lives in the ever-cramped basement with all the power cables. Seems happy enough, but in the future, I’d really like to mount it at the bottom of the hard drive case under the reservoir.

The last thing I changed, which isn’t pictured, is swapping the OCZ SSD and the Hue+ controller. I had originally put the SSD in first and didn’t think about the aesthetics when I put the Hue+ controller in. The position of the massive black box started to wear on me over time, so I figured now would be the best time to swap all that stuff around. Now it looks much, much better.

I ordered a set of clear acrylic cable combs for the GPU wiring. It’s not supposed to arrive until Saturday, so if it doesn’t show up early I’ll have to install them at PAX. The last thing I ordered, which should be here the day before PAX, is a plastic scratch remover kit. My plastic case window has been through a lot, and I’d like it to look new before putting it on display for all to see (They’re rather prominent in the video below). Hopefully it gets here, hopefully it works, hopefully my loop doesn’t have a meltdown like in the dream I had last night.

Because pictures are kind of boring these days, here’s a short build video I took and edited in a hurry. There are chunks missing because the battery in my camera died, but all you’re missing is me struggling with the radiator. When I do my next rebuild I’ll tear the system down to bare components and do a complete build video from the ground up.