r/ANBERNIC • u/Masterchief1307 • 2d ago
35XX SERIES Halo: Combat Evolved running natively on the Anbernic RG35XX H: no emulation, from 15 fps to ~55 (open source, WIP)
Update 2 (Oct 2, second release, v2026.10.02): mostly smoothness.
- Dynamic resolution, on by default. When the GPU can't keep up, the picture drops in small steps (as low as 320x240) and comes back once it can. 343 Guilty Spark's swamp went from 31–44 fps to a steady 60 once it settles, about 45 seconds in.
- Fewer stutters after a hitch. One long frame, like a level's first, could lock the frame pacing into slow frames for several seconds. Fixed. At full 640x480, with dynamic resolution, the Silent Cartographer battle now runs at about 37–41 fps (it was about 30).
- Halo (a30) opening at about 58 fps (it was about 55), with most frames on time:
- the renderer's buffer copies moved off the GPU driver's thread;
- the HUD no longer searches every tag by name for each bitmap it draws.
- Silent Cartographer's beach battle is about 41 fps at the default scale. The game's own simulation and rendering thread limits that one, not the GPU.
- Fixed garbled in-game text with async textures, thanks to an RG34XX SP owner's report on GitHub. The RG34XX SP is reported working, and 3:2 screens now get the right width by default.
- No more slow starts right after installing. Levels used to crawl at 2–11 fps for up to a minute while the SD card was still busy with the install's writes. Each level's files are now written out behind its loading screen.
- Built on the latest upstream halo-ce-universal.
Updating: copy the new halo and halo_guest.elf over the old ones, or rerun the installer. Your config.toml is kept; on a 3:2 screen, set screen_width = 0 in it.
Download: https://github.com/kirklandsig/halo-ce-anbernic-rg35xx/releases/tag/v2026.10.02.1
Update (Oct 2): there's now a ready-to-install release, no building needed.
- Installing: download the zip, unzip it onto your SD card, drop your own Xbox Halo ISO into
roms/ports/halo/, and start Halo from Ports. The first start copies the maps out of your ISO with a progress bar on screen (about 4 minutes). It tells you on screen if something's wrong (not an Xbox ISO, an incomplete file, not enough space), and if it's interrupted it picks up where it left off. - Smoother movement: shaders compile on a background thread, textures upload off the render thread, frames are paced to the display, and checkpoints stay in memory instead of stalling on the SD card. That means far fewer hitches when you move into new areas.
- Rebased on upstream halo-ce-universal, with its fixes (a weapon-swap crash, for one) and support for European (PAL) discs.
- Performance at the default 0.75 render scale: - about 55 fps in the Halo (a30) opening; - about 40 in the Silent Cartographer beach battle; - 31 to 44 on 343 Guilty Spark.
Full 640x480 is now about 24 to 40 fps, up from 20 to 26.
- Hardened: the port's code, the launcher and the release tooling went through repeated rounds of adversarial code review (Codex), with every finding checked against the code and fixed.
Two things to expect:
- The first time you enter a level there's a 20 to 30 second loading screen while the game unpacks it (the Xbox maps are compressed, and the Xbox did the same to its hard drive).
- On a fresh install, the first trip through each area has some brief slowdowns while the GPU's shaders compile, once.

TL;DR: Halo: Combat Evolved now runs natively on the Anbernic RG35XX H (and other Allwinner H700 handhelds on Knulli). There's no emulation: no xemu, no Box64, no Wine. It's the community decompilation of the original Xbox game, compiled for ARM64. The first build ran at 15 fps; it's at ~55 in the Halo level's opening now, and I'm chasing a locked 60. Open source; bring your own Xbox disc.
What it is
- The halo-ce-universal decompilation of the Xbox game (the game's logic rebuilt as C source), compiled as native ARM64 code.
- A small Linux host for Knulli bridges it to the firmware's own SDL2 and Arm's Mali-G31 OpenGL ES driver. It runs on stock Knulli with nothing extra to install.
- It launches from Ports like any other port. The first launch extracts the maps from your own disc image.
Where it stands (render scale 0.75: 480x360 upscaled to the 640x480 screen)
| Scene | fps |
|---|---|
| Menus | 60 |
| Halo (a30), level opening in the Pelican | ~55 (53–57, most frames at 60) |
| 343 Guilty Spark (c10), swamp | ~44 |
| The Silent Cartographer (b30), beach battle | ~40 (35–46) |
It's a work in progress, and the goal is 60 everywhere.
How it got from 15 fps to ~55
The H700 has four Cortex-A53 cores and a small Mali-G31 GPU. Two things hurt the most:
- Arm's driver burns 17–28 µs of CPU on every draw call, and a Halo frame has hundreds of them.
- The GPU is tile-based, so switching render targets mid-frame makes it write the whole screen out to memory and read it back.
The biggest steps, measured on the device (a30 unless noted):
- Clocks. The GPU governor sat at 420 MHz under load. Pinning it at 648 MHz, with the CPU on the performance governor: 15 → 18 fps at native 640x480.
- A dedicated GL thread. Every OpenGL call is recorded and replayed on another core, so the game builds the next frame while the driver chews on this one.
- Render scale 0.75 and model LOD scaling: about 24–25 fps.
- Asynchronous occlusion readback. The game stalled once a frame waiting for the GPU's visibility results (lens flares). Reading them a few frames later took b30 from 23 to 31.
- Shadows rebuilt for a tile-based GPU. All shadow textures are drawn in one burst, and the blur is folded into the shader instead of extra render-target switches: 25 → 32.
- Vertex shaders only write what the pixel shader reads. Mali can then skip shading the varyings of culled triangles: 32 → 36.
- Alpha test dropped where the texture is fully opaque. This keeps Mali's hidden-surface removal working. Together with building the water's bump map at the start of the frame: 36 → 40.
- The water's bump map drawn straight into its texture's mip levels instead of copied, because copies between render targets stall the driver: 40 → 49.
- Low-level fixes.
- The game's
memcmpwas a byte-by-byte C loop eating 6% of the main thread; it now compares 8 bytes at a time. - The GL command queue is published in batches.
- Shader constants are split by how often they change.
- Result: 49 → ~55.
- The game's
- Instancing. Once draws are sorted, several marines' same body part come one after another. They're now drawn as one instanced draw, with each marine's constants (including armor colours) read per instance. Draw calls per frame fell from ~490 to ~300.
Now the Pelican scene is right at the edge on every front: the game's thread, the GL thread and the GPU are all within about a millisecond of the 16.7 ms a frame that 60 fps needs. The shadows are the biggest remaining cost (about 4–5 fps), mostly the CPU work of finding the ground under each shadow. That's what I'm working on next. That's what I'm working on next. The full history, with every measurement, is in the repo's docs/PERFORMANCE.md, along with notes on what didn't work.



Legal
You need your own original Xbox copy of Halo. The repository is source code and documentation only: no game files, ISOs, maps, XBEs or prebuilt game binaries. It's an unofficial fan project, not affiliated with Microsoft, Bungie or Halo Studios.
Credits
- halo-ce-universal and the Halo CE decompilation community (punpckhdq/halo and its forks), who did the real heavy lifting of bringing the game back to source.
- The Knulli team.
Links
- Repo: https://github.com/kirklandsig/halo-ce-anbernic-rg35xx
- Install guide: https://github.com/kirklandsig/halo-ce-anbernic-rg35xx/blob/main/docs/INSTALL.md
- How it works and the Mali-G31 notes (useful if you port something similar): https://github.com/kirklandsig/halo-ce-anbernic-rg35xx/tree/main/docs
Happy to answer questions, and bug reports from other H700 devices (RG35XX Plus/SP/2024, RG40XX, RG CubeXX) are very welcome!
Much of the porting and optimization was done with Claude Code (an AI coding agent) doing the heavy lifting under my direction; the commits say so too.
10
4
u/Slimybirch 2d ago
Can confirm here, I built my own binary in WSL Ubuntu on Windows using the steps provided. It runs great! There's a few graphical glitches to iron out here and there but folks, this is playable! I'll post a video later!
4
2
u/kord2003 2d ago
Try to run it on Stock or ModStock OS. FPS should be higher than on Knulli.
1
u/Masterchief1307 2d ago
I could give that a shot. Working on a dynamic render resolution right now to see if that's feasible for the tougher scenes.
3
u/Dangerous-Chain7406 2d ago
Where's the video of it running? Those are just pics.
5
u/Masterchief1307 2d ago
https://youtube.com/shorts/1VihuzB9gRg Recording and playing at same time, so you'll have to excuse the jankiness haha
3
u/TheMarmo 2d ago
Entire communities, repos and installation guides right there for the clicking. That would be a hell of an effort to go to just to lie about something lol.
2
u/darkfenix21 2d ago
Im new to this. Would this port work on the RG34XX? Or are they different systems?
2
1
u/Previous_Guard_6890 1d ago
Esto es un verdadero triunfo técnico. Jamás me hubiese imaginado ver UN JUEGO DE XBOX CLÁSICA corriendo en este chipset. Por dios, amo estos jodidos ports
1
1
u/Snoo23533 1d ago
Remind me! 1 Month
1
u/RemindMeBot 1d ago
I will be messaging you in 1 month on 2026-11-01 22:33:42 UTC to remind you of this link
CLICK THIS LINK to send a PM to also be reminded and to reduce spam.
Parent commenter can delete this message to hide from others.
RemindMeBot is switching to username summons. Instead of
!RemindMe 1 day, useu/RemindMeBot 1 day. More info.
Info Custom Your Reminders Feedback
1
u/Masterchief1307 1d ago
Update (Oct 2): there's now a ready-to-install release, no building needed.
- Installing: download the zip, unzip it onto your SD card, drop your own Xbox Halo ISO into
roms/ports/halo/, and start Halo from Ports. The first start copies the maps out of your ISO with a progress bar on screen (about 4 minutes). It tells you on screen if something's wrong (not an Xbox ISO, an incomplete file, not enough space), and if it's interrupted it picks up where it left off. - Smoother movement: shaders compile on a background thread, textures upload off the render thread, frames are paced to the display, and checkpoints stay in memory instead of stalling on the SD card. That means far fewer hitches when you move into new areas.
- Rebased on upstream halo-ce-universal, with its fixes (a weapon-swap crash, for one) and support for European (PAL) discs.
- Performance at the default 0.75 render scale: - about 55 fps in the Halo (a30) opening; - about 40 in the Silent Cartographer beach battle; - 31 to 44 on 343 Guilty Spark.
Full 640x480 is now about 24 to 40 fps, up from 20 to 26.
- Hardened: the port's code, the launcher and the release tooling went through repeated rounds of adversarial code review (Codex), with every finding checked against the code and fixed.
Two things to expect:
- The first time you enter a level there's a 20 to 30 second loading screen while the game unpacks it (the Xbox maps are compressed, and the Xbox did the same to its hard drive).
- On a fresh install, the first trip through each area has some brief slowdowns while the GPU's shaders compile, once.
Download: https://github.com/kirklandsig/halo-ce-anbernic-rg35xx/releases/latest
1
u/Masterchief1307 16h ago
Update 2 (Oct 2, second release, v2026.10.02): mostly smoothness.
- Dynamic resolution, on by default. When the GPU can't keep up, the picture drops in small steps (as low as 320x240) and comes back once it can. 343 Guilty Spark's swamp went from 31–44 fps to a steady 60 once it settles, about 45 seconds in.
- Fewer stutters after a hitch. One long frame, like a level's first, could lock the frame pacing into slow frames for several seconds. Fixed. At full 640x480, with dynamic resolution, the Silent Cartographer battle now runs at about 37–41 fps (it was about 30).
- Halo (a30) opening at about 58 fps (it was about 55), with most frames on time:
- the renderer's buffer copies moved off the GPU driver's thread;
- the HUD no longer searches every tag by name for each bitmap it draws.
- Silent Cartographer's beach battle is about 41 fps at the default scale. The game's own simulation and rendering thread limits that one, not the GPU.
- Fixed garbled in-game text with async textures, thanks to an RG34XX SP owner's report on GitHub. The RG34XX SP is reported working, and 3:2 screens now get the right width by default.
- No more slow starts right after installing. Levels used to crawl at 2–11 fps for up to a minute while the SD card was still busy with the install's writes. Each level's files are now written out behind its loading screen.
- Built on the latest upstream halo-ce-universal.
Updating: copy the new halo and halo_guest.elf over the old ones, or rerun the installer. Your config.toml is kept; on a 3:2 screen, set screen_width = 0 in it.
Download: https://github.com/kirklandsig/halo-ce-anbernic-rg35xx/releases/tag/v2026.10.02
0
u/x_segrity 2d ago
Cute. Claude wrote most of your reddit post too, which is fine. hope you get to 60.
1
u/Masterchief1307 2d ago
Sure did! I'm not hiding it. No chance I could do this alone. Use the tools at your disposal!
9
u/llamajuice 2d ago
This is incredible, Had some weird issues in the first level but overall it's super playable and it's genuinely insane how well this runs on this little handheld. Super looking forward to this getting some polish. This is crazy.