NeedForSpeedTwoSEImage.jpg
原文链接:https://cookieplmonster.github.io/2023/09/24/silentpatch-need-for-speed-classics/?s=09

Recently, after playing an emulated PS1 version of Need for Speed II with RetroAchievements, I wished to revisit a PC version with an excellent Modern Patch from Verok. Although this patch fixes a wide array of compatibility issues, I still ran into problems – I couldn’t map any buttons on my Xbox One controller, although I could map the analog stick and triggers. Troubleshooting this issue quickly snowballed into the process of finding (and fixing) more bugs, many of which turned out to be shared across multiple games. Therefore, what was intended to be originally a patch for NFS2: Special Edition now spans four Need for Speed games:

  • Need for Speed 2: Special Edition
  • Need for Speed 3: Hot Pursuit
  • Need for Speed: High Stakes (also known as Road Challenge)
  • Need for Speed: Porsche Unleashed (also known as Porsche 2000)

Since Modern Patches exist for all four supported games, I didn’t have to do much. However, during development I was also made aware of some issues introduced by NFS2/Porsche Modern Patches (as far as we know, NFS3/NFS4 patches are spotless 🙂), so now I also patch the patch. _Yo dawg…_

Highlights

  • These old games are known to have issues with multicore CPUs. In the case of NFS3, Modern Patch fixes the race conditions and can run freely, but the other games didn’t get this treatment so they’re being limited to run to just one core. This can lead to performance issues even on modern PCs, as previously seen in Scarface – therefore, SilentPatch applies a similar approach to one previously used in Scarface. In NFS2SE and NFS4, only the “problematic” movie decoding threads are pinned to the same core as the main game thread, while the other threads are allowed to run freely. This results in a good compromise between stability and performance.
    By default, SilentPatch is set up to use the configuration file from Modern Patch, so if you use these two fixes together, you’ll automatically get the best possible experience with SilentPatch reading the configuration file of Modern Patch and overriding its affinity changes to my own. However, if you wish to change it, SilentPatch reads a SingleProcAffinity setting from the INI file of the Modern Patch.
  • NFS2: Special Edition has an issue (fixed in the sequels) where controller button mappings don’t work with controllers reporting more than 15 buttons, although the game should be able to handle up to 32 buttons. This rendered my Xbox One controller partially unusable, as it reports 16 buttons. I fixed the issue and documented it in the NFSIISE project. As a bonus, I also made the game not close if a controller was disconnected during the race, as the sequels never did that.
  • As good as NFS2SE’s Modern Patch is, it unfortunately also introduced at least one issue. Online races became a sub-par experience because they were rendered as if they were a split-screen race:


    This is a reconstruction, but this is exactly how online races used to look.

    SilentPatch hooks into Modern Patch (if installed) and patches this issue.

  • Need for Speed: Porsche Unleashed can crash on some Windows 10/11 PCs while enumerating controllers on startup. Curiously, it’s a rare case where the game did nothing wrong and the issue is a regression of the dinput.dll library introduced sometime during the Windows 10 lifecycle. This affects many games using this version of the DirectInput library and the fix is to use a DirectInput-to-DirectInput8 wrapper. In SilentPatch, I also took an alternate approach and fixed it by changing the device enumeration to only list gamepads, so the game does not require a wrapper to run. As a bonus, this also fixed an issue where the game enumerated… more than it should, even with dinputto8. For example, on my PC it would even enumerate USB audio and AIO devices:

Changelog and download

This has only been a highlight of the most noteworthy issues. The full changelog for all supported games is as follows; fixes marked with  can be configured/toggled via the INI file.

Essential fixes:

  •  Locked all (NFS3/NFS Porsche) or specific problematic threads (NFS2SE/NFS4) to one core, while allowing worker threads to use any CPU cores - combining good stability and performance. This option has to be enabled by adding SingleProcAffinity=1 to an INI file named like the game’s executable. This change is fully compatible with Modern Patches and overrides its single core-affinity solution.
  •  (NFS2SE) Fixed a potential race condition on starting the movie decoding thread.
  •  (NFS2SE) Fixed a bug preventing controller button mappings from working correctly with gamepads that report more than 15 buttons (such as the Xbox One controller).
  •  (NFS2SE) Fixed the game closing when the controller disconnects during the race.
  •  (NFS2SE, Verok’s Modern Patch only) Fixed an issue where online races were displayed only on the top half of the screen as if they were split-screen races.
  •  (NFS Porsche) Fixed a startup crash due to DirectInput controller enumeration being broken under specific circumstances on Windows 10 and newer.
  •  (NFS Porsche) Fixed severe performance issues on Windows 10 and newer when rebinding controls.
  •  (NFS Porsche, Verok’s Modern Patch only) Fixed unresponsive keyboard inputs after Alt + Tab during the race.
  •  (NFS Porsche, Verok’s Modern Patch only) Fixed a severe memory leak in OpenGL1 and OpenGL3 thrash drivers occurring after every race.

Miscellaneous fixes: 

  • Alt + F4 now works correctly.
  • Num Lock, Caps Lock, and Scroll Lock don’t get forcibly disabled on game launch anymore.
  • (NFS2SE/NFS3/NFS4) Fixed issues with stuttery/unresponsive mouse cursor in menus when using mice with high polling rates.
  • (NFS2SE/NFS3/NFS4) Fixed a controller polling bug resulting in potential incompatibilities with DirectInput wrappers such as Xidi.

Enhancements: 

  • Pasting text into text boxes now works with Ctrl + V.

The modification can be downloaded from _Mods & Patches_. Click here to head to the game’s page directly. Each game page also links to their respective Modern Patch, which I strongly recommend using together with SilentPatch. That said, they are not mandatory and SP is compatible with stock games too.

 Download SilentPatch for NFS2: Special Edition  Download SilentPatch for NFS3: Hot Pursuit  Download SilentPatch for NFS4: High Stakes  Download SilentPatch for NFS: Porsche Unleashed
After downloading, all you need to do is to extract the archive to the game’s directory, and that’s it! Not sure how to proceed? Check the Setup Instructions.

Need for Speed 3: Hot Pursuit

SilentPatch 

Last update: September 24, 2023

This modification addresses several numerous more or less several bugs in the classic Need for Speed games from the late 90s - starting from Need for Speed 2: Special Edition, through Need for Speed: Porsche Unleashed. Since all those games already have their established unofficial patches, I concentrated my efforts on issues either omitted by those patches, or (in the case of NFS2SE and NFS Porsche) caused by them.

 Modern Patch is strongly recommended, although not mandatory. SilentPatch can work with or without it. 

Featured fixes: 

Fixes marked with  can be configured/toggled via the INI file.

Essential fixes: 

  •  Locked all game threads to one core, while allowing worker threads to use any CPU cores – combining good stability and performance. This option has to be enabled by adding SingleProcAffinity=1 to an INI file named like the game’s executable. This change is fully compatible with Modern Patches and overrides its single-core affinity solution.

Miscellaneous fixes: 

  • Alt + F4 now works correctly.
  • Num Lock, Caps Lock and Scroll Lock don’t get forcibly disabled on game launch anymore.
  • Fixed issues with stuttery/unresponsive mouse cursor in menus when using mice with high polling rates.
  • Fixed a controller polling bug resulting in potential incompatibilities with DirectInput wrappers such as Xidi.

Enhancements: 

  • Pasting text into text boxes now works with Ctrl + V.

 Setup instructions

 Download
 See source on GitHub