github danielalves96/gow-pc-port launcher-v0.4.0
v0.4.0

43 minutes ago

God of War Launcher v0.4.0

Made for weak PCs. The game now holds a steady 60 FPS on a dual core without SMT (46.8 FPS with hundreds of hitches
in 0.3.3), uses much less CPU on every PC, and installs without opening the game. Details in
Performance on weak PCs.

The game's own menus now have the port's settings. Pause the game or open the title menu and a new Port Options
entry gives you the cheats, the performance overlay, the image adjustments, the image quality and the frame rate, drawn
by the game's original menu engine, with the same plates and fonts. Everything you change there is kept: the next
session starts with it, and the launcher shows it too.

Your saves are safer, and easier to reach. The game keeps a dated copy of the memory card at every altar save, the
launcher's new Saves tab shows each save with its altar, thumbnail, difficulty and play time, and Load takes you
to that save, even with the game open. Details in Saves.

The launcher opens in under half a second, and can be skipped. It used to take 15 to 30 s to show its window on a PC
with a long play history. A new setting starts the game directly, for Steam. Details in
Launcher, Steam and the installer.

Smooth on fast monitors, and the overlay tells the truth. On a 144 Hz monitor the game made 60 frames but only 46 to
54 new pictures reached the screen, so it stuttered while the overlay said 60. The window now follows the game's own
frames, and the overlay has a GS line under FPS with the pictures that really reach the screen. Details in
Smooth pacing on fast monitors.

Updating from 0.3.3 or 0.4.0-rc? The game's runtime and its generated code change, so the launcher shows a note to rebuild the
game. It runs in the background and your saves are kept. Details in Updating.

English

Performance on weak PCs

Measured on a Core i5-12400F with the game pinned to fewer cores, 60 FPS limit, the launcher's environment, the ship's
combat, alternating runs of 150 s against 0.3.3 built the same way:

CPU the game gets 0.3.3 0.4.0
Dual core, no SMT 46.8 FPS, 113-139 hitches per run 60.0 FPS, worst 5 s window 59.7, 0 frames over 50 ms
Dual core with SMT (i3 / Pentium class) 60 FPS 60 FPS with VU1 -17 % and GS -55 % CPU time
One core with SMT 38.9 FPS ~54 FPS
Dual core ~1.5x slower (simulated) 41.2 FPS 54-55 FPS, no hitches
Dual core ~2x slower (simulated) 33.3 FPS 51-52 FPS, no hitches

What changed:

  • Speed profile built in. The game is compiled with a clang speed profile (PGO) that ships with the launcher, so every
    install gets it without running the game. Optimize now in Performance still trains one on your own play; on top of
    the shipped one it adds a few percent.
  • The install never opens the game. The native IOP modules (audio, disc, memory card) are now compiled from the IRX
    files of your disc instead of a dump taken while the game ran.
  • VU1 (the usual bottleneck): leaner native blocks, loops that stay native, faster VIF unpack and block lookup. Every
    change was checked to give the same results, cycle for cycle, on a recorded combat.
  • EE (the game code): leaner generated code (one compare per memory access, fewer pc stores, inline dispatch), about
    18 % less EE time; the executable shrinks from 100 to 81 MB.
  • GS: fewer driver calls (uniform cache), a lock between the game and the GS thread that sleeps instead of polling,
    and the GS frontend runs on its own thread only with 4 or more logical processors.
  • Fewer busy threads on small CPUs. With fewer than 4 logical processors the helper threads sleep instead of
    spinning and the render thread no longer runs at raised priority, so they do not steal time from the game.
  • Frame rate cap of 120 FPS. The 240 FPS option is gone: it drove the GPU at 100 % until some drivers crashed and
    showed nothing a player sees. A saved 240 becomes 120. At the 60 limit the window follows the game's own frames; at 120 it follows the display up to
    120 Hz.
  • Timers and waits on Windows are more precise and cheaper (EE scheduler waits, GS state lock).

Smooth pacing on fast monitors

  • What went wrong. At the 60 FPS limit the launcher ran the window at the monitor's rate (120 on a 144 Hz monitor).
    That kept the game off its smoothest pacing, where the window waits for the game's own frame: two clocks drifted apart
    and pictures were repeated and skipped. A 144 Hz session showed 46 to 54 new pictures per second with the game at 60.
  • What changed. At the 60 limit the window is now 60 and follows the game's frames on any monitor. In a session on
    the same PC the screen never dropped below 55 new pictures in play. The 120 limit is unchanged.
  • VSync made it worse on fast monitors: the window's own 120 FPS timer fought the 144 Hz refresh (85 to 100 refreshes
    per second). VSync is now used only on a monitor of 120 Hz or less, where the timer follows the monitor. Above that it
    is ignored and the window follows the game's frames, since VSync would push the window past the 120 FPS cap; the log
    says so ([gow-frame] VSync not used).
  • The overlay's GS line. With the FPS counter on, a GS line under FPS shows the new pictures that reach the
    screen each second. FPS is the game's own rate; GS below FPS means the picture is repeating, which is what you feel as
    stutter. For 60 frames on a 144 Hz monitor that does not vary its refresh, a 120 Hz mode or FreeSync/G-Sync is still
    the smoothest: 60 does not divide 144.

Saves

  • A dated copy of the card at every altar save. The game watches its own save code and, when a save completes, copies
    Mcd001.ps2 to save-backups/<date-time>/ next to the card and shows a notice on screen. The newest 30 automatic
    copies are kept; manual copies and anything you put there are never removed. GOW_SAVE_BACKUP=0 turns it off.
  • A Saves tab in the launcher. It lists the saves of the card as the game's own list shows them: the altar's
    thumbnail and name, the difficulty, the play time and the slot. Names and thumbnails come from your installed disc;
    with a CHD, or before the game is installed, the zone code is shown instead. Below the list is the history: Back up
    now
    adds a copy, Show saves opens what a copy holds, Restore puts it in place of the card (with the game
    closed) and keeps the card it replaces as Before a restore.
  • Load a save without the game's menus. Load in the Saves tab asks first, then the game goes back to its main
    menu, picks Load and that slot by itself, from gameplay, the pause menu or the title screen. With the game closed, it
    starts the game on that save. The same list is in game: F2, then Tab (or LB/RB) for the Saves page, and
    press the load button twice. An empty slot is refused without leaving the game. GOW_SAVE_LOAD=0 turns it off;
    GOW_LOAD_SLOT=<0-3> starts the game on a slot.

Graphics for weak GPUs

  • Resolution below 1x. The launcher's Resolution offers 0.25x, 0.5x and 0.75x for integrated graphics. 0.75x is clean;
    0.5x and 0.25x still show a tinted rectangle in bright scenes (see Known issues).
  • Effect switches in the Performance tab: character shadows, additive effects (fire, glows, particles) and texture
    filtering can each be turned off to save GPU time. All three are on by default.
  • The screen stays on while you play (Windows). A controller does not count as activity for Windows, so a long session
    could turn the display off. The game now asks Windows to keep it on while its window is on screen and lets go when it is
    minimized. GOW_KEEP_AWAKE=0 turns it off.

Launcher, Steam and the installer

  • The launcher opens in 0.4 s (it took 14.5 to 30.6 s with 414,000 captured VU1 microprograms). The optimizer counted
    them before the window existed, asking Windows about each file; the count now runs on another thread from the
    directory listing alone and is reused while the folder does not change. Commands that read files or start processes no
    longer run on the main thread, and logs/launcher-startup.log times each start.
  • Start the game directly (#40). In Other, or with
    --play, the launcher opens the game without creating its window (no WebView2) and ends with it, so Steam can run it as
    a non-Steam game. Hold Shift or use --launcher to get the window; a game that is not installed, cannot start or fails
    opens the window with the reason. Other, Steam, Copy path gives the path to add.
  • Installer downloads that do not give up (#39). Every
    download tries Invoke-WebRequest, .NET's HttpClient, Windows' curl.exe and BITS in turn, checks the SHA-256 (MinGit
    is pinned now too) and, if all of them fail, names the file to save by hand in toolchain/.

Movies

  • End of a movie. The stream read now reports the end of the file, the completion test waits for the decoder's last
    pictures, and the loop that drains the audio gets the host-time catch-up. This targets the freeze at the end of some
    movies (P04MP05 in a report against another build). GOW_MOVIE_EOF=0 turns the first two off.

Freeze fixes

  • Permanent freezes from #20 and #37 (#20,
    #37). In both reports the game called an address that is not a
    function, and the picture froze for good. After the movie before Pandora's Temple the player update ran before Kratos
    existed: it is now skipped until he does. Between the docks and the first Medusa a corrupt list header reached a
    destructor: such a list is now emptied. As a safety net, a call to a missing function is skipped and logged
    ([gow-badcall]) instead of freezing the game; GOW_BAD_CALL_SKIP=0 restores the old behaviour.
  • A crash inside the C runtime is traceable. The [gow-crash] report adds a line with the stack addresses that point
    into the game executable, so a fault in memcpy no longer names only ucrtbase.dll.

Port Options in the pause menu and the title menu

  • Where. In the pause menu, a Port Options row sits below Options. In the title menu (after Press Start) it is
    the fifth item, after Treasures. X opens a list; Triangle goes back one level, like the original menus.
  • Cheats. One ON/OFF row per cheat of the F2 menu (God Mode, One Hit Kill, Infinite Magic, Infinite Rage, Max Orbs, All
    Upgrades, All Powers, Max Meters, Unlock Extras).
  • In Game Overlay. FPS counter, GPU stats, CPU stats and RAM usage, ON/OFF, live.
  • Image Adjustments. Brightness, contrast, gamma and saturation as sliders (2 % per press, holding the direction
    repeats), and Reset to Default. The picture follows as you move.
  • Image Quality. Resolution (1x to 8x the native size), Upscaling (Bicubic, Bilinear or Pixel), Sharpness
    (a slider, for the bicubic filter) and FXAA. They apply on the spot: the render targets are rebuilt at the new
    resolution with the current picture copied into them. 8x is heavy for the graphics card.
  • Frame Rate. FPS Limit (60 or 120), VSync and Early FINISH, live. 120 is experimental, as in the
    launcher.
  • What is not in the menu. The graphics preset and the progressive scan (480p) switch stay in the launcher. Changing
    the video mode while playing makes the game reset the GS and the models lose their textures, so progressive scan only
    applies when the game starts.
  • Off under RetroAchievements Hardcore, where the menu is the original one. The launcher's own switches still work.

Settings that follow you

  • Whatever you change in game (cheats from F2 or Port Options, the overlay lines, the four image adjustments, the image
    quality and the frame rate) is written to a small file in the launcher's data folder a moment after each change.
  • The launcher reads it when the game ends, or the next time you press Play if it was closed meanwhile, and updates its
    own settings: the Cheats and Performance tabs show what you left, and the next session starts with it.
  • Progressive scan, the preset and every other launcher setting are not touched. Under Hardcore the cheat list is never
    taken.

Menu behaviour

  • Triangle goes back one level instead of leaving the menu. The cause was the agile combat input buffer, which
    re-sent a Square or Triangle press that the pause menu had not accepted, so the menu received it again (page, list,
    pause, game). The buffer now only runs during gameplay.
  • Holding Left or Right repeats on the sliders and value rows of the menus (0.4 s delay, then a step every 0.12 s), on
    the d-pad, the keyboard and the left stick. GOW_MENU_REPEAT=0 turns it off.

Other fixes from player reports

  • Blocky picture after saving until a restart (#34). Right
    after the save, a VU1 command stream reached an invalid command in every frame and the port stopped reading it there. A
    stream that stops while texture uploads are held back (PATH3 masked) never releases them, so the game kept drawing with
    stale textures. They are now released when that happens. The cause of the misaligned stream is still being looked for:
    the first faults now write the commands before them to last.log ([vif1] history, [vif1] word), so a report after
    a save is enough to find it.
  • A crash now leaves a trace (#35, the character stuck
    after the sixth Gorgon Eye). The log is now emptied on every exit, and a crash adds a [gow-crash] line (what failed
    and where) after the last game branches. The freeze itself is not fixed yet; a new report from that spot will say what
    happens.
  • The memory card in Files. The launcher's Files page pointed at an empty mc0 folder, so players thought their saves
    were gone. It now shows Mcd001.ps2, the card image that holds the saves, as the file to back up.
  • Self-update downloads try again. A download cut halfway ("error decoding response body", a 504 from GitHub) failed
    at once; now it tries up to three times, 3 s and 10 s apart. A bad signature or package still fails right away.

For contributors

  • Speed profile: RustPortPS2/native/pgo/runtime.profdata (runtime only, so it stays valid when the generated code
    changes), used with PS2X_PGO=auto. IOP: ps2-tools iop-manifest rebuilds the module dump from the disc's IRX files.
  • Measuring: scripts/ab-perf.ps1 now runs a discarded warm-up run first (-WarmupRunSeconds; the first run of a series
    was always the fastest) and pins exact processors (-AffinityMask 0x5 is a dual core without SMT on a CPU with SMT).
    GOW_FRAMES_HITCH_LOG=1 says what each slow frame spent. The VU1 replay bench also checks the cycle count. Method and
    every number: docs/dev/TOASTER_PLAN.md and docs/dev/PERFORMANCE.md.
  • Project rule: nothing runs the game or its window above 120 FPS, tests included (AGENTS.md).
  • Recompiler: the "gow" codegen mode adds one-compare memory access, lean pc stores, __restrict context, inline
    dispatch, and the VU0 VCALLMSR/VCLIPw fixes; the compat output stays byte-identical to PS2Recomp.
  • Saves: src/game/gow_save.cpp wraps the whole-file writer 0x22E800 (return address 0x2306C0, slot 0, 68 bytes) to
    notice a completed save; gow_save_backup.cpp makes the copies; gow_save_load.cpp walks the game's own menus to a
    slot on the EE thread, with a deadline at every step. The launcher side is saves.rs (card, history, restore, load
    request) and save_art.rs (names and thumbnails from the disc); the card layout and the request file are in
    docs/dev/MEMORY-CARD.md. The save, effect and movie switches (GOW_SAVE_*, GOW_FX_*, GOW_MOVIE_EOF) are in
    docs/dev/ENVIRONMENT.md.
  • Research credit: the notes of gow-native-pc pointed at where a movie ends,
    which call completes a save and how to tell shadows and additive effects apart. No code was copied; the
    implementations are this project's (docs/THIRD_PARTY.md).
  • The pages of Port Options are a patched copy of the game's menu movies (FLP_HUD for the pause menu, FLP_Shell for the
    title menu), made from your own game by the scripts in RustPortPS2/native/tools/menu/. The repository holds only a
    delta that is applied after checking the movie's size and CRC32. GOW_NATIVE_CHEATS_MENU=1 turns it on (the launcher
    always passes it); GOW_MENU_DIAG=1 logs the menu with the [gow-menu] tag.
  • The frame rate and the render scale are now read live: the logic rate, the present interval, VSync, Early FINISH, the
    upscaling filter, sharpness, FXAA and the internal resolution are atomics instead of values read at start.
  • A trap found on the way: the game's heap writes block pointers into a fixed range of the buffer the pause movie is
    parsed in, so a rebuilt movie works or crashes depending on its exact size. The generator now makes that range dead
    padding. Details in docs/dev/NATIVE_MENU_RESEARCH.md.

Updating

An installed 0.3.x or 0.4.0-rc updates itself (at once with Automatic updates on, or from the notice in the title
bar); you can also install the setup over it, or unzip the portable ZIP over it. Then a note at the top of Performance says the game has fixes: press Rebuild now. It takes from a few
minutes to about 20 minutes and runs in the background; you keep playing the current build until it ends, and the new
one opens the next time you start the game. Your saves (game/Mcd001.ps2) are not touched.

You are on What to do
0.4.0-rc, 0.3.0 to 0.3.3 Let the launcher update itself (or install this setup over it), then press Rebuild now.
0.2.5 to 0.2.9 Install this setup over it, then press Delete and rebuild.
0.2.4 or older Install the setup or unzip the portable ZIP over the old one, then press Delete and rebuild (your saves stay).
A new install Install and play. Visual Studio is not needed, and the game does not open during the install.

Downloads: Windows installer or portable ZIP; Linux .deb or AppImage (experimental). Files ending in .sig and
latest.json are for the self-update; you do not need them.

No game files are included. You need your own original USA God of War disc image (SCUS-97399), a CHD of it, or a
translation of it.

Known issues

  • Not yet measured on real low-end hardware. The numbers above come from a desktop CPU pinned to fewer cores. A dual
    core much slower than that one may stay at 51-55 FPS. Reports with your CPU, GPU and the in-game overlay are very
    welcome.
  • Tested on Windows with scripted button presses. The menus were driven by a scripted pad, not by hand with a
    physical controller, and the slider sound is not checked. Linux is untested for this menu.
  • Resolution 0.5x and 0.25x show a tinted rectangle in bloom-heavy scenes. 0.75x is clean.
  • The saves work was checked on private copies of a PCSX2 card (Windows): backups equal to the card, load at start,
    during gameplay and from the pause menu, the refusal of an empty slot. Not checked: the F2 Saves page with a real
    keyboard or gamepad, a load request during a movie, a level load or the save screen, a CHD install (the zone code is
    shown), Linux.
  • The end-of-movie fix was never triggered here: the P04MP05 freeze was not reproduced, so it is not proven fixed.
    The audio catch-up at the end of a movie was not checked by ear.
  • Start the game directly was checked without Steam: the Steam overlay and Steam Input, and holding Shift at start,
    are not. The effect switches were checked in game only for the altar glow.
  • Only the retail USA game. The menu patch is made for its menu movies; with another game or version the original
    menu is kept.
  • Chaining six zone warps in one session (a debug tool) stopped once at PAND04G; the same warps split in two
    sessions pass. It was not checked whether this happens without the menu patch.
  • The game can hang right after saving, as in 0.3.3. Linux remains experimental. 120 FPS is experimental. Some
    players hear crackling audio. 32:9 and 21:9 are experimental.
  • The fixes for #20, #34 and #37 were not reproduced in game: those faults only appeared in players' sessions. Why
    Kratos was missing (#37) and what corrupted the list (#20) are not known; the logs now say more when it happens.
  • The character can get stuck after the sixth Gorgon Eye (#35). Not fixed; please attach the report if it happens.
  • The new window pacing was checked on one PC (Radeon RX 6600, 144 Hz monitor, Windows): smooth by eye and by the log
    in play; with VSync on it was checked on the title menu only. 60 Hz, 120 Hz and FreeSync monitors, and Linux, were not
    checked.

Contributors

  • @danielalves96: the weak-PC work, Port Options, the settings that follow you, the saves work and this release.
  • @doberk (#39) and @stingflyer
    (#40): the reports behind the installer downloads and the
    direct start.

Full changelog: v0.3.3...v0.4.0.

Checksums are in SHA256SUMS-*.txt.


Português (Brasil)

Feita para PCs fracos. O jogo agora segura 60 FPS estáveis num dual core sem SMT (46,8 FPS com centenas de travadas
na 0.3.3), usa bem menos CPU em qualquer PC e instala sem abrir o jogo. Detalhes em
Desempenho em PCs fracos.

Os menus do próprio jogo agora têm as opções do port. Pause o jogo ou abra o menu inicial e uma nova entrada Port
Options
dá acesso aos cheats, ao overlay de desempenho, aos ajustes de imagem, à qualidade de imagem e à taxa de
quadros, desenhada pelo motor de menus original do jogo, com as mesmas placas e fontes. Tudo o que você muda ali é
guardado: a próxima sessão começa com isso, e o launcher também mostra.

Seus saves ficam mais seguros e mais fáceis de acessar. O jogo guarda uma cópia datada do memory card a cada save
num altar, a nova aba Saves do launcher mostra cada save com altar, miniatura, dificuldade e tempo de jogo, e
Carregar leva você até aquele save, mesmo com o jogo aberto. Detalhes em Saves.

O launcher abre em menos de meio segundo, e dá para pulá-lo. Antes levava de 15 a 30 s para mostrar a janela num PC
com muito histórico de jogo. Uma nova opção abre o jogo direto, para a Steam. Detalhes em
Launcher, Steam e instalador.

Liso em monitores rápidos, e o overlay mostra a verdade. Num monitor de 144 Hz o jogo fazia 60 quadros, mas só 46 a
54 imagens novas chegavam à tela, então travava enquanto o overlay dizia 60. A janela agora segue os quadros do próprio
jogo, e o overlay tem uma linha GS embaixo do FPS com as imagens que chegam de fato à tela. Detalhes em
Ritmo liso em monitores rápidos.

Vindo da 0.3.3 ou da 0.4.0-rc? O runtime do jogo e o código gerado mudam, então o launcher mostra um aviso para recompilar o jogo.
Roda em segundo plano e seus saves são mantidos. Detalhes em Como atualizar.

Desempenho em PCs fracos

Medido num Core i5-12400F com o jogo preso a menos núcleos, limite de 60 FPS, o ambiente do launcher, o combate do navio,
rodadas alternadas de 150 s contra a 0.3.3 compilada do mesmo jeito:

CPU que o jogo recebe 0.3.3 0.4.0
Dual core sem SMT 46,8 FPS, 113-139 travadas por rodada 60,0 FPS, pior janela de 5 s 59,7, 0 quadros acima de 50 ms
Dual core com SMT (classe i3 / Pentium) 60 FPS 60 FPS com VU1 -17 % e GS -55 % de tempo de CPU
Um núcleo com SMT 38,9 FPS ~54 FPS
Dual core ~1,5x mais lento (simulado) 41,2 FPS 54-55 FPS, sem travadas
Dual core ~2x mais lento (simulado) 33,3 FPS 51-52 FPS, sem travadas

O que mudou:

  • Perfil de velocidade embutido. O jogo é compilado com um perfil de velocidade do clang (PGO) que vem com o launcher,
    então toda instalação já o recebe sem rodar o jogo. O Otimizar agora em Desempenho continua treinando um com o seu
    jogo; por cima do que vem junto, ganha alguns por cento.
  • A instalação nunca abre o jogo. Os módulos nativos do IOP (áudio, disco, memory card) agora são compilados a partir
    dos arquivos IRX do seu disco, em vez de um dump feito com o jogo rodando.
  • VU1 (o gargalo de sempre): blocos nativos mais enxutos, laços que continuam nativos, unpack do VIF e busca de blocos
    mais rápidos. Cada mudança foi conferida para dar os mesmos resultados, ciclo a ciclo, num combate gravado.
  • EE (o código do jogo): código gerado mais enxuto (uma comparação por acesso à memória, menos gravações do pc,
    despacho inline), cerca de 18 % menos tempo de EE; o executável cai de 100 para 81 MB.
  • GS: menos chamadas ao driver (cache de uniforms), uma trava entre o jogo e a thread da GS que dorme em vez de ficar
    consultando, e o frontend da GS só ganha thread própria com 4 ou mais processadores lógicos.
  • Menos threads ocupadas em CPUs pequenas. Com menos de 4 processadores lógicos as threads auxiliares param de girar
    em espera e a thread de renderização deixa de rodar com prioridade elevada, para não roubar tempo do jogo.
  • Limite de 120 FPS. A opção de 240 FPS saiu: deixava a GPU em 100 % até alguns drivers travarem e não mostrava nada
    que o jogador veja. Um 240 salvo vira 120. No limite de 60 a janela segue os quadros do próprio jogo; no de 120 segue o monitor até
    120 Hz.
  • Temporizadores e esperas no Windows mais precisos e mais baratos (esperas do agendador do EE, trava de estado da GS).

Ritmo liso em monitores rápidos

  • O que dava errado. No limite de 60 FPS o launcher rodava a janela na taxa do monitor (120 num monitor de 144 Hz).
    Isso tirava o jogo do seu ritmo mais liso, em que a janela espera o quadro do próprio jogo: dois relógios se afastavam e
    imagens eram repetidas e puladas. Uma sessão a 144 Hz mostrou de 46 a 54 imagens novas por segundo com o jogo a 60.
  • O que mudou. No limite de 60 a janela agora é 60 e segue os quadros do jogo em qualquer monitor. Numa sessão no
    mesmo PC a tela nunca ficou abaixo de 55 imagens novas durante o jogo. O limite de 120 não muda.
  • O VSync piorava em monitores rápidos: o timer de 120 FPS da janela brigava com a taxa de 144 Hz (85 a 100
    atualizações por segundo). O VSync agora só é usado em monitores de até 120 Hz, onde o timer segue o monitor. Acima
    disso ele é ignorado e a janela segue os quadros do jogo, já que o VSync levaria a janela acima do limite de 120 FPS; o
    log avisa ([gow-frame] VSync not used).
  • A linha GS do overlay. Com o contador de FPS ligado, uma linha GS embaixo de FPS mostra as imagens novas que
    chegam à tela a cada segundo. FPS é a taxa do próprio jogo; GS abaixo do FPS quer dizer que a imagem está repetindo, e
    é isso que você sente como travada. Para 60 quadros num monitor de 144 Hz que não varia a taxa, um modo de 120 Hz ou
    FreeSync/G-Sync ainda é o mais liso: 60 não divide 144.

Saves

  • Uma cópia datada do cartão a cada save num altar. O jogo observa o próprio código de save e, quando um save termina,
    copia o Mcd001.ps2 para save-backups/<data-hora>/ ao lado do cartão e mostra um aviso na tela. As 30 cópias
    automáticas mais novas são mantidas; cópias manuais e qualquer coisa que você ponha ali nunca são apagadas.
    GOW_SAVE_BACKUP=0 desliga.
  • Uma aba Saves no launcher. Lista os saves do cartão como a lista do próprio jogo mostra: a miniatura e o nome do
    altar, a dificuldade, o tempo de jogo e o slot. Os nomes e as miniaturas vêm do seu disco instalado; com um CHD, ou antes
    de instalar o jogo, aparece o código da zona. Abaixo da lista fica o histórico: Fazer backup agora adiciona uma
    cópia, Ver saves abre o que uma cópia guarda, Restaurar coloca a cópia no lugar do cartão (com o jogo fechado) e
    guarda o cartão substituído como Antes de restaurar.
  • Carregar um save sem os menus do jogo. Carregar na aba Saves pergunta antes, depois o jogo volta ao menu
    principal, escolhe Load e aquele slot sozinho, a partir do jogo, do menu de pausa ou da tela de título. Com o jogo
    fechado, ele abre o jogo naquele save. A mesma lista está no jogo: F2, depois Tab (ou LB/RB) para a página
    Saves, e aperte o botão de carregar duas vezes. Um slot vazio é recusado sem sair do jogo. GOW_SAVE_LOAD=0
    desliga; GOW_LOAD_SLOT=<0-3> abre o jogo num slot.

Gráficos para GPUs fracas

  • Resolução abaixo de 1x. A Resolução do launcher oferece 0,25x, 0,5x e 0,75x para vídeo integrado. 0,75x fica limpo;
    0,5x e 0,25x ainda mostram um retângulo colorido em cenas claras (veja Problemas conhecidos).
  • Chaves de efeitos na aba Desempenho: sombras dos personagens, efeitos aditivos (fogo, brilhos, partículas) e filtragem
    de textura podem ser desligados um a um para poupar a GPU. As três vêm ligadas.
  • A tela fica ligada enquanto você joga (Windows). Um controle não conta como atividade para o Windows, então uma
    sessão longa podia apagar a tela. Agora o jogo pede ao Windows que a mantenha ligada enquanto a janela está na tela e
    solta o pedido quando ela é minimizada. GOW_KEEP_AWAKE=0 desliga.

Launcher, Steam e instalador

  • O launcher abre em 0,4 s (levava de 14,5 a 30,6 s com 414.000 microprogramas da VU1 capturados). O otimizador os
    contava antes de a janela existir, perguntando ao Windows por cada arquivo; agora a contagem roda em outra thread, só
    com a listagem da pasta, e é reaproveitada enquanto a pasta não muda. Comandos que leem arquivos ou iniciam processos
    não rodam mais na thread principal, e o logs/launcher-startup.log mede cada abertura.
  • Abrir o jogo direto (#40). Em Outros, ou com --play, o
    launcher abre o jogo sem criar a janela (sem WebView2) e termina junto com ele, então a Steam pode rodá-lo como jogo
    fora da Steam. Segure Shift ou use --launcher para ver a janela; um jogo não instalado, que não consegue abrir ou que
    falha abre a janela com o motivo. Outros, Steam, Copiar caminho dá o caminho para adicionar.
  • Downloads do instalador que não desistem (#39). Cada
    download tenta Invoke-WebRequest, o HttpClient do .NET, o curl.exe do Windows e o BITS, um depois do outro,
    confere o SHA-256 (o MinGit agora também é fixado) e, se todos falharem, diz qual arquivo salvar à mão em toolchain/.

Filmes

  • Fim de um filme. A leitura do fluxo agora informa o fim do arquivo, o teste de conclusão espera as últimas imagens
    do decodificador, e o laço que escoa o áudio recebe o ajuste de tempo do host. Isso mira o travamento no fim de alguns
    filmes (P04MP05 num relato contra outra versão). GOW_MOVIE_EOF=0 desliga as duas primeiras partes.

Correções de travamento

  • Travamentos permanentes dos relatos #20 e #37 (#20,
    #37). Nos dois relatos o jogo chamava um endereço que não é uma
    função, e a imagem congelava de vez. Depois do filme antes do Templo de Pandora a atualização do jogador rodava antes de
    o Kratos existir: agora ela é pulada até ele existir. Entre as docas e a primeira Medusa um cabeçalho de lista
    corrompido chegava a um destrutor: uma lista assim agora é esvaziada. Como rede de segurança, uma chamada para uma
    função inexistente é pulada e registrada ([gow-badcall]) em vez de congelar o jogo; GOW_BAD_CALL_SKIP=0 volta ao
    comportamento antigo.
  • Um crash dentro do runtime C pode ser rastreado. O relatório [gow-crash] ganha uma linha com os endereços da pilha
    que apontam para o executável do jogo, então uma falha em memcpy não cita mais só o ucrtbase.dll.

Port Options no menu de pausa e no menu inicial

  • Onde fica. No menu de pausa, a linha Port Options está abaixo de Options. No menu inicial (depois de Press
    Start) é o quinto item, depois de Treasures. O X abre uma lista; o Triângulo volta um nível, como nos menus originais.
  • Cheats. Uma linha ON/OFF para cada cheat do menu F2 (God Mode, One Hit Kill, Infinite Magic, Infinite Rage, Max
    Orbs, All Upgrades, All Powers, Max Meters, Unlock Extras).
  • In Game Overlay. Contador de FPS, estatísticas de GPU, de CPU e uso de RAM, ON/OFF, ao vivo.
  • Image Adjustments. Brilho, contraste, gama e saturação em sliders (2 % por toque, segurar a direção repete) e
    Reset to Default. A imagem acompanha enquanto você move.
  • Image Quality. Resolution (de 1x a 8x o tamanho original), Upscaling (Bicubic, Bilinear ou Pixel),
    Sharpness (um slider, para o filtro bicúbico) e FXAA. Valem na hora: os alvos de renderização são refeitos na
    nova resolução com a imagem atual copiada para eles. 8x pesa na placa de vídeo.
  • Frame Rate. FPS Limit (60 ou 120), VSync e Early FINISH, ao vivo. 120 é experimental, como no launcher.
  • O que não está no menu. O preset gráfico e a chave de varredura progressiva (480p) ficam no launcher. Trocar o
    modo de vídeo durante o jogo faz o jogo reiniciar a GS e os modelos perdem as texturas, então a varredura progressiva só
    vale quando o jogo abre.
  • Desligado sob o RetroAchievements Hardcore, onde o menu é o original. As chaves do launcher continuam funcionando.

Configurações que acompanham você

  • Tudo o que você muda no jogo (cheats pelo F2 ou pelo Port Options, as linhas do overlay, os quatro ajustes de imagem,
    a qualidade de imagem e a taxa de quadros) é gravado num arquivo pequeno na pasta de dados do launcher logo depois de
    cada mudança.
  • O launcher lê esse arquivo quando o jogo termina, ou na próxima vez que você aperta JOGAR se ele estava fechado, e
    atualiza as próprias configurações: as abas Cheats e Desempenho mostram o que você deixou, e a próxima sessão começa com
    isso.
  • A varredura progressiva, o preset e as outras configurações do launcher não são tocados. Sob o Hardcore a lista de
    cheats nunca é lida.

Comportamento dos menus

  • O Triângulo volta um nível em vez de sair do menu. A causa era o buffer de entrada do combate ágil, que reenviava um
    Quadrado ou Triângulo que o menu de pausa não aceitou, então o menu recebia de novo (página, lista, pausa, jogo). Agora
    o buffer só funciona durante o jogo.
  • Segurar Esquerda ou Direita repete nos sliders e nas linhas de valor dos menus (0,4 s de atraso, depois um passo a
    cada 0,12 s), no direcional, no teclado e no analógico esquerdo. GOW_MENU_REPEAT=0 desliga.

Outras correções a partir de relatos de jogadores

  • Imagem quadriculada depois de salvar até reiniciar (#34).
    Logo depois do save, um fluxo de comandos da VU1 chegava a um comando inválido em todo quadro e o port parava de lê-lo
    ali. Um fluxo que para enquanto os envios de textura estão retidos (PATH3 mascarado) nunca os libera, então o jogo
    continuava desenhando com texturas velhas. Agora eles são liberados quando isso acontece. A causa do fluxo desalinhado
    ainda está sendo procurada: as primeiras falhas agora gravam no last.log os comandos anteriores ([vif1] history,
    [vif1] word), então um relatório depois de um save basta para encontrá-la.
  • Um crash agora deixa rastro (#35, o personagem travado
    depois do sexto Gorgon Eye). Agora o log é esvaziado em toda saída, e um crash acrescenta uma linha [gow-crash] (o que
    falhou e onde) depois dos últimos desvios do jogo. O travamento em si ainda não foi corrigido; um novo relatório daquele
    ponto vai dizer o que acontece.
  • O memory card em Arquivos. A página Arquivos do launcher apontava para uma pasta mc0 vazia, e jogadores achavam
    que os saves tinham sumido. Agora mostra o Mcd001.ps2, a imagem do cartão que guarda os saves, como o arquivo para
    fazer backup.
  • Os downloads da atualização automática tentam de novo. Um download cortado no meio ("error decoding response body",
    um 504 do GitHub) falhava na hora; agora tenta até três vezes, com 3 s e 10 s de intervalo. Assinatura ou pacote
    inválido continuam falhando na hora.

Para quem contribui

  • Perfil de velocidade: RustPortPS2/native/pgo/runtime.profdata (só do runtime, então continua válido quando o
    código gerado muda), usado com PS2X_PGO=auto. IOP: ps2-tools iop-manifest refaz o dump dos módulos a partir dos
    arquivos IRX do disco.
  • Medição: o scripts/ab-perf.ps1 agora faz antes uma rodada de aquecimento descartada (-WarmupRunSeconds; a primeira
    rodada de uma série era sempre a mais rápida) e fixa processadores exatos (-AffinityMask 0x5 é um dual core sem SMT
    numa CPU com SMT). GOW_FRAMES_HITCH_LOG=1 diz no que cada quadro lento gastou. A bancada de replay da VU1 também confere
    a contagem de ciclos. Método e todos os números: docs/dev/TOASTER_PLAN.md e docs/dev/PERFORMANCE.md.
  • Regra do projeto: nada roda o jogo ou a janela acima de 120 FPS, testes incluídos (AGENTS.md).
  • Recompilador: o modo de codegen "gow" ganha acesso à memória com uma comparação, gravações enxutas do pc, contexto
    __restrict, despacho inline e as correções de VCALLMSR/VCLIPw da VU0; a saída compat continua idêntica byte a byte à do
    PS2Recomp.
  • Saves: o src/game/gow_save.cpp envolve o gravador de arquivo inteiro 0x22E800 (endereço de retorno 0x2306C0,
    slot 0, 68 bytes) para perceber um save concluído; o gow_save_backup.cpp faz as cópias; o gow_save_load.cpp percorre
    os menus do próprio jogo até um slot na thread do EE, com prazo em cada passo. No launcher, o saves.rs (cartão,
    histórico, restauração, pedido de carga) e o save_art.rs (nomes e miniaturas do disco); o formato do cartão e o
    arquivo de pedido estão em docs/dev/MEMORY-CARD.md. As chaves de save, efeitos e filmes (GOW_SAVE_*, GOW_FX_*,
    GOW_MOVIE_EOF) estão em docs/dev/ENVIRONMENT.md.
  • Crédito da pesquisa: as anotações do gow-native-pc apontaram onde um filme
    termina, qual chamada conclui um save e como distinguir sombras de efeitos aditivos. Nenhum código foi copiado; as
    implementações são deste projeto (docs/THIRD_PARTY.md).
  • As páginas do Port Options são uma cópia modificada dos filmes de menu do jogo (FLP_HUD no menu de pausa, FLP_Shell
    no menu inicial), feita a partir do seu próprio jogo pelos scripts de RustPortPS2/native/tools/menu/. O repositório
    guarda só um delta, aplicado depois de conferir o tamanho e o CRC32 do filme. GOW_NATIVE_CHEATS_MENU=1 liga (o
    launcher sempre passa); GOW_MENU_DIAG=1 registra o menu com a etiqueta [gow-menu].
  • A taxa de quadros e a escala de renderização agora são lidas ao vivo: a taxa da lógica, o intervalo de apresentação, o
    VSync, o Early FINISH, o filtro de upscaling, a nitidez, o FXAA e a resolução interna são atômicos em vez de valores
    lidos no início.
  • Uma armadilha encontrada no caminho: o heap do jogo grava ponteiros numa faixa fixa do buffer onde o filme de pausa é
    carregado, então um filme reconstruído funciona ou trava conforme o tamanho exato. O gerador agora deixa essa faixa
    como preenchimento sem uso. Detalhes em docs/dev/NATIVE_MENU_RESEARCH.md.

Como atualizar

Uma 0.3.x ou 0.4.0-rc instalada se atualiza sozinha (na hora com Atualizações automáticas ligada, ou pelo aviso na
barra de título); você também pode instalar o setup por cima, ou descompactar o ZIP portátil por cima. Depois, um aviso no topo de Desempenho diz que o jogo tem correções: aperte
Recompilar agora. Leva de alguns minutos a cerca de 20 minutos e roda em segundo plano; você continua jogando a
versão atual até terminar, e a nova abre na próxima vez que iniciar o jogo. Seus saves (game/Mcd001.ps2) não são
tocados.

Você está na O que fazer
0.4.0-rc, 0.3.0 até 0.3.3 Deixe o launcher se atualizar (ou instale este setup por cima), depois aperte Recompilar agora.
0.2.5 até 0.2.9 Instale este setup por cima, depois aperte Apagar e recompilar.
0.2.4 ou anterior Instale o setup ou descompacte o ZIP portátil por cima do antigo, depois aperte Apagar e recompilar (os saves ficam).
Instalação nova Instale e jogue. O Visual Studio não é necessário, e o jogo não abre durante a instalação.

Downloads: instalador do Windows ou ZIP portátil; Linux .deb ou AppImage (experimental). Os arquivos terminados em
.sig e o latest.json servem para a atualização automática; você não precisa deles.

Nenhum arquivo do jogo vem junto. Você precisa da sua própria imagem de disco original do God of War americano
(SCUS-97399), de um CHD dela, ou de uma tradução.

Problemas conhecidos

  • Ainda não medido em hardware fraco de verdade. Os números acima vêm de uma CPU de desktop presa a menos núcleos. Um
    dual core bem mais lento que ela pode ficar em 51-55 FPS. Relatos com sua CPU, GPU e o overlay do jogo são muito
    bem-vindos.
  • Testado no Windows com botões simulados. Os menus foram conduzidos por um controle simulado, não à mão com um
    controle físico, e o som do slider não foi conferido. O Linux não foi testado para este menu.
  • Resolução 0,5x e 0,25x mostram um retângulo colorido em cenas cheias de bloom. 0,75x fica limpo.
  • A parte de saves foi conferida em cópias privadas de um cartão do PCSX2 (Windows): backups iguais ao cartão, carga no
    início, durante o jogo e pelo menu de pausa, e a recusa de um slot vazio. Não conferido: a página Saves do F2 com
    teclado ou controle de verdade, um pedido de carga durante um filme, um carregamento de fase ou a tela de save, uma
    instalação com CHD (aparece o código da zona), o Linux.
  • A correção do fim de filme nunca foi acionada aqui: o travamento do P04MP05 não foi reproduzido, então não está
    provado corrigido. O ajuste de áudio no fim do filme não foi conferido de ouvido.
  • Abrir o jogo direto foi conferido sem a Steam: o overlay e o Steam Input da Steam, e segurar Shift ao abrir, não. As
    chaves de efeitos foram conferidas no jogo só no brilho do altar.
  • Só o jogo americano original. O patch do menu é feito para os filmes de menu dele; com outro jogo ou versão o menu
    original é mantido.
  • Encadear seis saltos de zona numa sessão (uma ferramenta de depuração) parou uma vez em PAND04G; os mesmos saltos
    divididos em duas sessões passam. Não foi conferido se isso acontece sem o patch do menu.
  • O jogo pode travar logo depois de salvar, como na 0.3.3. O Linux continua experimental. 120 FPS é
    experimental.
    Alguns jogadores ouvem chiado no áudio. 32:9 e 21:9 são experimentais.
  • As correções de #20, #34 e #37 não foram reproduzidas no jogo: essas falhas só apareceram nas sessões de jogadores.
    Por que o Kratos faltava (#37) e o que corrompeu a lista (#20) não se sabe; os logs agora dizem mais quando acontece.
  • O personagem pode travar depois do sexto Gorgon Eye (#35). Não corrigido; anexe o relatório se acontecer.
  • O novo ritmo da janela foi conferido num PC só (Radeon RX 6600, monitor de 144 Hz, Windows): liso a olho e pelo log
    durante o jogo; com VSync ligado foi conferido só no menu inicial. Monitores de 60 Hz, 120 Hz e com FreeSync, e o
    Linux, não foram conferidos.

Quem contribuiu

  • @danielalves96: o trabalho para PCs fracos, o Port Options, as configurações que acompanham você, a parte de saves e
    esta versão.
  • @doberk (#39) e @stingflyer
    (#40): os relatos por trás dos downloads do instalador e da
    abertura direta.

Changelog completo: v0.3.3...v0.4.0.

Os checksums estão em SHA256SUMS-*.txt.

Don't miss a new gow-pc-port release

NewReleases is sending notifications on new releases.