Playing Quake Champions On Your Mac with NVIDIA Geforce NOW

A few days ago, amidst some home automation hacking, I got an e-mail that gave me pause: it was the confirmation I’d been accepted into the NVIDIA GeForce NOW beta, which I’d applied for a few months ago but promptly forgot about. That e-mail almost single-handedly prevented me from finishing last week’s post, but provided so much fun that I just had to write something about their service from the perspective of a (nearly) retired FPS gamer.

There have been many attempts at launching game streaming services in the past–some by labels, some by third-parties, and even some by carriers1. What got me interested in GeForce NOW in the first place is that it promised hassle-free access to a few select games I cannot play on my Mac at all, like Quake Champions, which I only managed to install (but hardly play) in a Parallels VM a year back.

NVIDIA’s service is in beta, and relies on two things: data center deployments in several US and EU locations, and a finely tuned streaming protocol (with clients for PC, Mac and their own hardware). Obviously, latency is a major topic here, and has a profound influence on both parts of the equation (there are also a lot of other challenges like bandwidth, capacity, etc., but I’ll get into those later).

Myself, The Armchair Quaker

I dont play a lot of games. In fact, statistically, these days I don’t play at all, but a I spent a lot of time playing QuakeWorld through modem and ISDN dial-up connections, and enough Quake III Arena over cable and DSL to literally play some levels by ear (you can anticipate other players’ moves by listening for item respawns and pickups). In fact, I still have ioquake3 installed on my home machines (I even have an SD card with a preconfigured image for the Raspberry Pi), and given enough free time (which is quite seldom these days) I will play a couple of hours every few months as a sort of extremely invigorating stress relief.

I also ran a games site back in the early 2000s (complete with online game servers, custom mods, etc.), and racked up a fair share of top slots whenever I played for keeps. So I’m not a pro, but I am proficient enough to enjoy the game–and I prefer Quake III Arena-style games because the physics make it tremendously enjoyable, and there is zero committment: you hop in, play for (a usually very intense) 20 minutes or so, and you’re out.

Streamed, Steamed Quake

Which pretty much explains that besides a couple curios (I try Fortnite now and then, but don’t really like it) the only games I bothered trying on Steam were Counter-Strike and Quake Champions:

There are plenty more games, but I only tried these for a few minutes each.

As you’ve probably figured out by now, NVIDIA’s service ties in to Steam (which, amazingly enough, I had never signed up for before), and once you launch the game from the streaming client, it connects you to a GPU-accelerated virtual machine that runs your games (in my case, through the Steam client). And it looks really nice:

Screenshot from my 5K iMac, playing at 1920x1080 and downsampled for posting.

The image quality is much better than what my site can do justice to (I re-compress everything on the fly as progressive JPEGs), but the game design actually helps a lot:

The decor is still dreary, but the rundown look actually helps with the encoding.

Looks, however, aren’t the most important thing here. Besides the learning curve (new levels, somewhat different game physics and even different weapon characteristics2), I had to learn how to cope with three different kinds of latency: input lag, streaming lag, and server lag (since the game servers you end up on are not necessarily co-located with NVIDIA’s front-ends).

How Fast Can You Twitch?

True to my own self and my ISP background, I soon started digging into the networking specifics. The closest data center to me seems to be in France (as confirmed by LittleSnitch and some judicious poking around with traceroute):

Little Snitch is wonderful to keep tabs on this sort of thing. But OH WOW, TEN GIGABYTES OF TRAFFIC!?

Network latency for me seems to be around 30-35ms away as the packets fly (I am currently on a Vodafone fiber connection that transits through Cable & Wireless to get to Abovenet and then to France, which is a little circuituous but workable):

$ traceroute np-par-01.cloudmatchbeta.nvidiagrid.net
traceroute to np-par-01.cloudmatchbeta.nvidiagrid.net (77.111.250.103), 64 hops max, 52 byte packets
 1  vodafonegw (192.168.1.1)  5.868 ms  0.492 ms  0.401 ms
 2  2.96.54.77.rev.vodafone.pt (77.54.96.2)  2.882 ms  2.841 ms  2.892 ms
 3  107.41.30.213.rev.vodafone.pt (213.30.41.107)  2.601 ms  2.956 ms  2.950 ms
 4  ae5-100-ucr1.lis.cw.net (195.10.57.9)  2.920 ms  3.120 ms  2.941 ms
 5  ae5-xcr1.mal.cw.net (195.2.30.230)  12.594 ms  13.334 ms  13.288 ms
 6  ae39-xcr1.ptl.cw.net (195.2.8.109)  33.071 ms  33.420 ms  34.516 ms
 7  abovenet-gw.ptl.cw.net (195.2.22.166)  33.222 ms  33.207 ms  33.262 ms
 8  79.141.46.90.available.above.net (79.141.46.90)  33.641 ms  33.762 ms  33.620 ms
 9  * * *

Now, 30ms isn’t half bad–in fact, it is effectively half the latency I would experience in the old days, and perfectly manageable. But after noticing that traffic was well into the gigabyte range, I decided to start optimizing things and took a little trip to the NVIDIA client configuration dialog:

The default "Competitive" settings.

However, this made for rather muddy graphics (well, perfectly good on a smaller display, but I have a 27” 5K iMac, and I do like to snipe without zooming), so I eventually compromised and punched up the graphics back to full HD but switched off V-Sync.

I also dug out a wired USB mouse (Apple’s Magic Mouse is surprisingly good for playing, but Bluetooth didn’t help with the input lag) and filtered out some servers inside Quake Champions itself:

It pays to filter out some servers, even if matchmaking takes a bit longer.

So, in summary, I:

  • Minimized input lag (and, from a cursory read of the beta forums, likely sidestepped other issues) by using a USB mouse
  • Tweaked the video settings to a compromise of my own choosing, which helped with rendering times
  • Filtered out high-ping servers inside the game, making sure NVIDIA’s front-end only connected to EU servers (which meant NVIDIA and my provider became the sole bottlenecks)

After a few more sessions, things started looking up, and I started racking up medals at a fair clip:

I still have this particular knack, and my railgun scores improved too!

Of course, this is also because railguns and rockets are cannier weapons–you anticipate your opponent’s moves rather than twitch to hit them, and as such they are more effective in higher latency scenarios.

On the other hand, I am still hopeless at reacting in close quarters engagements, since I still can’t turn and aim accurately at speed (hopefully that will improve as I re-tune my muscle memory).

Rolling Your Own

By this time, the engineer in me was more than a little curious as to how much trouble (and cost) it would take me to put together something on my own. After all, two years ago it was entirely feasible to run Overwatch on an Azure GPU instance, so… What was the state of the art right now?

Well, in the past couple of years a bunch of other people came up with similar ideas, and it took me no time at all to find ecalder6/azure-gaming, which has a pre-built Azure Resource Manager template that fires up an NV6 instance running Windows (and the required graphics), installs Steam and ZeroTier, and enables you to play through SteamLink as if the GPU machine was on your LAN–which, let’s face it, is a very cool trick.

And it works, too, even if I only tried it at 1280x720 (excuse the muddy graphics):

Note the latency chart and diagnostics at the bottom.

It was fast enough to be playable without any tweaking, but usability is a pain. Going to the trouble of firing up ZeroTier and starting the remote VM manually and then trying to connect via Steam (which you also have to download and install on your Mac) takes a lot of the shine off it, and I wasn’t inclined to do more than a cursory attempt to match NVIDIA’s streaming experience (which I suspect I wouldn’t be able to, since the Steam Link protocol is optimized for LANs and this is an entirely different ball game…).

Running an NV6 on my personal Azure subscription soon became (literally) the top billing item, weighing in at over €16 after initial setup and a few rounds of playing–I can dial this back a little using a slightly different VM class and deploying as a preemptible instance, but it will always cost me roughly €1.4 an hour for the CPU/GPU alone, plus a couple more Euro for hard disk usage and long-term storage (usage was pretty high during setup, which accounts at least for half the amount) and a few cents of outbound bandwidth.

And compared with hosting a few websites and running some PaaS services, it is noticeably more expensive:

This is completely unoptimized (and anonymized) but that bump is telling.

Of course, this is likely to be substantially less going forward since keeping the VM disk around only costs a few cents and what matters is the runtime usage. There’s a more detailed price breakdown of various options in the ecalder6/azure-gaming README (the values are outdated and vary depending on region, but the proportions should hold up).

Regardless, this brings us to the question of what will happen when the NVIDIA beta ends and how much it will cost (which I couldn’t find any hard data on).

So What Next?

I’d really like NVIDIA to be successful with GeForce NOW, partly because the experience is way better than anything I’ve used before (especially because they have EU datacenters, unlike the other services I tried) and because I think there is a lot of opportunity for casual gamers and Mac users like myself.

I don’t see the service appealing to regular players (who will have their own gaming rigs) and even less to pros (who, like me, will be very sensitive to latency), but anyone who only has a Mac (or a lower-specced PC) and wants to play AAA titles is going to be interested, since playing 40-odd hours to finish a story-driven title is always going to be much cheaper than investing in a GPU (or, in my case, in an entirely standalone PC, or at least an external GPU).

I just don’t know if it is a big enough market, but then again maybe that doesn’t really matter at this point, and it’s really about upending the game distribution model… Which would make a lot of sense, if you ask me, since I see little point in gaming consoles such as they are these days.

But there is a point worth making: since I’m only interested in quick “in and out” matches every now and then (and only in Quake Champions right now), I don’t see myself paying for a fixed-value subscription–even considering that it completely removes the hassle of buying and maintaining a gaming PC, I just don’t play enough to justify paying a fixed monthly fee for it.

However, if they go for a PAYG or prepaid approach (say, €2 an hour payable whenever I feel like letting off some steam3), then I’m certainly going to stick around.

The Longest Yard, which feels entirely too much like returning home after a long absence.

  1. I was involved in the first attempts at building a macOS client for MEO Jogos, which was a similar, but much less sophisticated solution–getting usable frames out of an “encrypted” video stream was a fun puzzle, but one I was not able to fully solve on my own. ↩︎

  2. One of my sore points with Quake Champions is that single-shot rocket or railgun kills are much harder (especially since splash damage doesn’t work the same way), and that whomever has the lightning gun and low ping will completely own a level, since they can aim and turn much faster and accurately. Weapons were re-balanced, sure, but not evenly. ↩︎

  3. I know it’s a weak pun, but I just had to run with it. ↩︎