Is it realistic for an emulator to be coded such that each pixel is rendered to the screen? I'm coding up an emulator in SDL and finding that my computer, a modern i7, is struggling to render per pixel. Do most emulators actually render per pixel, scanline, or frame?
I'm just figuring, if its per pixel (256*240*30) = 1843200 screen renders would be necessary. I'm not sure modern hardware can drive that, unless I'm thinking about this problem incorrectly.
You still render frames at the same rate (hopefully 60 frames a second) -- so when you say "(256*240*30) = 1843200 screen renders" the math there isn't valid. All that calculation indicates is how many pixels, as an aggregate total, are involved across 30 frames. The screen (talking about actual hardware here) is still only going to get updated 60 times a second -- meaning the electron gun draws the entire contents of video RAM 60 times a second. (Edit: folks wanting to discuss progressive vs. interlaced and so on are welcome to, but the data remains the same -- the NES runs at 240p).
Your emulator (regardless of per-pixel or per-scanline) should not "max out CPU time" on a Core i7 -- consider that Nestopia takes up 3-4% CPU on my Core i7 2600K system (I do not overclock) running Windows XP Pro SP3. Whatever you've designed is being done incorrectly in some manner. You would need to write up a full explanation of how you implemented graphics in your emulator + how you're using SDL for someone to shed light on this performance problem.
When people mean their emulator renders on the per pixel level they mean that the pixel is drawn to a buffer of some sort every time a pixel is rendered by the emulated NES. Once it's time to display a frame on the computer that buffer is copied to the actual computer hardware's screen.
It is possible to actually render directly to the screen with each pixel but that would be horribly inefficient as you have discovered.
All that matters is that the screen image is correct, doesn't matter exactly how it got there.
And that means that memory gets fetched from the correct PPU addresses, (attribute tables, nametables, character graphics), has the correct data, and has the correct fine scroll value. Also OAM (sprite table), Palettes, and PPU Mask bits.
Changes to those things could happen at any time. Many games change scrolling (PPU render address/temp address).
Some games will shut off the screen, and change character graphics that have already been drawn to the screen. Or upload a new OAM (sprite table).