Getting old PC games to run at sensible resolutions on a modern display

A flat panel monitor displaying an abstract grid of coloured squares on a plain desk

Running a game written for a 4:3 cathode ray tube on a modern widescreen panel goes wrong in several distinct ways. They get discussed as one problem, which makes them harder to fix than they need to be. Separating them is most of the work.

Problem one: the aspect ratio the game assumed

A game targeting 320×240 or 640×480 assumed a display roughly four units wide to three units tall. Stretch that image across a 16:9 panel and everything becomes wider than intended. Circles become ellipses and characters look heavier.

Some players do not notice or do not mind. Others find it intolerable once seen. Either way it is a display decision, not a game one, and the fix is usually in the graphics driver or the display’s own settings rather than anywhere in the game.

Complicating this, a handful of modes from the period were not square-pixel modes at all. The 320×200 mode common in earlier titles was displayed at 4:3, meaning pixels were taller than they were wide. Rendering it at exactly 320×200 on a square-pixel display is arguably wrong, even though it matches the framebuffer precisely. Both choices have defenders.

Problem two: how the small image gets enlarged

A 640×480 image on a 2560×1440 panel has to be enlarged. How it is enlarged matters enormously and is often the difference between a game looking crisp and looking like a smeared photograph.

  • Nearest-neighbour scaling keeps hard pixel edges. It looks sharp, and blocky where the original art was blocky.
  • Bilinear filtering smooths between pixels. It softens edges and, on pixel art, tends to look like a blurred photograph.
  • Integer scaling multiplies by whole numbers only, avoiding uneven pixel sizes at the cost of black borders.

Uneven scaling is the specific culprit behind an effect people often struggle to describe: some pixels appear larger than others in a way that shimmers during movement. It happens whenever the scale factor is not a whole number, and integer scaling eliminates it outright.

Problem three: the render path

Games from this period might use software rendering, an early hardware API, or a proprietary interface for a specific graphics card. These have very different prospects on current hardware.

Software renderers generally age best. They ask nothing of the graphics hardware beyond somewhere to put the finished image, so they still work. They are also usually the mode with the fewest surprises, and on a fast machine the performance cost is irrelevant.

Early hardware paths are less reliable, because they depend on driver behaviour that has been reimplemented several times since. A game may run, may run with visual faults, or may fail on startup. Wrapper layers that translate old calls into current ones fix a good share of these cases.

Proprietary paths targeting a specific vendor’s hardware need emulation of that interface. Where such a layer exists, results are often excellent, since these paths were frequently the game’s best-looking mode.

Problem four: the game’s own limits

Some games simply cannot render above a certain resolution. The interface is drawn at fixed coordinates, or the field of view is computed in a way that assumes a particular shape, or the menu is a bitmap of a specific size.

Forcing a higher resolution on these produces interfaces anchored to the wrong corner, text off the edge of the screen, or a field of view that crops the top and bottom rather than widening the view. That last one is worth checking deliberately, because a widescreen mode that removes information rather than adding it is a downgrade dressed as an improvement.

A workable order to attack it in

Start with the game’s own options at its native aspect ratio and confirm it runs correctly at all. Then set the display or driver to preserve aspect ratio rather than stretch. Then choose a scaling method, preferring integer scaling where the game’s resolution allows it. Only then consider a resolution patch or widescreen fix, and test whether it widens the view or crops it.

Working in that order means each change is tested against a known state. Changing four things at once and finding the result unsatisfactory tells you nothing about which of them was responsible, and that is how an evening disappears.