Repository navigation
FH2 Recompiled 0.4.0
Pre-releaseImportant
Unofficial, non-commercial fan project, not affiliated with or endorsed by Microsoft, Xbox Game Studios or
Playground Games. This APK contains no game data. It does nothing without the files extracted from your
own legally obtained copy of Forza Horizon 2 for Xbox 360. Do not ask for game files.
Release v0.4.0
English
A stability and usability release: fewer crashes, freezes and broken screens, a new launcher, more options.
Frame rate is about the same as v0.3.0 — the renderer does its work more cheaply, but both test phones are still
limited by the same thing (see the tables).
Fixed (game)
- Paint shop crash fixed (the game's own
setjmp/longjmpnow reach the recompiled code). - Garage stuck under the loading screen fixed (
XamXStudioRequestnow fails the way the console does). - "Free" FPS limit could leave the 3D world black (black race on the Moto G9 Play): Free is now the same as 120 fps.
- My Cars photos, the dealer's car lights and several reflection/HUD images that came out wrong or empty: large
one-off copies are read back to the game, sized by their destination, 16-bit targets clamped, scratch areas never
read back with a different shape;16_16render targets accepted; visibility-query proxy draws no longer drawn. - Sound stuttering or robotic on several phones: background audio decoding is now a toggle, off by default;
audio keeps flowing when threads are pinned to cores; larger Android audio buffer. - Achievement pop-ups now show Japanese, Korean, Chinese, Cyrillic and Polish text; achievement icons no longer
appear in the phone's gallery. - System bars (black bar at the top, gesture pill) hidden on phones that ignored the old method (HyperOS and others).
- "Could not find that ISO's path" (#1): ISOs picked through Downloads, media categories or other file managers work.
New
- New launcher: home screen with the game's own Press Start video, your player name (shown in game), a big Play
button and a new look. Spanish added (English, Portuguese, Spanish). - Native renderer is now the default and marked recommended. Phones whose GPU cannot run the emulated renderer
(several Mali GPUs) are warned before playing instead of failing to start. - Image options: MSAA 2x/4x on the native renderer, screen scaling Off / Bilinear / FSR 1.0 / CAS,
FSR 1.0 presets (Mega quality 100 % … Ultra performance 33 %), extra sharpness slider. - Phone vibration: the phone vibrates with the game's rumble (phone, gamepad or both).
- Renderer work per draw is cheaper: index cache and fetch cache across frames, identical constant blocks reused,
vertex work no longer waits between passes, small render targets at exact size, reflection mips in one pass
(optional). Ring cost per draw: −18 % on the S23 Ultra, −10 % on the Moto G9 Play (same scene). - Diagnostics report: describe the problem before saving; the zip carries the last two sessions' logs, the exact
build, a last-session summary (exit reason, min/avg/max fps, driver), device and storage state. Rooted phones: an
extra report with crash files, kernel log and full logcat, and an optional one-shot performance profile. - GPU usage on MediaTek phones in the overlay; logs keep repeated messages to 20 unless Verbose log is on.
Settings (launcher)
- Restore defaults at the foot of Graphics and Performance (asks first; the imported GPU driver stays).
- New defaults: native renderer, 100 % render resolution, anti-aliasing off, anisotropic filtering off, bilinear
scaling, 30 fps limit; Performance: pin threads, vertex and index caches, vertices without waiting, small targets at
exact size and ADPF on; fastest core and reflection mips in one pass off. - The game's language follows the phone's until you pick one.
- File access is asked only when you pick the ISO, the game folder or a save — not when the app opens.
- Performance shows only the options of the chosen renderer; options the game does not apply yet are hidden;
descriptions rewritten in plain words. - Upgrading: settings you changed before are kept. Options you never touched take the new defaults — the renderer
switches to native if you never picked one. Use Restore defaults to start clean.
Head-to-head (same parked scene, same camera change, uncapped)
S23 Ultra — render 100 %, anti-aliasing off, anisotropic off, shadows 100 %, Qualcomm 840 driver, GPU measuring on.
GPU clock 680–719 MHz in both runs (no thermal cap; the v0.3.0 run was cooler).
| v0.3.0 | v0.4.0 | |
|---|---|---|
| fps before the camera change | 48.4 | 49.8 (+3 %) |
| fps after the camera change | ~62 (51–71) | ~69 (60–75) |
| Draws per frame | ~1,700 | ~1,700 |
| Ring cost per draw | 5.4 µs | 4.4 µs (−18 %) |
| Ring busy | 100 % | 100 % |
| GPU time per frame | 17.4–18.5 ms | 17.5–18.5 ms |
| Resolve copies per frame | 93 × 74 µs (~7 ms) | 93 × 74 µs (~7 ms) |
| RAM used | 1.4 GB | 1.4 GB |
Moto G9 Play — Turnip (Mr. Purple T30), shadows off, charging, same thermal state.
| v0.3.0, 12 % | v0.4.0, 12 % | v0.4.0, 33 % + FSR | |
|---|---|---|---|
| fps | 13.8 | 14.1 (+2 %) | 14.2 |
| Ring cost per draw | 17.6 µs | 15.8 µs (−10 %) | 16.0 µs |
| Ring busy | 97–100 % | 94–96 % | 97–99 % |
| GPU busy | ~71 % | ~75 % | ~90 % |
| Resolve copies per frame | 89 × ~340 µs (~30 ms) | 89 × ~350 µs (~31 ms) | 89 × ~350 µs (~31 ms) |
| RAM used | 1.0 GB | 1.0–1.1 GB | 0.9–1.0 GB |
What the tables say: the frame rate barely moved because the ring (the thread that turns the game's GPU commands
into Vulkan) is busy 94–100 % of the time on both phones, and resolve copies take ~35 % of it on the S23 and ~45 %
on the Moto — those are the next target. On the Moto, resolution costs almost nothing: 33 % + FSR gives the same fps
as 12 % with a much better image.
Caveats: one run per version and phone;
What's Changed
- Perf: reduce touch-controls overhead on Android by @Gabrick75 in #5
- Fix/pc codegen automatico by @Gabrick75 in #7
- Feature/gamepad vibration by @Gabrick75 in #8
- Worktree diag shaders by @Gabrick75 in #9
- ISO picker: find the path of files picked through Downloads, media an… by @Gabrick75 in #11
- Launcher: warn when the GPU cannot run the emulated renderer by @Gabrick75 in #12
- Root profile: ask for root when the option is turned on; no "null" in… by @Gabrick75 in #13
- Worktree ring uploads by @Gabrick75 in #14
- Perf/pass stalls by @Gabrick75 in #15
- Launcher icon: adaptive icon so the gauge fills the whole mask by @Gabrick75 in #16
- Fix/achievement toast cyrillic by @Gabrick75 in #17
- Worktree audio stutter by @Gabrick75 in #19
- Fix/native visual bugs by @Gabrick75 in #20
- Fix/paint shop setjmp by @Gabrick75 in #21
- Keep achievement icons out of the phone gallery by @Gabrick75 in #22
- Worktree home screen nickname by @Gabrick75 in #23
- Reorder launcher sidebar pages and use a hamburger icon for Others by @Gabrick75 in #24
- Show GPU use from Vulkan timestamps where kernel load files are unrea… by @Gabrick75 in #25
- Tag phone vibration with a usage and log refusals by @Gabrick75 in #26
- Launcher: bring the ADPF toggle back to Performance, on by default by @Gabrick75 in #27
- Redesign by @Gabrick75 in #28
- Settings change by @Gabrick75 in #29
New Contributors
- @Gabrick75 made their first contribution in #5
Full Changelog: v0.3.0...v0.4.0