Why do emulators stutter the same was as my NES did?
I'm not asking why emulators run slow in general. I know there's a performance hit when you're faking being another OS. That's not what I'm asking, but that's all my web searching results.
I mean the game plays fine until it gets to a certain point in a certain level that I remember running slow all those years ago. Like there are 20 enemies on the screen or something and that's the same way the NES would lag 40 years ago.
The emulator is on my PC, which has orders of magnitude more power. Even accounting for emulation's inherent performance hit, it seems like it should be able to handle it.
It's emulating the hardware of the system, which includes its limitations. Some emulators are capable of overclocking to fix that, though it won't have desirable results in every game. It also can make games significantly harder. One of the Gradius games is known for a section where slowdown makes it viable to beat.
Your x86 is a supercomputer from an alien world compared to an NES. It's not just extremely faster, it works in entirely different ways physically.
Some features of old console games rely on a deep understanding of the entire hardware of the console. As you wrote the game in assembly language, talking directly to each individual hardware component, you had to follow certain rules from the operating manual. There is no operating system doing this for you. Now, what happens if you don't follow the manual strictly?
There is some undefined behavior that still works reliably, if you just get the timing for a certain instruction to a component just right.
If you now were to naively interpret the instructions in an emulator, even at exactly the right timings according to the frequency of processor, the game would suddenly be broken, because your emulator is missing micro corrections for signal delay that the original console had due to physical properties.
So even making the game run as it would on the console is a major challenge.
If you add optimizations in one place, because of your one level stuttering, it might break dozens of other games. The emulator doesn't want to be a software to play your game as well as possible. The emulator wants to replicate the way the original console worked as perfectly as possible. Your game stuttering exactly the same way as you remember it is a sign of a good emulator.
The NES can only render 8 sprites per scan line. Games knew about this, and some, like Zelda, would double render the frame if it detected more than 8. This has two effects: Some sprites would flicker, as they’re only being drawn on one of the two passes, as the frame takes twice as long to draw, resulting in a slowdown. This behavior is part of the game, and would need to be patched out if it were running on an emulator that does away with this restriction. (However, because the emulator is no longer 100% faithful to the original hardware, some people might choose not to use it.)
Yea like others have said, you're operating under the assumption that the shortcomings of old hardware require modern revisionism. I guess what makes this particularly unattractive with that specific era of videogaming is that games ran so close to the hardware that overclocking it (in actuality or virtually) doesn't just fix those edge cases (if at all).
Most games/software developed for chips like that of the NES rely on a predictable environment. You can't possibly know how a specific game will react to an increase in clockspeed.
Later generations like the PS1 are less susceptible to this. Emulators of the PS1 can't just bump the clockspeeds, they can also run at modern resolutions like 1080p and higher.
To compete with successfully; approach or attain equality with. To imitate the function of (another system), as by modifications to hardware or software that allow the imitating system to accept the same data, execute the same programs, and achieve the same results as the imitated system.