Graphics and Music Challenges for Classic-Style Computer Applications
This version of the document is dated 2026-03-17. Post an issue or comment on this document.
The following are challenges I make to the computer community, relating to:
- Graphics for classic-style game development.
- MIDI music synthesis for classic-style games and apps.
- Tileable wallpapers with limited colors and resolution.
- Other challenges and projects.
All may interest 1990s computer users.
Contents
- Contents
- Graphics Challenge for Classic-Style Games
- Building a Public-Domain music synthesis library and instrument banks
- Other Challenges and Projects
- License
- Notes
Graphics Challenge for Classic-Style Games
An interesting challenge for game developers, relating to designing games with classic graphics that run on an exceptional variety of modern and recent computers.
In this document, classic graphics generally means two- or three-dimensional graphics achieved by video games from 1999 or earlier, before the advent of programmable “shaders”. For details, see “Classic Graphics in Scope”, later. (To summarize: In general, a game screen of 640 × 480 or smaller, up to 12,800 3-D polygons at a time [fewer if the game screen is smaller], and tile- or sprite-based 2-D graphics are involved.)
This challenge is intended to encourage the making of video games with very low resource requirements (say, no more than 64 million bytes of system memory); most desktop and laptop computers from 2010 on, and most smartphones from 2016 on, can draw even high-quality pre-2000 graphics using only software — without relying on specialized video cards — at 640 × 480 pixels or smaller, screen resolutions typically targeted by video games in the 1990s and earlier.1
The challenge sets an upper bound on the kind of computer graphics that are of interest. Further constraints to graphics computation (such as memory, resource, color, resolution, or triangle limits) are highly encouraged. It is also encouraged to write a free and open-source graphics engine2 or establish a lean programming interface for this graphics specification. For details, see “Lean Programming Interfaces for Classic Graphics”.
The Specification
Define the larger screen dimension as the larger of the screen width and the screen height.
Limit 3-D graphics to the following:3
- The maximum number of primitives that can be shown at a time is equal to screen width times screen height divided by 24.4 (See also survey project in “Other Challenges and Projects”, later.)
- A primitive is either a triangle or a line segment. An application may also consider a convex quadrilateral to be a primitive.
- Each vertex of the primitive points to a vertex from the vertex list described later.
- Each primitive can be translucent.
- The maximum number of vertices that can be displayed at a time is 3 times the maximum number of primitives.
- A vertex consists of an XYZ position, an XY texture coordinate, and a red–green–blue vertex color.
- Each vertex color follows this color format: The red, green, and blue components occupy up to 5 bits each.5
- Each texture (an image that is applied to the surface of 3-D objects)—
- is in a 16-bit-per-pixel format, where each pixel has the vertex color format given earlier, or
- is in a 1-, 2-, 4-, or 8-bit-per-pixel format and has a table of colors with that color format.
- The width and height of each texture are each powers of 2.
- A texture’s maximum width and maximum height, in pixels, are each equal to 256 or the larger screen dimension, whichever is smaller.
- Textures may contain transparent pixels.
- Textures should not be “pixelated” before the game uses them. A “pixelated” image occurs when an image is enlarged with point filtering (also called nearest-neighbor filtering), with the result that some or all of the resulting image’s rows and columns are repeated.
- For 3-D graphics, Z buffering (depth buffering), flat shading, Gouraud shading, per-vertex specular highlighting, per-vertex depth-based fog, line drawing, two-texture blending, MIP mapping, source alpha blending, and destination alpha blending are supported.6 Bilinear filtering and edge antialiasing (smoothing)7 are optional.
- The 3-D graphics buffer’s resolution is the same as the “screen resolution”.
- 3-D primitives should undergo perspective correction, but this is optional.8
Example: For a “screen resolution” (see later) of 640 × 480 pixels, no more than 12,800 primitives (640 × 480 / 24) and 38,400 vertices can be shown at a time, and the maximum texture size is 256 × 256 pixels. For 320 × 240 pixels, the maximums are 3200 primitives, 9600 vertices, and textures of 256 × 256 pixels. For 320 × 200 pixels, the maximums are 2666 primitives, 8000 vertices, and textures of 256 × 256 pixels.
Limit 2-D graphics to the following: 9
- Layers:
- Up to four 2-D layers can be displayed at a time. Each 2-D layer is a rectangular array of references to tiles (see later), and can also be called a tile map.
- Up to two of the 2-D layers can undergo a 2-D affine transformation.
- If 3-D graphics are being displayed, one of the 2-D layers is replaced with a 3-D layer, which is an image on which the 3-D graphics are drawn. The 2-D layer replaced this way can vary over time.
- The 2-D layers may contain transparent pixels. The 3-D layer may contain transparent and translucent (semitransparent) pixels.10
- Tiles. A tile is a small rectangular array of pixels.
- Every tile has the same width and the same height as every other. The width must be 32 or less, and the height must be 32 or less.
- The application chooses one:
- Each tile is in a 1-bit-per-pixel format and uses one of 16 color tables, with 2 colors per table.
- Each tile is in a 2-bit-per-pixel format and uses one of 16 color tables, with 4 colors per table.
- Each tile is in a 4-bit-per-pixel format and uses one of 16 color tables, with 16 colors per table.
- There is a single 256-color table for use by tiles. Each tile is in an 8-bit-per-pixel format.
- Each color in each color table used by tiles is of the vertex color format given earlier.
- Tiles may contain transparent, but not translucent, pixels.
- Tiles should not be “pixelated” before the game uses them.
- When referenced in a 2-D layer, a tile can be horizontally flipped, vertically flipped, or both.
- Sprites. A sprite is a rectangular array of either tiles or pixels.
- Each sprite has up to X × Y pixels, where X and Y are each 1/4 the larger screen dimension, rounded up to the nearest power of 2. (An alternative limit is X = 64 and Y = 64.)
- Besides the previous point, sprites can have any width and height.
- Each sprite made of pixels (rather than tiles) has a pixel format allowed for 3-D textures, given earlier, and may contain transparent, but not translucent, pixels.
- Each sprite can be drawn above or below any of the 2-D or 3-D layers.
- The application chooses one:
- Each sprite can undergo a 2-D affine transformation.
- Each sprite can be horizontally flipped, vertically flipped, or both.11
- No affine transformation or flipping of sprites is allowed.
- Sprites should not be “pixelated” before the game uses them.
- Up to N sprites can be displayed at a time, where N is calculated as (screen width × screen height × 16) / (X × Y), rounded up, but not more than 512.12
Note: The suggested width and height for tiles is 8 pixels × 8 pixels.
Example: For a “screen resolution” (see later) of 640 × 480 pixels, one choice is: 4-bit-per-pixel tiles, 8 × 8 tiles, sprites up to 160 × 160 pixels, no more than 192 sprites at a time, and no flipping or transformation of sprites.
Other requirements:
- Screen resolution: The game screen image has no more than 307,200 total pixels (for example, 640 × 480, or 640 pixels horizontally and 480 pixels vertically).13
- Rendering in software: The game should include a mode in which the graphics are rendered in software. This means that the rendering of graphics does not rely on a video card, a graphics accelerator chip, or the operating system’s graphics API (such as GDI, OpenGL, or Direct3D) with the sole exception of sending a finished game screen image to the player’s display (such as through GDI’s
StretchDIBitsor copying to VGA’s video memory). The game can optionally support hardware acceleration of graphics as well (and can even use such acceleration by default when the game detects its availability). - Music: Music is in Standard MIDI files (SMF) only. The General MIDI System level 1 should be followed for such files.14
Classic Graphics in Scope
This specification for “classic graphics”15 in modern games largely reflects the graphics limitations of—
- consumer PCs (personal computers) released in the mid- to late 1990s,
- home computers released before 1995,
- game consoles (handheld and for TVs) released before 2000,
- arcade machines with similar performance to machines described earlier, and
- the Game Boy Advance and Nintendo DS, both of which were released after 2000 but have relatively meager graphics ability.
In addition, video-game graphics for personal digital assistants, graphical calculators, and cellular phones (generally those released before 2007) are within the spirit of this specification, up to the performance of consumer PCs released before 2000.16
Some video game hardware from the late 1990s may have 3-D graphics capabilities beyond what is “classic” here, such as SEGA Model 3 (1996), SEGA NAOMI (1998), or NVIDIA GeForce 256 (late 1999).
In general, PC applications that feature classic graphics include:
- Windows applications written for DirectX versions earlier than 7 and using Direct3D or DirectDraw for graphics.
- Windows games using GDI or WinG for graphics and supporting Windows 98 or earlier. Examples are Chip’s Challenge for Windows (1992) and Brian Goble’s The Adventures of MicroMan (1993).
- Games for MS-DOS or PC-9801 that were published before 2000. Examples are Quake (1996), WarCraft (1994), and the first titles of the Touhou Project series (1997-1998).
- Games using OpenGL 1.2 or earlier for graphics.
- So-called “multimedia titles” from the 1990s, or applications resembling interactive versions of books (generally reference and other nonfiction works), complete with sound, animation, and video. See the Authoring Guide that came with Microsoft’s Multimedia Development Kit.
One of the following games can be considered an upper limit to what is considered “classic graphics” in this specification.
- Quake III Arena (December 1999), which required DirectX 7 and at least 64 million bytes of memory.
- Falcon 4.0 (1998).
Optional Limits
A game may impose further constraints to this specification (for example, to reduce the maximum number of 3-D triangles, to disallow 3-D graphics, to reduce the number of colors per tile allowed, or to reduce to a limited set the colors ultimately displayed on screen). I would be interested in knowing about these limitations that a new game that adopts this document decides to impose.
Examples of optional constraints are the following:
- The game displays no more than 16 colors at a time.17
- The game is limited to the 16 colors of the so-called VGA palette.
- In the 8-bit-per-component color format, this palette’s colors are: light gray, that is, (192, 192, 192); or each color component is 0 or 255; or each color component is 0 or 128.
- In the vertex color format, the closest colors to this palette are: 24/24/24; or each color component is 0 or 16; or each color component is 0 or 31.
- The game displays no more than 256 colors at a time.18
- All game files can be packaged in a ZIP file or Win32 program file that takes no more than—
- 1,457,664 bytes (the capacity of a file-allocation-table (FAT) formatted high-density 3.5-inch floppy disk), or
- 1,213,952 bytes (the capacity of a FAT formatted high-density 5.25-inch floppy disk), or
- 730,112 bytes (the capacity of a FAT formatted normal-density 3.5-inch floppy disk), or
- 362,496 bytes (the capacity of a FAT formatted double-density 5.25-inch floppy disk), or
- 65,536 bytes,19 or
- 681 million bytes (slightly less than the maximum capacity of a formatted CD-ROM).
- The game uses no more than 16 million bytes of system memory at a time.
- The game uses no more than 655,360 bytes of system memory (plus 262,144 bytes of additional memory for graphics use only) at a time.20
- The game is a Win32 application compatible with Windows XP.
- The game is a Win32 application compatible with Windows 98.
- The game aims for a rate of 30 frames per second.
- The game’s graphics must be rendered in software.
- The game’s graphics rendering employs only 32-bit and smaller integers and fixed-point arithmetic.21
- The game renders only one-unit-thick white line segments on a black background (or vice versa), and displays no more than 320 of those segments at a time.
Notes on Specification
This section has notes on this specification, such as how its requirements correspond to the graphics abilities of pre-2000 video games.
Screen resolutions
-
Screen resolutions larger than 307,200 total pixels (such as 800 × 600) are not within the spirit of this challenge, even though more demanding games in the late 1990s, as well as the PC 98 System Design Guide (1997), aimed for the 800 × 600 resolution or higher for 3-D graphics.
-
Screen resolutions that have been used in classic games include:22
- Video graphics array (VGA) display modes: 640 × 480,23 320 × 240,24 320 × 200.25
- 4:3 aspect ratio: 640 × 480,23 512 × 384,26 400 × 300,27 320 × 240,24 256 × 192,28 160 × 120.29
- Game console aspect ratios: 640 × 448,30 320 × 224,31 256 × 224,32 256 × 240,33 240 × 160,34 160 × 144.35
- 5:4 aspect ratio:36 320 × 256,37 360 × 288.38
- Two-color graphics: 720 × 348,39 640 × 200,40 512 × 342.41
- Enhanced Graphics Adapter aspect ratio: 640 × 350.42
- 8:5 aspect ratio: 640 × 400,43 320 × 200.25
- Other: 280 × 192,44 480 × 272,45 512 × 424, 46 400 × 240,47 384 × 224,48 160 × 200,49 480 × 240.50
This is not a complete list. Arcade machines of the 1990s tended to vary greatly in their screen resolutions, and some game consoles, such as the SEGA Saturn or Nintendo 64, allowed games to alter the screen resolution during gameplay.
-
As of early 1997, “[s]urveys indicate[d] that the great majority of [PC] users operate[d] in 640[ × ]480 resolution with 256 colors”.51
-
A game can support—
- multiple sizes for the area of the screen where the game’s action is drawn, or
- pixel-column or -row doubling as a “quality” setting,
or both features, without changing the size of the game’s image. For example, the original Doom (1993) supported several sizes of this kind (on PC, they were 96 × 48, 128 × 64, 160 × 80, and so on up to 288 × 144, as well as 320 × 168 and 320 × 200) and optional pixel-column doubling.52
-
Games within the scope of this challenge are meant to be run in a desktop window if the player’s display is 800 × 600 pixels or larger. The same is true if the game’s resolution is 620 × 420 or smaller and the player’s display is 640 × 480. The game may also support full-screen display.
Frame rate
-
No particular frame rate is required.53
-
Modern games implementing this specification can choose to target a frame rate typical of today, such as 30, 40, or 60 frames per second.
-
Game consoles for TVs were designed for how often TVs can draw their image (nearly 60 frames per second for NTSC54 and 50 for PAL55).
-
Doom (1993) operated at 35 frames per second but could not be run at that rate (under default settings) by typical PCs of the time.52
-
For comfort reasons, a minimum frame rate may be required for video games that offer “3-D vision” by rendering multiple views of the scene at a time, in conjunction with special glasses (for example, a SEGA Master System accessory) or a virtual-reality headset (for example, Nintendo’s Virtual Boy). But such games were rare before 2000.
3-D graphics
- The PC 99 System Design Guide sections 14.27 to 14.34 gives guidelines on 3-D graphics support in PCs launched in 1999. This challenge recommends the writing of software that performs as well as hardware meeting such guidelines, except for the screen resolution, frame rate, and double buffering requirements.
- An application may choose to support stencil buffers, bump mapping, environment mapping, and three- or four-texture blending, but these are borderline pre-2000 graphics capabilities.
- For years earlier than 1999, some of the 3-D capabilities mentioned in the specification (such as texture blending) might not be typical.
- This specification allows for:
- Prerendered graphics (as in Space Quest 5, Myst, or the original Final Fantasy VII on PlayStation), to simulate showing highly detailed imagery.
- Drawing a 3-D graphic as a voxel mesh (formed from point samples in 3-D, rather than 2-D, called voxels), as long as the triangle limits are respected.
- The following are not within the spirit of this challenge:
- Displaying more than 20,000 triangles at a time (per frame), even for higher screen resolutions. Most 3-D video games before 2000 displayed well fewer than that, but there may be exceptions, such as arcade games for the SEGA Model 3.
- Phong shading (per-pixel specular highlighting), ray-traced graphics, and path-traced graphics, which were too slow for real-time graphics in the 20th century.
- It wasn’t until 1995 that 3-D video cards became widely available for consumer PCs.56 In 3-D video games for PCs “[i]n 1995/1996, it was not uncommon to have 30-50% of the game screen filled with polygons without textures” (according to an article that compared Havoc [1995] with Mortal Kombat 4 [1997]).
- This specification is not centered on video games that offer “3-D vision” (see note under “Frame rate”), given how rare they were before 2000.
Screen image effects (filters)
- Effects that modify the game screen image to emulate CRT displays57 are outside the scope of this challenge. So are effects that scale the game screen to fit the height or width of the player’s display.58 This specification assumes those effects are not in place. A game can have those effects if it wishes, but they should be in-game settings.
Sounds
- Besides the limitation on music, this specification has no further limitations on sounds.
- Early game consoles supported sound only through one or more programmable sound generators, such as square and triangle wave generators, as opposed to digitized sounds59. Games that choose to constrain file size may wish to implement software versions of programmable sound generators for at least some of their sounds.
- When digitized sounds are supported in classic games, they typically have a sample rate of 8000, 11,025, 22,050, or 44,100 Hz, are either mono or stereo, and take 8 or 16 bits per sample.60
Memory
- This specification does not impose a limit on graphics memory use (akin to the video memory, or VRAM, of a video card). One suggested example, given in kibibytes of graphics memory, is the screen width times screen height divided by 24, which is slightly less than 13.2 million bytes for 640 × 480 resolution. (A kibibyte is 1024 bytes.) Imposing a limit on graphics memory use does not limit the size or number of textures, 3-D models, or other graphics files a game can have.61
- According to “Typical PCs Each Year”, the following ranges of system memory were typical for PCs sold in the specified years:62
Seeking Comments
As with the rest of this open-source article, comments on this specification are welcome. But most useful would be comments that improve or refine the specification to fit the graphics abilities of pre-2000 video games.
Examples are comments that give measurements (or references to other works that make such measurements) on the graphics capabilities (for example, polygons shown each frame, average frame rate, memory use, sprite count, etc.) actually achieved by video games released in 1999 and earlier (or released in, say, 1994 or earlier) for home computers or game consoles. (I repeat: measurements, not inferences or guesses from screenshots or videos.)
This includes statements like the following, with references or measurements:
- “Game X shows up to Y polygons at a time at Z frames per second and screen resolution W”.66
- “Scenes in game X have Y triangles on average”.
- “Game X shows no more than [16 or 256] simultaneous colors”.
- “Game X uses Y bytes of memory while running on Windows 98”.
- “Game X shows up to Y sprites at a time [at screen resolution Z]” (for 2-D games such as those built using the tool Director, then by Macromedia).
- The 2-D game X, from year Y, supports a given 2-D graphics capability (for example, 2-D rotations of sprites; filling ellipses with a solid color; flood filling; antialiasing of lines and shapes; translucent alpha blending; translucent sprites).
- The 3-D game X, from year Y, supports a given 3-D graphics capability (for example, texture mapping, Gouraud shading, bump mapping, edge antialiasing, alpha blending, texturing of most polygons in a scene, or MIP mapping).
(Those statements will also help me define constraints for video games up to an earlier year than 1999.)
Statements like the following are also useful, with references:
- “In year X [1999 or earlier], Y% of PC users used screen resolution Z”.
- In year X, a given 3-D graphics capability became typical in 3-D video games.
- In year X, a given 2-D graphics capability became typical in 2-D video games.
- “In year X [1999 or earlier], Y% of home computers in use were equipped with Z million bytes of memory”.
- “In year X, Y% of home PCs were equipped with 3-D video cards”.
- A market-share-weighted average of system memory requirements of video games in year X.
- On a market-share-weighted basis, X% of video games in year Y—
- ran on [16 or 256]-color display modes, or
- were 3-D video games, or
- were played on arcade machines, or
- were played on PCs, or
- were played on game console Z.
By contrast, statements like the following are not very useful, since they often don’t relate to the actual performance of specific video games:
- “Game console X can process up to Y triangles per second”.
- “Video card X can render up to Y polygons per frame”.
- “Video card X can render up to Y pixels per second”.
- “Game X renders Y triangles per second”, without stating the frame rate or the resolution.
- “Game X issues Y draw calls per frame”, since a single draw call can draw one triangle or tens of thousands.screen
- “Character models in game X average Y triangles”.
The following are examples of the kind of statements desired:
- Actua Soccer (VR Soccer ‘96) (1995) averaged 776 triangles per frame at 640 × 480 resolution.
- Terminal Velocity (1995) averaged 498 triangles per frame at 640 × 480 resolution.
- A benchmark of Quake III Arena averaged about 3,250 and topped out at about 6,970 triangles per frame after back-face culling, at screen resolution 640 × 480 (Antochi et al. 2003)67, (Antochi et al. 2004)68.
Further Reading
- Abrash, M., Michael Abrash’s Graphics Programming Black Book: Special Edition, 1997.
- (Akenine-)Möller, T., Haines, E., Real-Time Rendering (first edition), 1999.
- Donnelly, P., “Moving Your Game to Windows, Part III: Sound, Graphics, Installation, and Documentation”, Microsoft Developer Network, Nov. 25, 1996.
- Lamothe, A., Black Art of 3D Game Programming, Waite Group Press, 1995.
- Lamothe, A., Tricks of the 3D Game Programming Gurus: Advanced 3D Graphics and Rasterization, Sams, 2003. Published after 1999, but most of the 3-D capabilities discussed there are within the spirit of this specification.
- Lamothe, A., Tricks of the Windows Game Programming Gurus, Sams, 1999.
- Roca, Jordi, et al., “Workload Characterization of 3D Games”, 2006 IEEE International Symposium on Workload Characterization. IEEE, 2006. Study on measuring certain features of 3-D games that are of interest in this specification, including triangles per frame. See the
attila-simrepository. - Rodent, H., “Animation in Win32”, Microsoft Developer Network, Feb. 1, 1994.
- Thompson, N., Animation Techniques in Win32, Microsoft Press, 1995.
Building a Public-Domain music synthesis library and instrument banks
To improve support for MIDI (Musical Instrument Digital Interface) music playback in open-source and other applications, I challenge the community to write the following items, all of which must be released to the public domain or under the Unlicense.
- A cross-platform open-source library for software synthesis (translation into digitized sound) of MIDI data stored in standard MIDI files (SMF, .mid), using instrument sound banks (synthesizer banks) in SoundFont 2 (.sf2), Downloadable Sounds (.dls), and in OPL2, OPL3, and other FM synthesis sound banks, and possibly also in Timidity++/UltraSound patch format (.cfg, .pat). (Similar to Fluidsynth, but in the public domain or under the Unlicense. Instrument sound banks are files that describe how to render MIDI instruments as sound. In addition, the source code in the nonpublic-domain foo_midi, libADLMIDI, libOPNMIDI, OPL3BankEditor, and SpessaSynth may be useful here, but review their licenses first.)
- The library should support popular loop-point conventions found in MIDI files.
- The library should support seeking of MIDI files such that a pause and resume function can be offered by a media player.
- An instrument sound bank for wave-table synthesis of all instruments and percussive (drum) noises in the General MIDI System level 1 specification.
- Instruments should correspond as closely as possible to those in that specification, but should be small in file size or be algorithmically generated.
- Instruments can be generated using the public-domain single-cycle wave forms found in the AdventureKid Wave Form collection, found at: AKWF-FREE.
- The samples for each instrument may, but need not, be generated by an algorithm, such as one that renders the instrument’s tone in the frequency domain. An example of this is found in
com.sun.media.sound.EmergencySoundbank, which however is licensed under the GNU General Public License version 2 rather than public domain. - The instrument sound bank should be in either SoundFont 2 (.sf2) or Downloadable Sounds (.dls) format. See next section on a challenge to writing a guide on sound bank development.
- The volume of all instruments in the sound bank should be normalized; some instruments should not sound louder than others.
- An instrument sound bank for FM synthesis of all instruments and percussive noises in the General MIDI System level 1 specification. Instruments should correspond as closely as possible to those in that specification.
Other Challenges and Projects
Other challenges and projects I make to the computer community.
Classic desktop wallpaper
See the “peteroupc/classic-wallpaper” repository for a challenge on creating tileable desktop wallpapers with a limited selection of colors and limited dimensions in pixels — such wallpapers are getting ever harder to find because desktop backgrounds today tend to cover the full computer screen, to employ thousands of colors, and to have a high-definition resolution (1920 × 1080 or larger).
Button and border styles for classic interfaces
See “Traditional User-Interface Graphics” for a challenge on writing computer code (released to the public domain or under the Unlicense) to draw button and border styles for classic graphical user interfaces.
Sound bank development guide
Write an open-source and detailed guide on using free-of-cost software to produce decent-quality instrument banks from the recordings of real musical instruments (rather than copying or converting other instrument banks or recording from commercial synthesizers). See the section on building instrument banks, earlier. For this purpose, a sound bank in SoundFont 2 or Downloadable Sounds format that is of decent quality is about 4 million bytes in size.
Guide for creating 3-D models in the pre-2000 style
Develop a guide for creating 3-D models for use in modern video games that follow the specification given earlier on classic (pre-2000) 3-D graphics, in a similar vein to “Game-Ready 3D Models: Requirements, Creation, and Export” (which was designed for high-system-resource games from 2024 or so). Notably, no shader-based techniques should be required for any such models, and advice should apply to models for a game just as though the game were developed in 1999 (or an earlier year) rather than today, but the use of modern creation tools is allowed. (For example, instead of normal, roughness, or ambient-occlusion maps, late-1990s 3-D game models typically employed light maps and bump maps, and such models were generally much coarser than today’s models.)
License
Any copyright to this page is released to the Public Domain. In case this is not possible, this page is also licensed under Creative Commons Zero.
Notes
-
A computer has adequate performance for classic graphics if it achieves a score of—
(a) 3108 or more 3D marks on the 3DMark2000 benchmark (640 × 480) when run without graphics acceleration, or
(b) 195 or greater on the 3DMark2000 CPU speed test.
Both figures correspond to the running of two graphically demanding 3-D demos, at three levels of detail each, at 60 frames per second (adjusted downward as needed if a demo’s detail level averages more than 12,800 triangles per frame; see the section “Test Descriptions” in the 3DMark2000 help).
The games this challenge encourages are those with very low resource requirements, namely those that can run with acceptable performance even on very low-end computers, say, those that date from 2010 or earlier or support Windows 7, Windows XP, or an even older operating system. In this sense, even though today’s Unity and Unreal game engines can allow the making of games with “classic graphics”, they are far from lightweight and their use is not within the spirit of this challenge. ↩ -
The following are examples of a graphics library that follows the spirit, even if not the letter, of this specification: Tilengine, kit, DOS-like, raylib’s
rlswsoftware renderer. Michal Strehovský published an interesting technique to create small game applications, and so did Jani Peltonen.
I offer a template for Win32 applications that supports 8- and 24-bit-per-pixel game images and paints finished game images usingStretchDIBits. ↩ -
One editor specialized for creating classic 3-D models is the open-source tool Blockbench. For classic 3-D scenes, there is the open-source tool Trenchbroom. ↩
-
This is also known as visible primitives or visible primitives per frame; in the case of polygons or triangles, this is also called visible polygons (per frame) or visible triangles (per frame). ↩
-
If there is interest, this format may instead be: The red and blue components occupy 5 bits each; the green component, 6 bits. ↩
-
Quake (1996) also employed subdivision rasterization for drawing small and relatively distant triangles whose vertices are rounded to integers, an algorithm likewise in scope here (Abrash (1997), chapter 69). ↩
-
Antialiasing “didn’t appear in home console graphics architectures until the debut of the [Nintendo 64] in late 1996”. Tricks of the Mac Game Programming Gurus (1995) considers antialiasing among the features “unlikely” to be needed in game programming ↩
-
Perspective correction accounts for distance from the viewer: closer objects appear larger. The lack of perspective correction (as in what is called affine texture mapping), together with the lack of smoothing (antialiasing) of edges, contributed to the characteristic distortion and instability of 3-D graphics in many PlayStation (One) games. ↩
-
It is being considered whether to replace these 2-D limits with one of the following alternatives:
1. Instead of tiles, sprites, and layers, the game uses a frame buffer (array of color samples, called pixels, in computer memory) with no more than 8 bits per pixel (no more than 256 simultaneous colors) and all graphics in the game must be rendered in software. But I don’t know of a way to describe further restrictions useful for game programming in the mid- to late 1990s style.
2. The 2-D limits in the specification apply, but instead of replacing a 2-D layer, the 3-D layer is simply a special sprite that covers the game screen (the usual size limits for sprites don’t apply) and can have transparent and translucent pixels.
3. Same as (2), but in addition, there are no tiles or 2-D layers (all the graphics are sprites).
The tile-based limits in this specification also suit games that support only text display, and thus have graphics that resemble the text modes (as opposed to graphics modes) found in PCs and computer terminals. ↩ -
Translucent pixels enable alpha blending techniques (the mixing of one image with another). But alpha blending was “relatively new to PC games” at the time of Quake’s release in 1996, according to Abrash (1997), and is practically not discussed at all in Tricks of the Mac Game Programming Gurus (1995). Only images with opaque and/or transparent pixels tended to be supported in early-1990s video games. ↩
-
SEGA arcade machines from the 1980s and earlier had rudimentary systems for scaling (stretching or shrinking) sprites horizontally and vertically. In the Super Famicom/Super Nintendo Entertainment System (1990), sprites could not be scaled, but they could be flipped. ↩
-
Tile- and sprite-based graphics were in place largely because they saved memory; they were popularized by the arcade game Galaxian. Indeed, this system, present in the Nintendo DS and many earlier game consoles, was abandoned in the Nintendo 3DS in favor of a frame buffer.
Game consoles employing tile-based graphics tended to limit not only the number of sprites per frame, but also the number of sprites per row of pixels, but a per-row limit is not adopted here. As for the per-frame limit, the Famicom/Nintendo Entertainment System (1983), SEGA Master System/SEGA Mark III (1985), and PC Engine/TurboGrafx 16 (1987) had a limit of 64 sprites; the Game Boy (1989), 40; the SEGA Mega Drive/Genesis (1988), 80; the Super Famicom/Super Nintendo Entertainment System (1990), 128; and the relatively expensive Neo Geo (1990), 381. ↩ -
If the game screen image uses two colors only (such as black and white), the game could choose to allow it to have up to 800,000 total pixels. For example, a 1024 × 768 display has 786,432 total pixels. However, two-color graphical display modes larger than 307,200 total pixels are probably rare among consumers. The modern game Return of the Obra Dinn employs a two-color 800 × 450 display (378,000 total pixels).
In the Godot engine, the screen resolution corresponds to the “Viewport Width” (window/size/viewport_width) and “Viewport Height” (window/size/viewport_height) project settings. For the Unity engine, there is advice from 2019 relating to the graphics style in “8-bit” and “16-bit” game consoles. In Unreal Engine, the screen resolution apparently corresponds toResolutionSizeXandResolutionSizeY. But a lighter-weight graphics engine than Unity, Unreal, or even Godot would better suit the spirit of this specification. ↩ -
Standard MIDI files should be played back using a cross-platform open-source software synthesizer (see section “Building a Public-Domain music synthesis library and instrument banks”), using either FM or wave-table synthesis; most modern PCs no longer come with hardware synthesizers. I note that it’s possible to write an FM software synthesizer supporting every MIDI instrument in less than 1024 kibibytes of code.
Standard MIDI files organize MIDI commands into up to 16 channels, each occupied by at most one “instrument” at a time. Under the Multimedia PC Specification (1992), the first ten channels were intended for high-end synthesizers (where the tenth is percussion); the thirteenth through sixteenth, for low-end ones (sixteenth is percussion), and the nonpercussion channels were arranged in decreasing order of importance. This convention was abandoned with the rise in support for the General MIDI System level 1 (see Q141087, “DOCERR: MarkMIDI Utility Not Provided in Win32 SDK”, in the Microsoft Knowledge Base): now all 16 channels are supported (with only the tenth for percussion) and need not be arranged by importance. ↩ -
Matt Saettler, “Graphics Design and Optimization”, Multimedia Technical Note (Microsoft), 1992, contains a rich discussion of graphics used in computer games and other audiovisual computer applications up to 1992. Not mentioned in that document are graphics resembling:
(1) Segmented liquid crystal displays, of the kind found in Nintendo’s Game & Watch and many Tiger Electronics handheld games. These are simple to emulate, though: design a screen-size image that assigns each segment a unique color and, each frame, draw black where where the segments that are “on” are, and draw white (or another background) elsewhere on the screen.
(2) Vacuum fluorescent displays, notable in user interfaces of some media player applications that resemble a “stereo rack system”. ↩ -
Examples are the Sharp MI-Zaurus (2000) and the many cellular phones that came with Java 2 Micro Edition (J2ME). ↩
-
An example is Loom (1990). ↩
-
This was recommended for Macintosh games in J. McCornack et al., Tricks of the Mac Game Programming Gurus (Hayden Books, 1995), notably because 8-bit-per-pixel images transfer faster and save memory over images with more bits per pixel; see also chapter 70 of Abrash (1997) (dealing with the porting of an 8-bit-per-pixel game to a 16-bit-per-pixel video card). ↩
-
Popular file size limit of so-called “64K intros”. ↩
-
MS-DOS applications are normally limited to 640 kibibytes or less of conventional memory, along with whatever memory is carried by the video card. (PCs running on the very early Intel 8086 and 8088 processors can map out no more than 640 kibibytes of system memory.) 262,144 bytes is the usual minimum of graphics memory for VGA video cards. ↩
-
It wasn’t until the Pentium processor’s advent that floating-point arithmetic was embraced in 3-D game programming: for example, see chapter 63 of Abrash (1997). ↩
-
In addition to the resolutions shown here, there are modern games that employ low resolutions with the same 16:9 aspect ratio as high-definition displays. These include 640 × 360 (Blasphemous); 400 × 225 (Unsighted); 480 × 270 (Enter the Gungeon); 320 × 180 (Celeste). ↩
-
PlayStation (One); Nintendo 3DS lower screen; larger VGA “mode X” (256 colors). ↩ ↩2
-
Commodore 64; NEC PC-8001; VGA mode 13h (256 colors), especially seen in MS-DOS games; Color/Graphics Adapter (CGA) 4-color mode; Atari ST 16-color mode; Amiga NTSC. ↩ ↩2
-
One commonly supported “super-VGA” mode, especially in mid-1990s gaming, and which was also recommended by the PC 98 System Design Guide. ↩
-
One low resolution recommended by the PC 98 System Design Guide. ↩
-
Nintendo DS; NEC PC-6001; SEGA Master System/SEGA Mark III; MSX; Colecovision. ↩
-
Rarely used VGA display mode. ↩
-
PlayStation 2 NTSC. ↩
-
SEGA Mega Drive/SEGA Genesis; Neo Geo NTSC. ↩
-
Effective resolution of Famicom/Nintendo Entertainment System NTSC; Super Famicom/Super Nintendo Entertainment System NTSC; minimum resolution of PC Engine/TurboGrafx 16. ↩
-
Nintendo Entertainment System PAL; Super Nintendo Entertainment System PAL. ↩
-
Game Boy Advance. ↩
-
Game Boy, Game Boy Color, SEGA Game Gear. ↩
-
Aspect ratio found above all in PAL (phase-alternating-line) displays. The resolution 640 × 512 (PlayStation 2 PAL), included in this category, covers more than 307,200 total pixels. ↩
-
Amiga PAL (same pixel spacing horizontally as vertically); Neo Geo PAL. ↩
-
PAL overscan. ↩
-
Hercules Graphics Card two-color. ↩
-
Color/Graphics Adapter (CGA) two-color; NEC PC-8801 8-color mode; Atari ST 4-color mode. ↩
-
12-inch classic Macintosh. ↩
-
16 colors. ↩
-
NEC PC-9801 8-color mode; Atari ST two-color. ↩
-
Apple II. ↩
-
PlayStation Portable. ↩
-
MSX 2. ↩
-
Effective resolution of Nintendo 3DS upper screen without parallax effect. ↩
-
Virtual Boy. ↩
-
One “Tandy graphics adapter” mode. ↩
-
Minimum resolution for “handheld PCs” (Windows CE Programmer’s Guide, MSDN Library, June 1998). ↩
-
S. Pruitt, “Frequently Asked Questions About HTML Coding for Internet Explorer 3.0”, updated Jan. 30, 1997. ↩
-
Until the early 1990s, the number of color samples (pixels) an application can transfer per second was usually small, limiting the supported size and frame rate for arbitrary video content. Indeed, for example, the Multimedia PC Specification (1992) recommended that video cards be able to transfer up to 8-bit-per-sample graphics at a rate of 140,000 samples per second or faster given 40 percent of CPU bandwidth. The Multimedia PC level 2 specification (1993) upped this recommendation to 1.2 million samples per second (sufficient for 320 × 240 video at 15 frames per second, the recommendation in article Q139826, “AVI Video Authoring Tips & Compression Options Dialog Box”, 1995). For details on these specifications, see article Q106055 in the Microsoft Knowledge Base. Both recommendations are far from the 6.144 million samples per second needed to display 640 × 480 video smoothly at 20 frames per second. ↩
-
Stands for the National Television Standards Committee of the Electronics Industries Association. “NTSC” often refers to the video standard known as RS-170A. ↩
-
Stands for phase alternating line. ↩
-
By contrast, 3-D video cards have been offered for professional-use computers since the mid-1980s; the first such cards for PCs that supported real-time display were introduced in 1988. ↩
-
CRT displays, or cathode-ray-tube displays, were the typical kind of computer monitors and TVs in the 1980s and 1990s. ↩
-
Effects to scale the game screen include so-called “pixel-art scaling algorithms” such as
HQXand2xSaI, as well as bilinear or point filtering.
Effects to scale the game screen do not include the decoding of small videos to fit the game screen, as opposed to the player’s display. It was common for 1990s games to have videos smaller than the game screen and to scale those videos to fit the game screen “on the fly”, in the process of displaying them. For example, such a game could decode videos of size 160x100 to fit a game screen of 320 × 200. (See, for instance, Nigel Thompson, “Stretching 256-Color Images Using Interpolation”, Microsoft Developer Network, March 7, 1995.) ↩ -
Sound today is most commonly digitized by pulse-code modulation (PCM), and PCM-digitized sound is often stored in computer files ending in “.WAV”. ↩
-
The Multimedia PC Specification (1992) required support in “multimedia PCs” for playback of at least 8-bit-per-sample mono digitized sound at 11,025 and 22,050 Hz. The Multimedia PC level 2 specification (1993) required support in “multimedia PCs” for playing back at least 16-bit-per-sample stereo digitized sound at 44,100 Hz. ↩
-
PC games released in 1999 tended to require 32 million bytes of system memory. Meanwhile, Quake (1996) required 8 million and recommended 16 million bytes of system memory. ↩
-
“MB” is ambiguous here; it often means either one million bytes or 1024 times 1024 bytes. ↩
-
“Typical PCs in 1994”, https://www.dosdays.co.uk/topics/1994.php. ↩
-
“Typical PCs in 1997”, https://www.dosdays.co.uk/topics/1997.php. ↩
-
“Typical PCs in 1998”, https://www.dosdays.co.uk/topics/1998.php. ↩
-
Statements like this that relate to polygons or triangles per frame are hard to find and often anecdotal, and they cannot always be inferred from screenshots or videos of gameplay. For example:
(1) “A typical scene in a current [PC] application has 2000 to 2500 triangles per frame” (R. Fosner, “DirectX 6.0 Goes Ballistic With Multiple New Features And Much Faster Code”, Microsoft Systems Journal January 1999).
(2) “For context, Quake on a Pentium Pro pumped out maybe 100K triangles/second (tris/sec.) … at best” (M. Abrash, “Inside Xbox Graphics”, Dr. Dobb’s Journal, August 2000); to be noted here is that the game normally ran at a screen resolution of 320 × 240.
(3) According to the help for the 3DMark2000 benchmark, that benchmark comes with two game scenes that average up to 9,400 polygons in low detail and up to 55,000 in high detail.
(4) The game engine for SpecOps: Rangers Lead the Way (1998) targeted 10,000 triangles per frame (“Postmortem: Zombie’s SpecOps: Rangers Lead the Way“, Jan. 31, 2000). So did Quake III Arena (1999) (John Carmack .plan, Sep. 2, 1999). ↩ -
Antochi, Iosif, et al. “3D Graphics Benchmarks for Low-Power Architectures.” 14th Annual Workshop on Circuits, Systems and Signal Processing. 2003. ↩
-
Antochi, Iosif, et al., “GraalBench: a 3D graphics benchmark suite for mobile phones”, ACM SIGPLAN Notices 39(7), 2004. ↩