Skip to content

FH2 Recompiled 0.4.0

Pre-release
Pre-release

Choose a tag to compare

@Gabrick75 Gabrick75 released this 20 Oct 02:10
· 19 commits to main since this release
9be300c

Important

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/longjmp now reach the recompiled code).
  • Garage stuck under the loading screen fixed (XamXStudioRequest now 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_16 render 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

New Contributors

Full Changelog: v0.3.0...v0.4.0