Hi, there.
I've managed to isolate the cause for this issue (Cave Story +, as the classic version runs well on my system without any changes), at least on my Linux-based setup. However, the solution is based on Windows (wine in my case), so I'll describe it briefly here. I'd expect everything I describe below to work on Windows (exceptions noted when needed).
The cause I've managed to pinpoint is related to the system's "uptime" when the game is started. For example, doctoring the "uptime" to a low value (as if the computer had been recently booted up) and changing nothing else magically made the game run as fast as it could (on one of my systems, because of vsync, that was capped to 144 fps on my external monitor), so then it was necessary to cap the fps to 50 (for a speed akin to the original,Cave Story (not "plus")), or 60 (for the speed at which the CS+ game seems to have been designed to run).
I'll describe my solution briefly here:
1. Install and configure
UptimeFaker to report a low, yet "realistic" uptime value to the game (config file example further below):
1.1. Copy
uptimefaker32.dll to/as
uptimefaker32.asi in the game's topmost directory (the one containing the file
CaveStory+.exe).
Note: In my early attempts, I've tried to install the
uptimefaker32.asi file to a subdirectory ("scripts", "plugins", "update", as that's the preferred method to install ".asi" files for "ultimate asi loader") of the game's topmost directory, but that seems to have somehow confused
CaveStory+.exe into using/loading the ".asi" file itself, yielding crashes that had me scratching my head and going into a few rabbit holes for a few hours, but I ended up putting the ".asi" file in the game's topmost directory (also supported by "ultimate asi loader"), and all the problems were magically gone. This is the first game for which I've had to do that! :-)
1.2. Create a text file named
uptimefaker.ini in the game's topmost directory with the following contents:
; ===[ begin ]===
; Configuration file for Uptime Faker utility
; In this file you can configure how much uptime should be added to time functions
; and which functions should be hooked
[AddedUptime]
; How many uptime days should be added to all hooked time functions
; Windows checked builds add approximately 49 days of uptime
AddUptimeDays=1
; When ProcessTime is set to 1, timers will start ticking from the time the process
; was started, instead of PC uptime
ProcessTime=1
; Below you can toggle on/off hooking of each specific time function
; Sections correspond to libraries those functions come from originally,
; while keys correspond to specific functions from this library
[kernel32]
QueryPerformanceCounter=1
GetTickCount=1
GetTickCount64=1
[winmm]
timeGetTime=1
timeGetSystemTime=1
; ===[ end ]===
2. Use
ultimate asi loader to inject
uptimefaker32.asi into the game process:
2.1. Use a DLL name that would accomplish an early injection using a safe-ish DLL placeholder. I've chosen
version.dll with excellent results. In simple terms, just copy
dinput8.dll (download/use the win32 (windows in/for 32-bits mode) file) to/as
version.dll in the game's topmost directory.
3. Cap the fps to 50 or 60, using the appropriate method for your real operating system:
3.1. Windows: refer to other posts (see post #10 in this thread for a solution that works for nvidia cards), or just google for your particular case;
3.2. Linux: I've used
libstrangle (I've built it from source) with excellent results;
Even though this solution works perfectly with regards to delivering the expected fps, I will say that the game does seem to show a somehow "shaky" screen refresh when the game viewport scrolls/shifts in any direction. I can't compare this to how it'd behave on native Windows, so I don't know if this behaviour is just a consequence of how the game was coded, or if there are issues that would remain to be solved.
I will say, though, that both
NXengine evo (available and working perfectly as a "snap" on native Linux) and
doukutsu-rs (available as a "snap" and as a "flatpak") both work perfectly on every computer I own (Lenovo Thinkpad X240 with Intel graphics, HP EliteOne 800 with Intel graphics, Lenovo Idea Legion Slim 5 with both Intel and nvidia GPUs). YMMV :-)