The Logitech G Cloud

Even though we have a couple of handheld gaming devices in the house already (and they already feel like too many), the siren call of something I could play the occasional game on without squinting at tiny LCDs has been making itself heard for a while.

Which led to my picking up a Logitech G Cloud on eBay during a moment of weakness amidst the holiday break for the serendipitously low price of $200 (pro tip: making offers pays off):

Objects in this picture may be larger than they appear.

I’ve spent the past month or so playing with it as a (mostly) streaming device, and so far it has been a great experience.

Why

In short, I wanted something lightweight and with a big screen where I could play most of the games I never really got around to complete, either via local emulation or via streaming–which I have been .

The was a learning experience in many regards and fit my need for a “hackable appliance” that I could tweak a bit, but I wanted a much larger screen, better battery life and a more finished product overall.

I did consider (and briefly test) bolting a pair of Nintendo Switch controllers to my iPad mini with a 3D printed frame, but besides Apple having blocked game streaming services until recently the result was a bit ramshackle, so a new device seemed… justifiable1.

The Hardware

The device I got was pretty much brand new to the point of still having the screen protector on, and was free of any visible blemishes or scrapes. It came with a 64GB SD card and the original box (including charger, stickers, etc.), which I found intriguing—we certainly can’t spare the space for keeping that kind of thing around unless it’s for a very short period of time, so I have to wonder what motivated the seller to part with it so “soon”.

Its 7” 1920x1080 IPS screen is, in a word, glorious. It knocks the (standard) Switch out of the park where it regards image quality, size and brightness, and although I really wish Logitech had chosen other dominant colors rather than yellow and green for their UI, it really pops out.

The audio is also surprisingly good, partly because the speakers fire downwards from the device and have good distancing, so you do notice stereo separation on modern games.

Ergonomics

The ergonomics of it are also very, very good—it has a contoured shape that is very comfortable to hold (it is also hefty, but much lighter than a comparable handheld PC), and all the buttons are in easy reach.

Handheld aficionados typically want to know about button feel, responsiveness and whatnot, and as far as I’m concerned things are great—the buttons feel responsive, all the analog controls (both joysticks and the analog trigger buttons) feel smooth and precise, and the only thing that would need improvement is the D-pad, which makes it really hard to do diagonals (something I only noticed when trying to play a couple of old arcade games like Ghosts’n’Goblins in RetroArch, but you can work around that by remapping the left joystick).

Battery Life

Battery-wise, I’ve had it last anything from up to a week (with only occasional pickups) down to an intense gaming weekend, which lines up well with the stated 12+ hours.

And that is the killer feature, right there. Something with this kind of battery life is great when, like me, you can go weeks without playing anything or need to relax a bit at random moments throughout the week, since the risk of picking up something with a dead battery is virtually nil.

External Display Support

I had a brief go at plugging the device in to an LG Ultrafine via USB-C and experimenting with Android’s desktop mode (which you need to enable in Developer Settings), and things mostly worked2.

In my case it required rebooting the device to have it actually detect the display (I had no HDMI dongles handy at the time, so it might be a quirk of the old LG) but it worked OK in mirrored mode, and even though I don’t see myself using it in this way regularly, I’ve been wanting an Android device with this kind of functionality for a while.

On-Device Gaming

But let’s talk about games, and get the native gaming part out of the way before diving into meatier things.

Emulation

I knew going in that this wasn’t going to be a stupefyingly powerful device (so things like local Switch emulation wouldn’t work), but the Qualcomm Snapdragon 720G it comes with is an octa-core CPU, so I knew it was going to be at least moderately snappy–but I was still surprised at how well it handled local emulation.

The previous owner had some emulators installed (which I took note of before factory resetting the device) and there were still some ROMs on the SD Card, so I had a brief play with them. I can’t say that I am a fan of the earlier Nintendo or Sega consoles (they were simply not a part of my earlier years), but I found it interesting that I could play a couple of GameCube titles (with a little stutter and glitches that I didn’t bother tweaking the emulator to fix).

I eventually got rid of nearly all of it3 and dropped in a few games and a couple of games to try out , and if, like me, you like a very specific subset of arcade games (like R-Type), you won’t be surprised to know they run like a charm:

Two of my main time sinks: R-Type and Dead Cells

Your mileage may vary, of course, and there are a gazillion videos out there showing how to set up emulators on the G Cloud and how they perform.

For my needs, it is more than enough.

Google Play

Out of curiosity, I also fished around in the Google Play Pass catalog to see what I could get4, but other than Dead Cells (which is intensely addictive and I already had by other means) I found almost no games that we didn’t already have via Apple Arcade or that justified the price.

Streaming

The real reason I got this device was to play games via streaming, and it certainly did not disappoint.

Although many people have panned the G Cloud for its lack of Wi-Fi 6, I have had no issues with it on my 5GHz network, and hopped onto Xbox Game Pass with no issues.

I haven’t tried streaming games directly from my simply because it’s set to completely power off (I don’t like to have hardware in standby mode in the living room, where fan noise would be very noticeable), but, as usual, the Game Pass experience was great (I do have a gigabit fiber connection, so that helps).

As to PC gaming, I have been dual-booting into Windows 10 for a while now, so using Steam Link to that also “just worked”. But dual booting means not just that some of the services on there become unavailable but also that I need to fiddle with the boot menu (which is annoying even with a ), so I decided to create a virtual Steam box instead.

Enter Bazzite

The easier way would probably have been to just set up a Windows VM, but I decided to go all-in on , a gaming OS that is designed to be a SteamOS replacement–and that, unlike most of the SteamOS forks out there, comes with NVIDIA drivers, a GNOME spin and a bunch of other stuff pre-installed–like , which greatly simplified setting up a couple of emulators.

This entailed a bit of work, since I had to enable PCIe passthrough on and convert my LXC AI/ML sandbox onto another VM (since by enabling PCIe passthrough I had to logically isolate the NVIDIA card from the host).

Side Quest: PCIe Passthrough

Setting up passthrough wasn’t a lot of trouble, and boiled down to the following steps:

  • Enable IOMMU by adding intel_iommu=on to the kernel command line in /etc/default/grub and run update-grub (or edit /etc/kernel/cmdline and do proxmox-boot-tool refresh for EFI boot systems).
  • Load the vfio modules at boot by adding them to /etc/modules and blacklisting the nouveau and nvidia drivers:
# cat /etc/modules
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_fb" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf
  • Configure the GPU for PCIe passthrough by finding the PCI identifier and putting it into vfio.conf:
# lspci
# lspci -n -s 01:00 -v
# cat /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:2504,10de:228e disable_vga=1
# update-initramfs -u -k all
# reboot

After that, I installed both a VM and a vanilla Silverblue VM as my new machine learning sandbox. I initially tried the KDE version of , but found it horrible to use when setting things up, so moved to the GNOME one.

I opted for Silverblue to match configuration-wise, and there are OSTree setup notes for NVIDIA drivers to get CUDA working. Plus I have additional if anyone’s interested.

Each of these VMs has 6 cores and at least 16GB of RAM (I have 128GB RAM and 20 cores on borg, so I can afford to be generous), and so far that’s been enough for my needs.

But another thing they both share is that they are split into two disks: a 64GB LVM partition and a 512GB btrfs compressed volume for data, which I can snapshot and backup separately (and saves me space for both TensorFlow models and game data).

And, of course, I made sure I could from my phone. Saying “Siri, start ” to my watch is a bit of a power trip, I must admit, but very convenient.

Streaming Tweaks

I did have to tweak the VM a bit to get Link to stream at 1080p, since whatever I did I ended up having 1280x768 or a similar resolution.

As it turned out I had to turn off dynamic resolution on the server and tell it to match the client’s, which did the trick:

In my defense, the options aren't very intuitive.

Before I figured that out I also tried Moonlight, which on the whole felt a lot more performant, but with a few quirks:

  • No frame rate capping (so lightweight games like Hades would report 250fps).
  • Controller mappings would be a little different, so I couldn’t get the Steam menu to come up in-game.
  • It hard crashed the host a couple of times, which was a bit disconcerting.

This last part has already happened at least once with Steam Link alone (but with Moonlight idle in the background), so I am a bit wary of it. I am not sure what’s going on there, but I suspect I will need to do more than just handling Model Specific Register (MSR) events.

Update: This has (knock on wood) stopped happening ever since I set ignore_msrs=1 in KVM.

Experience

In general, the G Cloud has been able to handle streaming without any noticeable lag. The controls are very responsive (I can play Celeste fine, or at least up to the limit of my abilities, which isn’t saying much), in-game audio doesn’t stutter or crackle, and the image quality is great.

I have also gone through the process of setting up Steam Link on both my and my Apple TV, and strangely enough the Shield displayed a bit of input lag (which might be due to Bluetooth interference, since I have a lot of devices in the living room).

But the Apple TV was pretty much flawless, and I even upped the resolution a bit without any issues (my RTX 3060 struggles a bit with rendering and streaming 4K, though).

RetroDeck

I also had a go at setting up , which is a very nice multi-emulator front-end in the spirit of EmuDeck, but a bit more Linux-centric. Being a flatpak application it can have its quirks regarding file paths (I had to use Flatseal to have it not forget my separate data volume), but it is a lot simpler to set it up and let it do its thing than deal with every emulator independently.

And since I’ve made it a habit of keeping a… er… libre copy of all the Nintendo Wii (and now Switch) games we bought5, it only took me a few minutes to fish out the right files from my NAS and be able play a few of them without any issues.

As usual, you get a nice way to browse your collection.

It should be noted, though (especially if you’re used to emulating Wii or Switch games on a desktop) that neither Steam Link nor Moonlight were able to get motion controls to work–the G Cloud has a 6DOF accelerometer and gyroscope, but the streaming protocols don’t seem to be able to ensure that gets passed through correctly to emulators.

Since I have a couple of 8bitdo Ultimate controllers I intend to get down to the bottom of this somehow, but it’s not a priority right now.

Update: I have gotten motion controls to work directly in Yuzu by using an Android app connected directly to the emulator. It’s a bit of a kludge to use this kind of side channel when Moonlight or should be able to send the motion events themselves, but it works.

Verdict

Now I can play pretty much anything I want on a single device.

I regret nothing.

The G Cloud is a very well designed and efficient piece of hardware, and I have been using it a fair bit more than I expected. It is a great way to play games in the wee hours without being tethered to a TV or a PC, and the battery life is a killer feature.

Of course, I should probably not play games in the wee hours, but I have been using it to unwind and relax after my late night meetings with the US, and it has also been a great way to catch up on a lot of games I never finished.

And as I was drafting this, Logitech actually released a system update for the device, which seems like a good sign that they are still committed to it:

Nice to see this pop up today.

In fact, even though I don’t plan on buying any more gaming hardware this year (except for a Switch 2, if Nintendo gets around to it), I am actually looking forward to seeing what they come up with next.


  1. Besides, it was Christmas and I wanted another present for myself. ↩︎

  2. They were also stark reminder of how dismal the Android Remote Desktop client landscape is these days, but that’s a topic for another day. ↩︎

  3. I am holding on to the original GameBoy Tetris ROM, though–it has a vintage charm that appeals to me. ↩︎

  4. And found out, incidentally, that it is cheaper than Apple Arcade on a standalone basis… ↩︎

  5. I’ve been burned too many times by Nintendo’s inability to preserve their own legacy, and have no qualms about obtaining ROMs for games I have already paid for. ↩︎

This page is referenced in: