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):
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 dabbling in for quite a while.
The Retroid Pocket 3 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 PICO-8 games and a couple of ZX Spectrum 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:
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 Xbox Series X 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 borg
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 PiKVM), 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 Bazzite
, a Fedora-based 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 RetroDECK, which greatly simplified setting up a couple of emulators.
This entailed a bit of work, since I had to enable PCIe passthrough on borg
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 addingintel_iommu=on
to the kernel command line in/etc/default/grub
and runupdate-grub
(or edit/etc/kernel/cmdline
and doproxmox-boot-tool refresh
forEFI
boot systems). - Load the
vfio
modules at boot by adding them to/etc/modules
and blacklisting thenouveau
andnvidia
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 thePCI
identifier and putting it intovfio.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 Bazzite
VM and a vanilla Fedora Silverblue VM as my new machine learning sandbox. I initially tried the KDE
version of Bazzite
, but found it horrible to use when setting things up, so moved to the GNOME
one.
I opted for Silverblue to match Bazzite
configuration-wise, and there are OSTree setup notes for NVIDIA
drivers to get CUDA
working. Plus I have additional notes on Xrdp setup 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 start them remotely with ease from my phone. Saying “Siri, start Steam” to my watch is a bit of a power trip, I must admit, but very convenient.
Streaming Tweaks
I did have to tweak the Bazzite
VM a bit to get Steam 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:
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
inKVM
.
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 NVIDIA Shield 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 RetroDeck, 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.
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 Steam should be able to send the motion events themselves, but it works.
Verdict
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:
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.
-
Besides, it was Christmas and I wanted another present for myself. ↩︎
-
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. ↩︎
-
I am holding on to the original GameBoy Tetris ROM, though–it has a vintage charm that appeals to me. ↩︎
-
And found out, incidentally, that it is cheaper than Apple Arcade on a standalone basis… ↩︎
-
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. ↩︎