Skip to content

FH2 Recompiled 0.4.2

Pre-release
Pre-release

Choose a tag to compare

@Gabrick75 Gabrick75 released this 27 Oct 02:27
· 78 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.4.2

English

A performance release: less work for the GPU and for the native renderer's CPU thread, smoother motion below
30 fps, HDR output on HDR phones, steering arrows for touch, and fixes for the striped cockpit camera and the faceted
car paint on Adreno.
Upgrading from v0.4.1 keeps your settings.

Faster

Measured on the Galaxy S23 Ultra (Adreno 740, GPU-bound) and the Moto G9 Play (Adreno 610), A/B in the same run and
scene. Gains depend on the phone and the scene.

  • Reflections updated in steps (on by default): the car reflection cube is redrawn a third at a time, the whole
    picture every 3 frames, instead of all six faces every frame. S23: +5 % FPS and +6 % FPS per GPU GHz; no
    visible difference in the reflections.
  • Passes only where the game draws (on by default): FH2's bloom and blur passes draw one small quad each, but
    every pass loaded and stored the whole 1280x720 image. Passes now open over the area their draws use. PC: image
    area moved per frame 57 → 40 Mtexels, GPU busy 71 → 63 %.
  • Reflection cube mips in one pass per level (on by default): 52 one-draw passes per frame drop to 4. User logs
    put those passes at 8-30 ms per frame on Mali. It also fixes dark chrome and black rims on lights and trim.
  • Together with Smooth motion, these GPU changes gave +2 % FPS on the Moto and +6 % FPS per GPU GHz on the
    S23
    against v0.4.1.
  • Lighter native renderer CPU thread:
    • Resolved textures are recycled instead of destroyed and recreated (1,000 a second on the S23). S23: copies
      8.1 → 1.4 ms per frame, ring thread 87-89 % → 55-56 % busy, GPU 93 → 98 % busy, FPS 43.4 → 46.1 (**
      +6 %**).
      Moto: copies 3.0 → 1.6 ms per frame.
    • No more fence polling before reusing resources: on the Moto (Turnip) each query slept waiting for the GPU.
      Copies 346 → 76 ms of every second, GPU 89 → 99 % busy, +3 % FPS.
    • Only the renderer's own thread is pinned to a fast core (the Vulkan driver's threads had inherited its name and
      shared its core), and slow cores are found by the kernel's core capacity (the Snapdragon 662's Cortex-A53s were
      taken as fast). Moto: draw recording -21 % per draw, median FPS 16.4 → 17.1 (~+4 %).
  • Game CPU: on ARM64 the ~57,000 floating-point mode toggles in the game code no longer write the CPU's FP
    control register (ported from Pinyon Shift, where those writes were most of Forza Horizon 1's physics time on the
    same chip as the S23).

New

  • Smooth motion (on by default): every frame shown moves the game forward by exactly one step. Below 30 fps
    FH2 gave frames 0 or 2 steps, so motion juddered.
  • HDR output (Display > HDR, off by default, HDR10 screens only): the scene's brightest lights (sun,
    headlights, reflections, taillights) go above white up to the screen's peak, while menus and the HUD stay at
    the chosen white. Options: White brightness, Highlights (off/low/medium/high, native renderer) and
    Brightness peak (Auto = the reported peak but at least 1000 nits, since many phones report less than they
    show). On Android 15+ the white follows Android's brightness slider and the highlights follow the screen's
    current headroom.
  • Steering with two arrows (Others > Touch controls, or the in-game controls settings): two arrows instead of
    the left stick, as in other racing games. Holding one turns the wheel to the lock in 0.25 s, a tap is a small
    correction, and a ring shows how far the wheel is turned. Arrow steering strength from 40 to 100 %. The
    arrows can be moved, resized and hidden in the editor.

Fixed

  • Native renderer, striped internal cameras on Adreno (cockpit, hood, bumper): with MSAA, bands of block
    noise changed every frame on the S23. Clean in 12 of 12 captures, 30 fps held at 2x and 4x.
  • Native renderer, faceted car paint on Adreno: since v0.4.1 gave the reflection cube its mips, each
    triangle of the body could pick a different mip. Cube reflections now compute their level in the shader.

Notes

  • Rebuild fh2_shaders.nfsp (tools/xenos/biblioteca.sh) to get the faceted paint fix; the old library
    still works.
  • Present on its own thread (unstable) (Performance > Processor) is off by default: in our tests it gave no
    FPS gain and could make motion less smooth. Leave it off unless you are testing.
  • The new performance options can be turned off in the launcher to compare.
  • A touch layout saved before this version keeps its controls; the arrows start with the new defaults.

Português

Uma versão de desempenho: menos trabalho para a GPU e para a thread de CPU do renderizador nativo, movimento mais
suave abaixo de 30 fps, saída HDR nos celulares com HDR, setas de direção no toque e correções das listras na câmera
interna e da pintura facetada nas Adreno.
Ao atualizar da v0.4.1 suas configurações são mantidas.

Mais rápido

Medido no Galaxy S23 Ultra (Adreno 740, limitado pela GPU) e no Moto G9 Play (Adreno 610), com A/B na mesma partida
e no mesmo lugar. O ganho varia com o celular e a cena.

  • Reflexos atualizados em etapas (ligado por padrão): o cubo de reflexo do carro é redesenhado um terço por vez,
    a imagem inteira a cada 3 quadros, em vez das seis faces todo quadro. S23: +5 % de FPS e +6 % de FPS por GHz
    da GPU
    ; nenhuma diferença visível nos reflexos.
  • Passadas só onde o jogo desenha (ligado por padrão): as passadas de bloom e desfoque do FH2 desenham um
    quadradinho cada, mas cada uma carregava e gravava a imagem inteira de 1280x720. Agora abrem só na área que os
    desenhos usam. PC: área movida por quadro 57 → 40 Mtexels, GPU ocupada 71 → 63 %.
  • Mips do cubo de reflexo numa passada por nível (ligado por padrão): 52 passadas de um desenho por quadro viram
    4. Nos logs dos usuários essas passadas custavam 8-30 ms por quadro nas Mali. Também corrige cromados escuros e
    bordas pretas nas luzes e frisos.
  • Junto com o Movimento suave, essas mudanças de GPU deram +2 % de FPS no Moto e +6 % de FPS por GHz da GPU
    no S23
    em relação à v0.4.1.
  • Thread de CPU do renderizador nativo mais leve:
    • Texturas resolvidas são recicladas em vez de destruídas e recriadas (1.000 por segundo no S23). S23: cópias
      8,1 → 1,4 ms por quadro, thread do anel 87-89 % → 55-56 % ocupada, GPU 93 → 98 % ocupada, FPS 43,4 → 46,1
      (**
      +6 %**). Moto: cópias 3,0 → 1,6 ms por quadro.
    • Acabou a consulta de fences antes de reutilizar recursos: no Moto (Turnip) cada consulta dormia esperando a GPU.
      Cópias 346 → 76 ms de cada segundo, GPU 89 → 99 % ocupada, +3 % de FPS.
    • Só a thread do próprio renderizador é fixada num núcleo rápido (as threads do driver Vulkan herdavam o nome dela
      e dividiam o mesmo núcleo), e os núcleos lentos são detectados pela capacidade informada pelo kernel (os
      Cortex-A53 do Snapdragon 662 eram tratados como rápidos). Moto: gravação dos desenhos -21 % por desenho, FPS
      mediano 16,4 → 17,1 (~+4 %).
  • CPU do jogo: no ARM64, as ~57.000 trocas de modo de ponto flutuante no código do jogo não escrevem mais no
    registrador de controle de FP da CPU (trazido do Pinyon Shift, onde essas escritas eram a maior parte do tempo da
    física do Forza Horizon 1 no mesmo chip do S23).

Novidades

  • Movimento suave (ligado por padrão): cada quadro mostrado avança o jogo exatamente um passo. Abaixo de 30 fps o
    FH2 dava 0 ou 2 passos por quadro, e o movimento tremia.
  • Saída HDR (Tela > HDR, desligada por padrão, só em telas HDR10): as luzes mais fortes da cena (sol, faróis,
    reflexos, lanternas) passam do branco até o pico da tela, enquanto menus e HUD ficam no branco escolhido. Opções:
    Brilho do branco, Realces (desligado/baixo/médio/alto, renderizador nativo) e Pico de brilho (Auto = o
    pico informado, mas no mínimo 1000 nits, pois muitos celulares informam menos do que mostram). No Android 15+ o
    branco segue o brilho do Android e os realces seguem a margem de HDR atual da tela.
  • Direção com duas setas (Outros > Controles de toque, ou nas configurações de controle do jogo): duas setas no
    lugar do analógico esquerdo, como em outros jogos de corrida. Segurar uma vira o volante até o limite em 0,25 s,
    um toque é uma correção pequena e um anel mostra quanto o volante está virado. Força da direção nas setas de 40
    a 100 %. As setas podem ser movidas, redimensionadas e escondidas no editor.

Correções

  • Nativo, listras nas câmeras internas nas Adreno (cockpit, capô, para-choque): com MSAA, faixas de ruído em
    blocos mudavam a cada quadro no S23. Limpo em 12 de 12 capturas, 30 fps mantidos em 2x e 4x.
  • Nativo, pintura facetada nas Adreno: desde que a v0.4.1 deu mips ao cubo de reflexo, cada triângulo da
    carroceria podia escolher um mip diferente. Os reflexos do cubo agora calculam o nível no shader.

Observações

  • Gere de novo o fh2_shaders.nfsp (tools/xenos/biblioteca.sh) para receber a correção da pintura facetada; a
    biblioteca antiga continua funcionando.
  • Apresentar numa thread própria (instável) (Desempenho > Processador) fica desligado por padrão: nos nossos
    testes não ganhou FPS e pode deixar o movimento menos suave. Deixe desligado, a não ser para testar.
  • As novas opções de desempenho podem ser desligadas no launcher para comparar.
  • Um layout de toque salvo antes desta versão mantém seus controles; as setas começam com os padrões novos.

What's Changed

  • Native renderer: clear persistent MSAA images outside the pass before… by @Gabrick75 in #52
  • Worktree feature hdr output by @Gabrick75 in #58
  • Native renderer: cube reflection level computed in the shader (faceted car paint on Adreno) by @Gabrick75 in #60
  • Skip the host FP control writes of VMX flush toggles on ARM64 by @Gabrick75 in #61
  • Draw the reflection cube's mips one pass per level by default by @Gabrick75 in #62
  • Perf/tight render area by @Gabrick75 in #63
  • Worktree feature step backpressure by @Gabrick75 in #64
  • Worktree feature reflection faces per frame by @Gabrick75 in #69
  • Pin only the native ring thread and find slow cores by capacity by @Gabrick75 in #70
  • Stop polling slot fences in the driver before reusing resources by @Gabrick75 in #71
  • Recycle replaced resolved textures instead of recreating them by @Gabrick75 in #72
  • Worktree feature hdr output by @Gabrick75 in #73
  • Feature/touch steering arrows by @Gabrick75 in #74
  • Fix/mali present auto queue by @Gabrick75 in #75

Full Changelog: v0.4.1...v0.4.2