Skip to content

FH2 Recompiled 0.3.0

Pre-release
Pre-release

Choose a tag to compare

@Gabrick75 Gabrick75 released this 15 Oct 00:24
· 115 commits to main since this release

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.3.0

English

Much faster on both phones, same image.

  • No read-backs of small resolves (on by default): the CPU used to read back 18–27 tiny 64×64 textures per frame for auto exposure, forcing the game, the ring and the GPU to take turns. 38 → 55 fps on the S23 Ultra.
  • Vertex cache across frames (on by default): reuses the vertices the game hasn't changed instead of copying them again. Parked scene: 27 → 36.5 fps (+35 %); vegetation-heavy landscape: ~30 → ~40 fps; vertex uploads 12.5 → 1.0 GB per 10 s; 192 MB cache on phones with 8 GB+ of RAM.
  • Exact-size small render targets (optional, off by default): the reflection cube's faces and reduction chain are created at their exact height instead of 720 rows. S23 Ultra parked: menores −0.9 ms, copias −0.4 ms per Swap. Moto G9 Play: steadier frame pacing (see below).
  • Experimental Fastest core for the game toggle (off by default): gives the fastest core to the game's busiest thread instead of the ring. Measured −30 % in S23 Ultra testing (the ring still limits) — stays off.
  • Performance hints (ADPF) always on; XMA audio decoding fixed on Android; pipeline cache saved after slow compiles; fewer clock reads on the ring; no GPU-timestamp overhead by default; render scale down to 12 %; watched fetch table restarts when full (fixes the 4 fps dip at the festival); usage log with clocks, battery and thermal headroom.

Head-to-head, S23 Ultra (same parked scene, render scale 100 %, cold, Anisotropic filtering 16x, FXAA):

v0.2.0 v0.3.0
Parked fps ~21–26 ~48–61 (avg ~53, ~2.3×)
Game thread 91–98 % all the time 81–96 %, alternating with the ring
borrados (clears — deferred clears via loadOp = CLEAR replaced full-image clears outside passes) 8–10 ms GPU 0.02 ms
hueco entre trabajos (idle gap between GPU submissions — it collapsed because the ring no longer stalls on read-backs and fences) 8–9 ms ~0.5–1 ms
copias (resolve copies, render target → texture) ~3.0–3.2 ms ~1.8–2.9 ms

Head-to-head, Moto G9 Play (race, 30 fps cap, render scale 78 %, native):

v0.2.0 v0.3.0
Steady fps ~8–9 ~10 (~15 % faster frame, never drops to 8)
Game thread 66–78 % 60–99 %
GPU busy 72–87 % 80–93 %
borrados 16–37 ms n/a (measuring off)
copias 2.6–12 ms n/a (measuring off)

Caveats: vblank quantization at the 30 fps cap on the Moto, routes may differ slightly.

Full Changelog: v0.2.0...v0.3.0