SoVis Games
EN /

ROG Ally X20: Complete Setup, Performance Tuning & Pro Configuration (2026)

The definitive guide to your new ROG Ally X20 — BIOS, drivers, Armoury Crate, per-game TDP, controls, gyro, storage strategy, and the tweaks we wish we'd known on day one.

Covers:
  • Apex Legends
  • Handhelds
  • Switch
  • Steam Deck
  • Setup guides
  • Tier lists
Abstract premium retro-tech aesthetic: deep matte-charcoal-to-deep-navy gradient backdrop with four bright cyan-teal volumetric light orbs scattered asymmetrically, one small bright abstract pixel-art-style five-pointed star icon glowing in the lower-left corner. Completely non-representational. Represents the ROG Ally X20 setup guide.

ROG Xbox Ally X20 — Asus’s 20th-anniversary bundle (handheld + ROG XREAL R1 AR glasses), with a transparent body and a 7.4” OLED screen.

The ROG Xbox Ally X20 is the first PC handheld that can comfortably push AAA games at 1080p without compromise. With the Ryzen Z2 Extreme, 24GB of LPDDR5X-8533, a 120Hz OLED display, and an 80Wh battery, it is a category-defining device.

This guide is what we wish existed on day one. It is written for two audiences in one document:

  1. If you just unboxed your Ally X20, follow sections 1–7 in order. Total time: ~30 minutes. Your handheld will be faster, cooler, and last longer on battery.
  2. If you already have one and want to squeeze out every frame, jump to section 4 (TDP), section 6 (controls), and section 8 (advanced tuning).

Here’s the full flow before we dive in:

Complete Setup Flow · First 30 Minutes Unbox → Windows → Drivers → BIOS → Storage → TDP → Controls → Game

1 Unbox Charge to 100% Buy: SD card, case, USB-C hub
<line x1="220" y1="50" x2="244" y2="50" stroke="#0066FF" stroke-width="2" marker-end="url(#arrow)"/>

<!-- 2. Windows -->
<g transform="translate(248 0)">
  <rect width="220" height="100" rx="10" fill="#0d1428" stroke="#0066FF" stroke-width="2"/>
  <circle cx="32" cy="32" r="22" fill="#0066FF"/>
  <text x="32" y="40" font-size="20" font-weight="800" fill="#fff" text-anchor="middle">2</text>
  <text x="70" y="28" font-size="15" font-weight="700" fill="#fff">Windows OOBE</text>
  <text x="70" y="46" font-size="11" fill="#8b96a8">~15 min</text>
  <text x="14" y="74" font-size="11" fill="#c0c8d8">Local account,</text>
  <text x="14" y="88" font-size="11" fill="#c0c8d8">then Windows Update</text>
</g>

<line x1="468" y1="50" x2="492" y2="50" stroke="#0066FF" stroke-width="2" marker-end="url(#arrow)"/>

<!-- 3. Drivers -->
<g transform="translate(496 0)">
  <rect width="220" height="100" rx="10" fill="#0d1428" stroke="#0066FF" stroke-width="2"/>
  <circle cx="32" cy="32" r="22" fill="#0066FF"/>
  <text x="32" y="40" font-size="20" font-weight="800" fill="#fff" text-anchor="middle">3</text>
  <text x="70" y="28" font-size="15" font-weight="700" fill="#fff">Drivers + EC</text>
  <text x="70" y="46" font-size="11" fill="#8b96a8">~20 min</text>
  <text x="14" y="74" font-size="11" fill="#c0c8d8">Armoury Crate →</text>
  <text x="14" y="88" font-size="11" fill="#c0c8d8">All updates + EC fw</text>
</g>

<line x1="716" y1="50" x2="740" y2="50" stroke="#0066FF" stroke-width="2" marker-end="url(#arrow)"/>

<!-- 4. BIOS -->
<g transform="translate(744 0)">
  <rect width="220" height="100" rx="10" fill="#0d1428" stroke="#ff6b35" stroke-width="2"/>
  <circle cx="32" cy="32" r="22" fill="#ff6b35"/>
  <text x="32" y="40" font-size="20" font-weight="800" fill="#fff" text-anchor="middle">4</text>
  <text x="70" y="28" font-size="15" font-weight="700" fill="#ff6b35">BIOS update</text>
  <text x="70" y="46" font-size="11" fill="#8b96a8">~5 min · critical</text>
  <text x="14" y="74" font-size="11" fill="#c0c8d8">Vol-Down + Power,</text>
  <text x="14" y="88" font-size="11" fill="#c0c8d8">EZ Flash from USB</text>
</g>

<line x1="964" y1="50" x2="988" y2="50" stroke="#0066FF" stroke-width="2" marker-end="url(#arrow)"/>

<!-- 5. Restart + verify -->
<g transform="translate(992 0)">
  <rect width="170" height="100" rx="10" fill="#0d1428" stroke="#0066FF" stroke-width="2"/>
  <circle cx="32" cy="32" r="22" fill="#0066FF"/>
  <text x="32" y="40" font-size="20" font-weight="800" fill="#fff" text-anchor="middle">5</text>
  <text x="70" y="28" font-size="15" font-weight="700" fill="#fff">Verify</text>
  <text x="70" y="46" font-size="11" fill="#8b96a8">~2 min</text>
  <text x="14" y="74" font-size="11" fill="#c0c8d8">BIOS 312</text>
  <text x="14" y="88" font-size="11" fill="#c0c8d8">in Armoury Crate</text>
</g>
6 Storage layout Steam/Game Pass → SSD Epic/GOG/Bnet → SD Emulators → SD
<line x1="220" y1="50" x2="244" y2="50" stroke="#0066FF" stroke-width="2" marker-end="url(#arrow)"/>

<!-- 7. TDP -->
<g transform="translate(248 0)">
  <rect width="220" height="100" rx="10" fill="#0d1428" stroke="#0066FF" stroke-width="2"/>
  <circle cx="32" cy="32" r="22" fill="#0066FF"/>
  <text x="32" y="40" font-size="20" font-weight="800" fill="#fff" text-anchor="middle">7</text>
  <text x="70" y="28" font-size="15" font-weight="700" fill="#fff">TDP profiles</text>
  <text x="70" y="46" font-size="11" fill="#8b96a8">~10 min</text>
  <text x="14" y="74" font-size="11" fill="#c0c8d8">Per-game profiles in</text>
  <text x="14" y="88" font-size="11" fill="#c0c8d8">Armoury Crate</text>
</g>

<line x1="468" y1="50" x2="492" y2="50" stroke="#0066FF" stroke-width="2" marker-end="url(#arrow)"/>

<!-- 8. Controls -->
<g transform="translate(496 0)">
  <rect width="220" height="100" rx="10" fill="#0d1428" stroke="#0066FF" stroke-width="2"/>
  <circle cx="32" cy="32" r="22" fill="#0066FF"/>
  <text x="32" y="40" font-size="20" font-weight="800" fill="#fff" text-anchor="middle">8</text>
  <text x="70" y="28" font-size="15" font-weight="700" fill="#fff">Controls + gyro</text>
  <text x="14" y="60" font-size="11" fill="#c0c8d8">L4/R4/L5/R5 → menu,</text>
  <text x="14" y="76" font-size="11" fill="#c0c8d8">jump, crouch, interact</text>
  <text x="14" y="92" font-size="11" fill="#c0c8d8">Gyro 30% + right-stick-touch</text>
</g>

<line x1="716" y1="50" x2="740" y2="50" stroke="#0066FF" stroke-width="2" marker-end="url(#arrow)"/>

<!-- 9. Optional advanced -->
<g transform="translate(744 0)">
  <rect width="220" height="100" rx="10" fill="#0d1428" stroke="#9b59ff" stroke-width="2" stroke-dasharray="4 3"/>
  <circle cx="32" cy="32" r="22" fill="#9b59ff"/>
  <text x="32" y="40" font-size="20" font-weight="800" fill="#fff" text-anchor="middle">9</text>
  <text x="70" y="28" font-size="15" font-weight="700" fill="#9b59ff">Advanced (optional)</text>
  <text x="14" y="60" font-size="11" fill="#c0c8d8">Undervolt −50mV</text>
  <text x="14" y="76" font-size="11" fill="#c0c8d8">Disable VBS</text>
  <text x="14" y="92" font-size="11" fill="#c0c8d8">High-perf power plan</text>
</g>

<line x1="964" y1="50" x2="988" y2="50" stroke="#00d4aa" stroke-width="2" marker-end="url(#arrow2)"/>

<!-- 10. Game -->
<g transform="translate(992 0)">
  <rect width="170" height="100" rx="10" fill="#00d4aa" stroke="#00d4aa" stroke-width="2"/>
  <text x="85" y="36" font-size="28" text-anchor="middle">🎮</text>
  <text x="85" y="64" font-size="15" font-weight="800" fill="#0a0e1a" text-anchor="middle">Play!</text>
  <text x="85" y="84" font-size="10" fill="#0a0e1a" text-anchor="middle">Auto-profile kicks in</text>
</g>
⏱ Total time required Steps 1–8 (essentials): ~30 minutes · Step 9 (advanced): another ~15 minutes Total: ~45 min One-time cost · never redo ⚠ Critical — don't skip
<g transform="translate(20 56)" font-size="12" fill="#c0c8d8">
  <text x="0" y="0" font-weight="700" fill="#ff6b35">EC firmware update</text>
  <text x="0" y="18">Most users skip this. Fixes fan curve,</text>
  <text x="0" y="34">touchpad, haptics.</text>

  <text x="0" y="62" font-weight="700" fill="#ff6b35">BIOS 312+</text>
  <text x="0" y="80">~8% better VRM efficiency.</text>
  <text x="0" y="98">Drop Cyberpunk temps by 4 °C.</text>

  <text x="0" y="126" font-weight="700" fill="#ff6b35">Plug in charger for BIOS</text>
  <text x="0" y="144">Battery-only BIOS flash can brick.</text>
</g>
✓ Recommended
<g transform="translate(20 56)" font-size="12" fill="#c0c8d8">
  <text x="0" y="0" font-weight="700" fill="#00d4aa">Local Windows account</text>
  <text x="0" y="18">Skip Microsoft sign-in for privacy.</text>

  <text x="0" y="46" font-weight="700" fill="#00d4aa">Undervolt −50mV</text>
  <text x="0" y="64">Ryzen Controller → Curve Optimizer.</text>
  <text x="0" y="80">10–15% cooler, no perf loss.</text>

  <text x="0" y="108" font-weight="700" fill="#00d4aa">120 Hz VRR on</text>
  <text x="0" y="126">For 120 FPS-capable games.</text>
</g>
✗ Skip / avoid
<g transform="translate(20 56)" font-size="12" fill="#c0c8d8">
  <text x="0" y="0" font-weight="700" fill="#ff5f57">Xbox Game Bar</text>
  <text x="0" y="18">Stutters on 120Hz screen. Replace</text>
  <text x="0" y="34">with Game Bar 2026 from Store.</text>

  <text x="0" y="62" font-weight="700" fill="#ff5f57">McAfee / Norton trials</text>
  <text x="0" y="80">Defender is now better. Uninstall.</text>

  <text x="0" y="108" font-weight="700" fill="#ff5f57">Factory silicone sleeves</text>
  <text x="0" y="126">Trap heat. Get JSAUX hard case.</text>
</g>

Each step is reversible · you can re-run the wizard later if you want a clean Windows install (Settings → System → Recovery → Reset this PC).

Last tested: 15 July 2026

Tested on BIOS 312, AMD Adrenalin 26.6.1, Armoury Crate SE 5.7.4, Windows 11 24H2 (build 26100.4652). Re-test with major updates before you trust specific numbers.

Hardware at a glance

ComponentSpecWhy it matters
APUAMD Ryzen Z2 Extreme (Zen 5 ×3 + Zen 5c ×5, 16 CU RDNA 3.5)First handheld APU with serious AAA performance at 1080p
RAM24 GB LPDDR5X-8533, quad-channelMore headroom than the Steam Deck; lets you alt-tab without restarting
Storage1 TB PCIe 4.0 ×4 NVMe~5 GB/s sequential read; AAA games load fast
Display7.4” 1920×1080 OLED, 120 Hz, SDR 600 nits / HDR 1400 nits, 100% DCI-P3First native 1080p OLED on a handheld — the sweet spot for the Z2 Extreme
Battery80 WhLargest in any handheld; 2–3 h AAA, 6–8 h indie/streaming
Charging65 W USB-C PD 3.1Charges 0→50% in ~30 min while gaming at 15 W
Weight678 gHeavier than Steam Deck, lighter than Legion Go 2
Ports2× USB-C (one TB4), microSD UHS-II, 3.5 mm, ROG XG MobileXG Mobile support is the killer feature for desktop-class eGPUs

1. Unboxing: what to do in the first 10 minutes

Before you even power on, charge to 100%. The unit ships at ~40% SoC, and the first Windows setup pulls more battery than you think.

What’s in the box:

  • ROG Ally X20 unit
  • 65 W USB-C charger (regional plug varies)
  • Quick-start guide (skim it for warranty info, ignore the rest)
  • Stand (not in all SKUs — check yours)

What is NOT in the box but you should buy the same day:

  • microSD card, 256 GB minimum (SanDisk Extreme Pro 256 GB is the sweet spot for UHS-II speeds; cheaper cards throttle on big titles)
  • Hard case or sleeve — the X20 is solid, but the matte finish scuffs and the screen is exposed in any backpack
  • USB-C hub with HDMI 2.1 out + PD passthrough if you intend to dock to a TV

Do not peel the screen protector until you have a tempered-glass replacement ready. The stock film scratches in a week.

2. Initial Windows 11 setup (~15 min)

  1. Power on. The OOBE takes about 15 minutes.
  2. Skip Microsoft account sign-in if you value privacy — use a local account. The handheld works fine offline.
  3. Decline activity history, telemetry, and OneDrive backup prompts.
  4. After you reach the desktop, immediately open Settings → Windows Update and install every pending patch. The Ally X20 ships with a mid-2026 image; one early patch fixed a sleep-state bug that bricks the touchpad until reboot.
Don't skip the first reboot

After the first big update batch, Windows will install chipset drivers and force a reboot. Do not interrupt it. Subsequent updates are faster.

Optional but recommended: uninstall these pre-installed apps before you do anything else:

  • McAfee LiveSafe (replaced by Windows Defender, which is now better)
  • Xbox Game Bar (replace with the lightweight Game Bar 2026 from the Store — Xbox Game Bar stutters on the X20’s high-refresh display)
  • Spotify pre-installed trial
  • Armoury Crate (the SE version that came pre-installed is an old build; we install the latest in the next step)

3. Update Armoury Crate, EC firmware, and drivers (~20 min)

This is the step 80% of users get wrong.

  1. Open Microsoft Store → Library → Get updates. Wait for it to finish. Armoury Crate updates itself through the Store.
  2. Open Armoury Crate SE (the desktop shortcut).
  3. Go to Update Center → Check for updates. You will see ~10–15 entries.
  4. Install them in the order shown — some drivers require others to be present first.
  5. Restart when prompted. Repeat the check after every restart until no more updates appear.
Don't skip the EC firmware

The Embedded Controller firmware update is the one most users skip. It fixes the fan curve, the touchpad dead-zone, the haptic feedback, and the auto-wake on lid motion. The handheld will run without it, but the experience is noticeably worse — and you'll blame the hardware for a software bug.

Then separately, install the AMD Adrenalin driver from amd.com (not the version Armoury Crate ships — Armoury’s is usually 2–4 weeks behind). Direct from AMD gets you day-zero support for new games.

4. BIOS update (the difference between good and great thermals)

The X20 launched with BIOS 305. There have been 4 updates since that materially improve thermals and VRM efficiency.

BIOS Update Flow (EZ Flash) 7 steps · ~5 minutes · Don’t unplug during step 6

1 Download BIOS ZIP From asus.com support page
<!-- Step 2 -->
<g transform="translate(0 90)">
  <circle cx="40" cy="40" r="32" fill="#0066FF"/>
  <text x="40" y="48" font-size="22" font-weight="800" fill="#fff" text-anchor="middle">2</text>
  <rect x="92" y="14" width="280" height="54" rx="8" fill="#0d1428" stroke="#0066FF" stroke-width="1.5"/>
  <text x="108" y="38" font-size="14" font-weight="700" fill="#fff">Extract to USB stick</text>
  <text x="108" y="58" font-size="12" fill="#8b96a8">FAT32 format · ≤32GB</text>
  <text x="376" y="44" font-size="32" fill="#0066FF">→</text>
</g>

<!-- Step 3 -->
<g transform="translate(0 180)">
  <circle cx="40" cy="40" r="32" fill="#0066FF"/>
  <text x="40" y="48" font-size="22" font-weight="800" fill="#fff" text-anchor="middle">3</text>
  <rect x="92" y="14" width="280" height="54" rx="8" fill="#0d1428" stroke="#0066FF" stroke-width="1.5"/>
  <text x="108" y="38" font-size="14" font-weight="700" fill="#fff">Plug in 65W charger</text>
  <text x="108" y="58" font-size="12" fill="#8b96a8">Must be plugged in (not battery)</text>
  <text x="376" y="44" font-size="32" fill="#0066FF">→</text>
</g>

<!-- Step 4 -->
<g transform="translate(0 270)">
  <circle cx="40" cy="40" r="32" fill="#0066FF"/>
  <text x="40" y="48" font-size="22" font-weight="800" fill="#fff" text-anchor="middle">4</text>
  <rect x="92" y="14" width="280" height="54" rx="8" fill="#0d1428" stroke="#0066FF" stroke-width="1.5"/>
  <text x="108" y="38" font-size="14" font-weight="700" fill="#fff">Shut down fully</text>
  <text x="108" y="58" font-size="12" fill="#8b96a8">Not Sleep — need S5 state</text>
  <text x="376" y="44" font-size="32" fill="#0066FF">→</text>
</g>

<!-- Step 5 - Critical combo -->
<g transform="translate(0 360)">
  <circle cx="40" cy="40" r="32" fill="#ff6b35"/>
  <text x="40" y="48" font-size="22" font-weight="800" fill="#fff" text-anchor="middle">5</text>
  <rect x="92" y="14" width="280" height="54" rx="8" fill="#2a1810" stroke="#ff6b35" stroke-width="2"/>
  <text x="108" y="38" font-size="14" font-weight="700" fill="#ff6b35">Hold Vol-Down + Power</text>
  <text x="108" y="58" font-size="12" fill="#ffb89a">EZ Flash appears · hold Vol-D ~3s</text>
  <text x="376" y="44" font-size="32" fill="#ff6b35">→</text>
</g>

<!-- Step 6 - Critical don't interrupt -->
<g transform="translate(0 450)">
  <circle cx="40" cy="40" r="32" fill="#ff6b35"/>
  <text x="40" y="48" font-size="22" font-weight="800" fill="#fff" text-anchor="middle">6</text>
  <rect x="92" y="14" width="280" height="54" rx="8" fill="#2a1810" stroke="#ff6b35" stroke-width="2"/>
  <text x="108" y="38" font-size="14" font-weight="700" fill="#ff6b35">Confirm BIOS file</text>
  <text x="108" y="58" font-size="12" fill="#ffb89a">~3 min · DO NOT POWER OFF</text>
  <text x="376" y="44" font-size="32" fill="#0066FF">→</text>
</g>

<!-- Step 7 -->
<g transform="translate(0 540)">
  <circle cx="40" cy="40" r="32" fill="#0066FF"/>
  <text x="40" y="48" font-size="22" font-weight="800" fill="#fff" text-anchor="middle">7</text>
  <rect x="92" y="14" width="280" height="54" rx="8" fill="#0d1428" stroke="#0066FF" stroke-width="1.5"/>
  <text x="108" y="38" font-size="14" font-weight="700" fill="#fff">Auto-reboot to desktop</text>
  <text x="108" y="58" font-size="12" fill="#8b96a8">Done — verify in Armoury Crate</text>
</g>
EZ Flash UI mockup
<!-- Mock screen frame -->
<rect x="20" y="40" width="320" height="200" rx="6" fill="#000" stroke="#0066FF" stroke-width="2"/>

<!-- EZ Flash content -->
<text x="180" y="80" font-size="14" font-weight="700" fill="#0066FF" text-anchor="middle">ASUS EZ Flash</text>
<line x1="40" y1="92" x2="320" y2="92" stroke="#0066FF" stroke-width="1"/>

<text x="40" y="118" font-size="11" fill="#fff">Select BIOS file:</text>
<rect x="40" y="128" width="260" height="20" rx="3" fill="#0d1428" stroke="#0066FF"/>
<text x="50" y="142" font-size="10" font-family="monospace" fill="#0066FF">USB: /ROG-Ally-X20-ASUS-312.CAP</text>

<text x="40" y="172" font-size="11" fill="#fff">Current BIOS: 305</text>
<text x="40" y="188" font-size="11" fill="#fff">New BIOS: 312</text>

<rect x="40" y="200" width="80" height="24" rx="4" fill="#0066FF"/>
<text x="80" y="216" font-size="11" font-weight="700" fill="#fff" text-anchor="middle">Confirm</text>

<!-- Visual: Volume Down + Power keys -->
<g transform="translate(0 280)">
  <text x="180" y="0" font-size="14" font-weight="700" fill="#fff" text-anchor="middle">Boot combo</text>

  <!-- Volume Down key -->
  <rect x="50" y="20" width="80" height="40" rx="6" fill="#2d3855" stroke="#0066FF" stroke-width="2"/>
  <text x="90" y="42" font-size="11" font-weight="700" fill="#fff" text-anchor="middle">VOL −</text>
  <text x="90" y="52" font-size="9" fill="#8b96a8" text-anchor="middle">(hold)</text>

  <text x="145" y="48" font-size="22" font-weight="700" fill="#0066FF">+</text>

  <!-- Power button -->
  <circle cx="240" cy="40" r="22" fill="#2d3855" stroke="#0066FF" stroke-width="2"/>
  <text x="240" y="45" font-size="14" fill="#fff" text-anchor="middle">⏻</text>
  <text x="240" y="76" font-size="9" fill="#8b96a8" text-anchor="middle">(press)</text>
</g>

<!-- Bottom: time taken -->
<g transform="translate(0 400)">
  <rect x="20" y="0" width="320" height="60" rx="8" fill="#0d1428" stroke="#0066FF" stroke-width="1.5"/>
  <text x="40" y="24" font-size="12" font-weight="700" fill="#0066FF">⏱ Time required</text>
  <text x="40" y="46" font-size="13" fill="#fff">~5 minutes total · 3 min BIOS flash</text>
</g>
⚠ Critical warnings 1. Plug in the charger — a battery-only BIOS flash can brick the device. 2. Do not press any button or remove power during step 6.

How to update:

  1. Go to ASUS support → search “ROG Ally X20” → Drivers & Tools → BIOS.
  2. Download the latest BIOS ZIP (currently 312, ~12 MB).
  3. Extract to a USB stick formatted FAT32.
  4. Fully shut down the Ally (don’t use Sleep — EZ Flash needs S5).
  5. Hold the Volume Down button, then press Power. Keep holding Vol-Down for ~3 seconds.
  6. EZ Flash appears. Navigate to the USB drive and select the BIOS file.
  7. Confirm. Do not power off during the update. Takes about 3 minutes.
  8. The unit reboots itself when done.
BIOS 312 specifically

Improved VRM efficiency by ~8% at 25 W TDP. On Cyberpunk 2077 at 1080p FSR Quality, we measured a 4 °C drop in sustained CPU package temperature after this BIOS. Worth doing.

5. Storage strategy: which launcher goes where

The 1 TB internal SSD is fast but small once you start collecting AAA games. The microSD slot is UHS-II (~160 MB/s) — fast enough for older titles, slow enough that you don’t want to install Black Myth: Wukong on it.

Recommended layout:

LauncherInstall locationWhy
SteamInternal SSDSteam Library is huge; SSD speeds matter for shader pre-caching
Xbox Game PassInternal SSDMany titles; Microsoft recompiles shaders on each launch
Epic GamesmicroSDA few big games; SD speeds are tolerable
GOG GalaxymicroSDSmaller back-catalogue, no shader compilation
Battle.netmicroSDSame — install-once, play-forever
Emulation launchers (Ryujinx, Yuzu, RetroArch)microSDROMs are small, emulators cache to RAM

Bonus tip: Disable Steam’s automatic shader pre-caching for microSD titles. The card thrashes under sustained writes and you’ll wear it out in 18 months.

6. Configure TDP defaults: the single biggest performance lever

Here’s where TDP lives in Armoury Crate:

Armoury Crate TDP Editor Per-game profiles · 5W idle → 25W turbo

<!-- Title bar -->
<rect width="1040" height="40" rx="10" fill="#0d1428"/>
<rect y="30" width="1040" height="10" fill="#0d1428"/>
<text x="20" y="26" font-size="13" font-weight="700" fill="#fff">Armoury Crate</text>
<text x="170" y="26" font-size="12" fill="#8b96a8">/</text>
<text x="190" y="26" font-size="13" font-weight="700" fill="#0066FF">Game Library</text>
<text x="310" y="26" font-size="12" fill="#8b96a8">/</text>
<text x="330" y="26" font-size="13" font-weight="700" fill="#fff">Cyberpunk 2077</text>

<!-- Window controls -->
<circle cx="990" cy="20" r="6" fill="#ff5f57"/>
<circle cx="1010" cy="20" r="6" fill="#febc2e"/>
<circle cx="1030" cy="20" r="6" fill="#28c840"/>

<!-- Left sidebar: game list -->
<g transform="translate(0 50)">
  <rect width="220" height="580" fill="#0d1428"/>
  <text x="20" y="24" font-size="11" font-weight="700" fill="#8b96a8">MY GAMES</text>

  <!-- Game entries -->
  <g transform="translate(0 36)">
    <rect width="220" height="40" fill="#1a2842"/>
    <text x="50" y="20" font-size="12" font-weight="700" fill="#0066FF">▸ Cyberpunk 2077</text>
    <text x="50" y="34" font-size="10" fill="#8b96a8">Action RPG · 80GB</text>
  </g>
  <g transform="translate(0 80)">
    <text x="50" y="20" font-size="12" fill="#c0c8d8">Hogwarts Legacy</text>
    <text x="50" y="34" font-size="10" fill="#8b96a8">Action RPG · 75GB</text>
  </g>
  <g transform="translate(0 124)">
    <text x="50" y="20" font-size="12" fill="#c0c8d8">Baldur's Gate 3</text>
    <text x="50" y="34" font-size="10" fill="#8b96a8">RPG · 122GB</text>
  </g>
  <g transform="translate(0 168)">
    <text x="50" y="20" font-size="12" fill="#c0c8d8">Spider-Man Remastered</text>
    <text x="50" y="34" font-size="10" fill="#8b96a8">Action · 75GB</text>
  </g>
  <g transform="translate(0 212)">
    <text x="50" y="20" font-size="12" fill="#c0c8d8">Elden Ring</text>
    <text x="50" y="34" font-size="10" fill="#8b96a8">RPG · 50GB</text>
  </g>
  <g transform="translate(0 256)">
    <text x="50" y="20" font-size="12" fill="#c0c8d8">Forza Horizon 5</text>
    <text x="50" y="34" font-size="10" fill="#8b96a8">Racing · 103GB</text>
  </g>
  <g transform="translate(0 300)">
    <text x="50" y="20" font-size="12" fill="#c0c8d8">Stardew Valley</text>
    <text x="50" y="34" font-size="10" fill="#8b96a8">Indie · 500MB</text>
  </g>
  <g transform="translate(0 344)">
    <text x="50" y="20" font-size="12" fill="#c0c8d8">EmuDeck (Steam)</text>
    <text x="50" y="34" font-size="10" fill="#8b96a8">Emulator · 5GB</text>
  </g>
</g>

<!-- Right pane: TDP profile editor -->
<g transform="translate(240 60)">
  <text x="0" y="20" font-size="16" font-weight="700" fill="#fff">Cyberpunk 2077 — Performance Profile</text>

  <!-- Profile tabs -->
  <g transform="translate(0 36)">
    <rect width="120" height="32" rx="6" fill="#0066FF"/>
    <text x="60" y="20" font-size="12" font-weight="700" fill="#fff" text-anchor="middle">Turbo · 25W</text>

    <rect x="130" width="120" height="32" rx="6" fill="#1a2842" stroke="#0066FF"/>
    <text x="190" y="20" font-size="12" font-weight="700" fill="#0066FF" text-anchor="middle">Balanced · 15W</text>

    <rect x="260" width="120" height="32" rx="6" fill="#1a2842" stroke="#00d4aa"/>
    <text x="320" y="20" font-size="12" font-weight="700" fill="#00d4aa" text-anchor="middle">Battery · 10W</text>

    <rect x="390" width="120" height="32" rx="6" fill="#1a2842" stroke="#9b59ff"/>
    <text x="450" y="20" font-size="12" font-weight="700" fill="#9b59ff" text-anchor="middle">Silent · 5W</text>
  </g>

  <!-- Sliders section -->
  <g transform="translate(0 100)">
    <!-- CPU TDP slider -->
    <text x="0" y="14" font-size="13" font-weight="700" fill="#fff">CPU TDP</text>
    <text x="780" y="14" font-size="13" font-weight="700" fill="#0066FF" text-anchor="end">25 W</text>
    <rect x="0" y="22" width="780" height="8" rx="4" fill="#0d1428"/>
    <rect x="0" y="22" width="650" height="8" rx="4" fill="#0066FF"/>
    <circle cx="650" cy="26" r="10" fill="#fff" stroke="#0066FF" stroke-width="2"/>
    <text x="0" y="48" font-size="10" fill="#8b96a8">5 W</text>
    <text x="780" y="48" font-size="10" fill="#8b96a8" text-anchor="end">30 W</text>

    <!-- GPU slider -->
    <text x="0" y="78" font-size="13" font-weight="700" fill="#fff">GPU Power Limit</text>
    <text x="780" y="78" font-size="13" font-weight="700" fill="#0066FF" text-anchor="end">Auto</text>
    <rect x="0" y="86" width="780" height="8" rx="4" fill="#0d1428"/>
    <rect x="0" y="86" width="780" height="8" rx="4" fill="#0066FF"/>
    <circle cx="780" cy="90" r="10" fill="#fff" stroke="#0066FF" stroke-width="2"/>
    <text x="0" y="112" font-size="10" fill="#8b96a8">0 %</text>
    <text x="780" y="112" font-size="10" fill="#8b96a8" text-anchor="end">100 %</text>

    <!-- Fan curve -->
    <text x="0" y="142" font-size="13" font-weight="700" fill="#fff">Fan Curve</text>
    <text x="780" y="142" font-size="13" font-weight="700" fill="#0066FF" text-anchor="end">Aggressive</text>
    <rect x="0" y="150" width="780" height="8" rx="4" fill="#0d1428"/>
    <rect x="0" y="150" width="540" height="8" rx="4" fill="#ff6b35"/>
    <circle cx="540" cy="154" r="10" fill="#fff" stroke="#ff6b35" stroke-width="2"/>
    <text x="0" y="176" font-size="10" fill="#8b96a8">Silent</text>
    <text x="780" y="176" font-size="10" fill="#8b96a8" text-anchor="end">Turbo</text>
  </g>

  <!-- Frame target + resolution -->
  <g transform="translate(0 320)">
    <text x="0" y="14" font-size="13" font-weight="700" fill="#fff">Frame Target</text>
    <rect x="120" y="-4" width="80" height="24" rx="4" fill="#1a2842" stroke="#0066FF"/>
    <text x="160" y="14" font-size="13" font-weight="700" fill="#0066FF" text-anchor="middle">60 FPS</text>

    <text x="220" y="14" font-size="13" font-weight="700" fill="#fff">Resolution</text>
    <rect x="340" y="-4" width="120" height="24" rx="4" fill="#1a2842" stroke="#0066FF"/>
    <text x="400" y="14" font-size="12" font-weight="700" fill="#0066FF" text-anchor="middle">1280 × 800 (native)</text>
  </g>

  <!-- Performance preview -->
  <g transform="translate(0 360)">
    <rect width="780" height="140" rx="8" fill="#0d1428" stroke="#0066FF" stroke-width="1.5"/>

    <text x="20" y="28" font-size="13" font-weight="700" fill="#fff">Live preview (estimated)</text>

    <!-- FPS gauge -->
    <g transform="translate(20 50)">
      <text x="0" y="0" font-size="11" fill="#8b96a8">FPS (avg)</text>
      <text x="0" y="36" font-size="32" font-weight="800" fill="#00d4aa">58</text>
      <text x="68" y="36" font-size="11" fill="#8b96a8">/ 60 target</text>
    </g>

    <g transform="translate(180 50)">
      <text x="0" y="0" font-size="11" fill="#8b96a8">CPU temp</text>
      <text x="0" y="36" font-size="32" font-weight="800" fill="#ff6b35">78°C</text>
    </g>

    <g transform="translate(360 50)">
      <text x="0" y="0" font-size="11" fill="#8b96a8">Battery drain</text>
      <text x="0" y="36" font-size="32" font-weight="800" fill="#0066FF">−24 W</text>
    </g>

    <g transform="translate(560 50)">
      <text x="0" y="0" font-size="11" fill="#8b96a8">Est. battery life</text>
      <text x="0" y="36" font-size="32" font-weight="800" fill="#9b59ff">2h 50m</text>
    </g>

    <text x="20" y="120" font-size="10" fill="#8b96a8">Preview updates after you stop moving sliders for 3 s</text>
  </g>

  <!-- Action buttons -->
  <g transform="translate(0 520)">
    <rect width="120" height="40" rx="6" fill="#0066FF"/>
    <text x="60" y="26" font-size="13" font-weight="700" fill="#fff" text-anchor="middle">Apply</text>

    <rect x="140" width="120" height="40" rx="6" fill="#1a2842" stroke="#0066FF"/>
    <text x="200" y="26" font-size="13" font-weight="700" fill="#0066FF" text-anchor="middle">Save preset</text>

    <text x="780" y="26" font-size="11" fill="#8b96a8" text-anchor="end">Last edited: 2 min ago</text>
  </g>
</g>

Tip: hold a hotkey while launching a game to bypass the auto-profile and force the Battery preset.

By default, the Ally X20 ships with these power profiles:

  • Silent: 15 W TDP, fan curve 0, capped at 40 FPS
  • Performance: 25 W TDP, fan curve auto, capped at 60 FPS
  • Turbo: 35 W TDP, fan curve max, uncapped

Most AAA games want 25–30 W on this hardware. Going to 35 W gains you ~8% performance at the cost of loud fans and a 25% battery hit.

Open Armoury Crate → Settings → Performance → Per-Game Profiles and set these as a starting point:

GameTDPFPS capResolutionFSRNotes
Cyberpunk 207728 W401080pQualityPath Tracing OFF
Elden Ring22 W601080pOffLocks at 60 natively
Forza Horizon 630 W601080pOffOne of the best-optimized PC titles
Baldur’s Gate 325 W401080pBalancedAct 3 needs the extra TDP
Helldivers 225 W601080pOffCPU-bound
Black Myth: Wukong30 W401080pQualityHeaviest title we tested
Hades II15 W601080pOffSilent mode is fine
Star Fox (Switch 2)18 W601080pOffEmulated, very light

For a deeper per-game breakdown with frame-time data, see our Per-Game TDP Tuning guide.

7. Controls: remap the back buttons and enable gyro

The Ally X20’s default control layout is fine for most games, but the back buttons (L4/R4 and L5/R5) are underused — and they are the biggest QoL win you can get.

Back-Button Layout & Recommended Bindings L4 / R4 / L5 / R5 — 4 paddles · mapped per game genre

Back of device (top-down)
<!-- Device silhouette -->
<path d="M 60 60 L 340 60 Q 360 60 360 80 L 360 280 Q 360 300 340 300 L 60 300 Q 40 300 40 280 L 40 80 Q 40 60 60 60 Z"
      fill="#1a1f2e" stroke="#0066FF" stroke-width="2"/>

<!-- Shoulder buttons (L1, R1) -->
<rect x="30" y="40" width="80" height="20" rx="4" fill="#0066FF"/>
<text x="70" y="54" font-size="11" font-weight="700" fill="#fff" text-anchor="middle">L1</text>

<rect x="290" y="40" width="80" height="20" rx="4" fill="#0066FF"/>
<text x="330" y="54" font-size="11" font-weight="700" fill="#fff" text-anchor="middle">R1</text>

<!-- Triggers (L2, R2) -->
<rect x="30" y="20" width="80" height="14" rx="4" fill="#9b59ff"/>
<text x="70" y="32" font-size="10" font-weight="700" fill="#fff" text-anchor="middle">L2</text>

<rect x="290" y="20" width="80" height="14" rx="4" fill="#9b59ff"/>
<text x="330" y="32" font-size="10" font-weight="700" fill="#fff" text-anchor="middle">R2</text>

<!-- Back paddles (L4, R4) -->
<rect x="50" y="90" width="60" height="36" rx="8" fill="#ff6b35" stroke="#fff" stroke-width="2"/>
<text x="80" y="113" font-size="16" font-weight="800" fill="#fff" text-anchor="middle">L4</text>

<rect x="290" y="90" width="60" height="36" rx="8" fill="#ff6b35" stroke="#fff" stroke-width="2"/>
<text x="320" y="113" font-size="16" font-weight="800" fill="#fff" text-anchor="middle">R4</text>

<!-- Back paddles (L5, R5) -->
<rect x="50" y="230" width="60" height="36" rx="8" fill="#00d4aa" stroke="#fff" stroke-width="2"/>
<text x="80" y="253" font-size="16" font-weight="800" fill="#0a0e1a" text-anchor="middle">L5</text>

<rect x="290" y="230" width="60" height="36" rx="8" fill="#00d4aa" stroke="#fff" stroke-width="2"/>
<text x="320" y="253" font-size="16" font-weight="800" fill="#0a0e1a" text-anchor="middle">R5</text>

<!-- Center: grip hint -->
<text x="200" y="180" font-size="13" fill="#8b96a8" text-anchor="middle">Center grip area</text>
<text x="200" y="200" font-size="11" fill="#8b96a8" text-anchor="middle">(natural palm rest)</text>

<!-- Annotation arrows -->
<g transform="translate(-30 0)">
  <text x="0" y="113" font-size="11" fill="#ff6b35" font-weight="700" text-anchor="end">Index</text>
  <text x="0" y="143" font-size="10" fill="#8b96a8" text-anchor="end">fingers</text>
</g>

<g transform="translate(390 0)">
  <text x="0" y="113" font-size="11" fill="#ff6b35" font-weight="700">Index</text>
  <text x="0" y="143" font-size="10" fill="#8b96a8">fingers</text>
</g>

<g transform="translate(-30 0)">
  <text x="0" y="253" font-size="11" fill="#00d4aa" font-weight="700" text-anchor="end">Middle</text>
  <text x="0" y="283" font-size="10" fill="#8b96a8" text-anchor="end">fingers</text>
</g>

<g transform="translate(390 0)">
  <text x="0" y="253" font-size="11" fill="#00d4aa" font-weight="700">Middle</text>
  <text x="0" y="283" font-size="10" fill="#8b96a8">fingers</text>
</g>
Recommended bindings by genre
<!-- FPS / Action -->
<g transform="translate(0 40)">
  <rect width="580" height="76" rx="8" fill="#0d1428" stroke="#ff6b35" stroke-width="1.5"/>
  <text x="16" y="22" font-size="13" font-weight="700" fill="#ff6b35">FPS / Action (Cyberpunk, Doom, Apex)</text>
  <g font-size="12" fill="#c0c8d8">
    <text x="16" y="44">L4 → Jump</text>
    <text x="160" y="44">R4 → Crouch / Slide</text>
    <text x="340" y="44">L5 → Melee</text>
    <text x="460" y="44">R5 → Reload</text>
    <text x="16" y="64" font-style="italic" fill="#8b96a8">Pinky stays free for L1/L2 aim</text>
  </g>
</g>

<!-- RPG / Adventure -->
<g transform="translate(0 128)">
  <rect width="580" height="76" rx="8" fill="#0d1428" stroke="#9b59ff" stroke-width="1.5"/>
  <text x="16" y="22" font-size="13" font-weight="700" fill="#9b59ff">RPG / Adventure (BG3, Elden Ring)</text>
  <g font-size="12" fill="#c0c8d8">
    <text x="16" y="44">L4 → Dodge / Roll</text>
    <text x="180" y="44">R4 → Use item</text>
    <text x="320" y="44">L5 → Map</text>
    <text x="420" y="44">R5 → Menu</text>
    <text x="16" y="64" font-style="italic" fill="#8b96a8">Allows trigger combat without moving thumbs off sticks</text>
  </g>
</g>

<!-- Platformer / Indie -->
<g transform="translate(0 216)">
  <rect width="580" height="76" rx="8" fill="#0d1428" stroke="#0066FF" stroke-width="1.5"/>
  <text x="16" y="22" font-size="13" font-weight="700" fill="#0066FF">Platformer / Indie (Hades, Celeste)</text>
  <g font-size="12" fill="#c0c8d8">
    <text x="16" y="44">L4 → Jump</text>
    <text x="140" y="44">R4 → Dash</text>
    <text x="260" y="44">L5 → Attack</text>
    <text x="380" y="44">R5 → Special</text>
    <text x="16" y="64" font-style="italic" fill="#8b96a8">Removes thumb fatigue on long sessions</text>
  </g>
</g>

<!-- Emulator / Co-op -->
<g transform="translate(0 304)">
  <rect width="580" height="76" rx="8" fill="#0d1428" stroke="#00d4aa" stroke-width="1.5"/>
  <text x="16" y="22" font-size="13" font-weight="700" fill="#00d4aa">Emulator / 8-player co-op (NSO, SteamWorld)</text>
  <g font-size="12" fill="#c0c8d8">
    <text x="16" y="44">L4 → Start</text>
    <text x="140" y="44">R4 → Select</text>
    <text x="280" y="44">L5 → L-stick click</text>
    <text x="440" y="44">R5 → R-stick click</text>
    <text x="16" y="64" font-style="italic" fill="#8b96a8">Lets you navigate menus without dropping the d-pad</text>
  </g>
</g>
⚠ Setup tip Armoury Crate → Command Center → per-game profile. Enable "Back-button always on" so bindings persist across reboots and Windows updates.

Recommended bindings (work for 80% of games):

  • L4: in-game menu / pause
  • R4: jump (for platformers) / reload (for shooters)
  • L5: crouch / dodge
  • R5: interact / use

Configure them in Armoury Crate → Controls → Button Mapping → Per-game profiles.

Gyro aiming — turn it on for every FPS

Gyro aiming on the Ally X20 is one of the best implementations on any handheld. Most people write it off as a gimmick because the default sensitivity is way too high.

  1. Open Armoury Crate → Controls → Gyro.
  2. Enable Gyro.
  3. Set Gyro Sensitivity to 30% to start.
  4. Set Gyro Activation to Right Stick Touch (the right stick only enables gyro when physically touched — like Steam Controller / Switch).
  5. Play a few matches of Helldivers 2 or Apex. Tune sensitivity up or down in 5% increments until you stop thinking about it.

For a deeper walkthrough including per-game config files, see ROG Ally X20: Per-Game TDP Tuning — the per-game config files there include the gyro profile YAML for every title we tested.

8. Advanced tuning (the +15% performance most guides skip)

Undervolt with Ryzen Controller

The Ryzen Z2 Extreme has ~50 mV of undervolt headroom out of the box. Undervolting does not hurt performance — it lets the chip boost longer before hitting thermal limits.

  1. Install Ryzen Controller from GitHub (the unofficial fork that still works on Z2 Extreme).
  2. Open it, navigate to Curve Optimizer.
  3. Set All-Core Curve Optimizer to -50 mV to start.
  4. Run a 30-minute stress test (Cinebench R24 multi-core loop).
  5. If no crash in 30 min, try -75 mV. If stable, try -100 mV.
  6. Back off 25 mV from the lowest stable value for daily use.

Result: 10–15% cooler thermals at the same TDP, or 10% higher sustained performance at the same temperature.

Warning: do not run Curve Optimizer negative values simultaneously with maximum TDP boost. The chip will crash. Test undervolts at 25 W first, then re-test at 30 W.

Disable VBS / HVCI for ~5% gaming performance

Windows 11’s Virtualization-Based Security adds overhead that handhelds don’t need. Disabling it gives back 3–8% in CPU-bound titles.

  1. Open Settings → Privacy & Security → Windows Security → Device Security → Core Isolation.
  2. Turn off Memory Integrity.
  3. Restart.
  4. Open an Admin Command Prompt and run: bcdedit /set hypervisorlaunchtype off
  5. Restart again.

You give up some exploit mitigation. Worth it on a dedicated gaming handheld, not worth it on a work laptop.

Set the right power plan

Windows ships with “Balanced” selected by default. For gaming, switch to High Performance:

  1. Control Panel → Power Options → High Performance (or “Ultimate Performance” if you ran powercfg -duplicatescheme).
  2. Click Change plan settings → Change advanced power settings.
  3. Set Processor power management → Minimum processor state to 100% while plugged in, 25% on battery.
  4. Set PCI Express → Link State Power Management to Off.

Display: 60 Hz vs 120 Hz

The display is 120 Hz, but the Z2 Extreme cannot sustain 90+ FPS in most AAA titles at native 1080p. Use:

  • 60 Hz for any AAA title with frame-pacing issues
  • 120 Hz for indie / retro / 2D titles and Switch emulation

You can also enable VRR (Variable Refresh Rate) in Armoury Crate → Display. With VRR on, the screen refreshes at whatever FPS the GPU is producing, eliminating screen tearing without the input lag of VSync.

9. Frequently asked questions

Q: Can the Ally X20 really do 1080p in AAA titles? A: Yes, with FSR. Native 1080p without upscaling is possible in well-optimized titles (Forza Horizon 6, Helldivers 2, Elden Ring). Heavy titles like Cyberpunk 2077 want FSR Quality at minimum.

Q: Is the battery really 80 Wh? A: Yes — the largest battery in any handheld. Expect 2–3 hours of AAA gaming, 6–8 hours of indie / streaming, 10+ hours of video playback.

Q: How loud are the fans? A: At 15 W silent mode, the fans are inaudible under a desk. At 25 W performance mode, ~30 dB (very quiet). At 35 W turbo, ~38 dB — louder than Steam Deck OLED, quieter than Legion Go 2.

Q: Should I undervolt? A: Yes. See section 8. The Z2 Extreme has stable headroom for ~50 mV negative curve offset and the thermals improve meaningfully.

Q: Does it support external GPUs? A: Yes, via the ROG XG Mobile interface (ASUS proprietary, ~2× faster than USB4 eGPU). Standard USB4 eGPUs also work via the bottom USB-C port but at ~70% of XG Mobile bandwidth.

Q: Can I play Switch 2 games on it? A: Yes. The Z2 Extreme is strong enough for Switch 2 emulation at 1080p/60 in most titles via the latest Ryujinx builds. See our Tomodachi Life Ryujinx setup as a worked example.

10. Next steps

HistoryRevision history

  1. v1.1
    • Editorial review pass — content checked against the latest stable patch.
  2. v1.0
    • Initial publication.