Repository navigation
Releases: jxnplays/cod3-recomp
Release list
Remaster pass: 2x frame rate, visible look preset, working cheats
Remaster pass: performance, the look, and the cheats
The frame rate roughly doubled, the remaster is now visible on a clean
install, and the title's own debug commands work — none of which was true a
week ago.
Performance: 70.8 → 139.3 fps
RenderStats::Tick() prints the frame line, every counter, and a per-section
breakdown of where a draw's CPU time goes. It had no callers anywhere in the
tree. COD3_RENDER_STATS and COD3_RENDER_PROFILE had never once printed
anything, so every performance claim this project made was an argument from
reading code.
Wired it up, and the first reading said index conversion was 62% of all CPU
draw time — 22.9 MB byte-swapped out of guest memory every frame, for bytes
that mostly hadn't changed. The write-watch cache that avoids this existed and
was off, and the profile line said 0 found the same by their pages, so it had
never once hit.
| frame | CPU | GPU | fps | indices µs/draw | |
|---|---|---|---|---|---|
| watch off | 14.11 ms | 9.71 | 9.69 | 70.8 | 5.46 |
| watch on | 6.88 ms | 2.66 | 6.68 | 145.1 | 0.16 |
Also located the GPU's wall: one shader — the alpha-tested foliage pass — is
28.5% of the entire GPU frame on its own. Not touched, because its two
discards are not visibly the same test and guessing wrong makes foliage
blink. docs/PERFORMANCE.md has the measurements.
The look is now visible on a clean install
Sharpening, vignette, grain and the whole grade all shipped at the identity,
which renders exactly the base game. A verified, measured, working feature
that shows nothing is the same as a feature that does not exist. Defaults now
ship a Reborn look, and the Color tab opens on a Look preset so it
can't be missed.
Measured on one frame, Reborn against base game: saturation +102%, high
frequency +25%, luma −12.8%.
And then two of them were found to have never worked at all:
if (g_postConstants) { ...CreateBuffer(..., &g_postConstants); }That reads as "if not already made". It is "if non-null", and a ComPtr that
was never assigned is null — so the buffer was never created, nothing was
bound at b1, and the post pass read zeroes and returned early on every pixel
of every frame. Vignette and grain had never once done anything.
Once fixed, grain immediately flickered badly, because it was also wrong:
float2 g = floor(uv / max(post.w, 0.5)); // post.w was 1.0, uv runs 0..1floor(uv / 1.0) is (0,0) for every pixel on screen, so the "grain" was one
number applied to the whole frame, changing 140 times a second. Now hashed per
pixel, with a hash that has no sin() in it, on a 24 fps clock.
Cheats: they exist, and I was wrong twice
F11 → Cheats: god mode, enemies ignore you, walk through walls, clear the
fog, give ammo, give everything. All start off; a level starting turns them
all off.
The short names — god, noclip, notarget — are sitting right next to the
real ones in the same string table, and they are arguments, not commands.
Sending them does nothing, silently. The real ones are GAME_GODMODEON,
GAME_NOCLIPON, GAME_NOTARGETON, and they need the title's sv_cheats gate
open first.
That was the second wrong conclusion about this in a week, and the first one
was pushed. Both are written up in docs/DEV_COMMANDS.md with the addresses,
because the reasoning error is the useful part.
Also fixed
- FXAA was silently discarded whenever vignette or grain was on, which is
now the default. A player who chose FXAA got it only while touching nothing
else on the page. - The ImGui tab stack — the Cheats tab was added without its
EndTabItem(), which unbalanced the ID stack and killed the Controls and
Mods tabs afterwards. There is now a check that counts Begin against End. - Mouse sensitivity top end 10 → 100. At 10 a 1000 dpi mouse still needed
1.2 inches of hand movement to cross the screen. - Pad can open the menu with LB + D-pad up as well as Start.
Not in this release
SMAA, TAA, FSR, ambient occlusion, shadow quality settings, a skybox or
day-night cycle, weather, weapon inspect animations, and multiplayer.
Resolution scale is not supersampling. The title renders at 1040×720 at
every setting; the control enlarges the buffer the finished image is blown
up into. Above 100% it adds no detail and makes existing edges larger —
measured, high-frequency energy goes up 79% rather than down. The real
answer is changing the console's own internal pitch, which the title decides,
and that is not started.
Checks
28 in scripts/selfcheck.ps1, all passing. Two of them exist because a check
that passes while the text it was written for sails past is worse than no
check: one counts ImGui BeginTabItem against EndTabItem, and one asserts
the README names every cheat command the code actually sends.
Full measurements in docs/PERFORMANCE.md, docs/DEV_COMMANDS.md and
docs/ROADMAP.md.