Adaptive tile refresh is a computer graphics technique for side-scrolling video games. It was most famously used by id Software's John Carmack in games such as Commander Keen to compensate for the poor graphics performance of PCs in the early 1990s. Its principal innovation is a novel use of several EGA hardware features to perform the scrolling in hardware. The technique is named for its other aspect, the tracking of moved graphical elements in order to minimize the amount of redrawing required in every frame. Together, the combination saves the processing time that would be otherwise required for redrawing the entire screen. Carmack designed the software engine based on a scrolling display for large images from the 1970s. Because CGA lacks features for scrolling in hardware, scrolling previously had to be done in software, by redrawing the entire screen for every frame – a task that PCs of the time lack the performance to carry out. Adaptive tile refresh minimizes the computing power required for sidescrolling games to within the reach of available hardware. This works by flagging bitmap tiles and redrawing only the graphics on the screen that actually update.
History
Adaptive tile refresh using hardware scrolling made its first appearance in an unreleased test game dubbed Dangerous Dave in Copyright Infringement. The title of "Dangerous Dave" had been previously used by John Romero while programming games for Softdisk. The new game is a recreation of the first level of Nintendo's Super Mario Bros. 3, intended as a realistic test bed for the adaptive tile refresh concept, and was developed within a week. The team of future id Software employees, still working for Softdisk, then recreated the entire Mario game, hoping that Nintendo would license the game for the PC. Nintendo declined the offer to release the game after id Software finished it. The first market appearance of Carmack's adaptive tile refresh came in id Software's first installment of the Commander Keen game series, Marooned on Mars.
Technical details
EGA has several features that enable the adaptive tile refresh effect:
The screen buffer can be slightly wider than the screen and arbitrarily high, subject to video memory limitations.
The position within this buffer from which the screen is drawn can be offset by 1 pixel increments, either horizontally or vertically.
It has enough video memory to store two such screen buffers, and still have room left over for tiles and sprites.
Carmack used these capabilities to create a buffer that is 64 pixels wider and taller than the screen, leaving room for two extra rows and columns of tiles in the buffer off the edge of the screen. He used the offset capabilities of the card to let the screen slide through the buffer for smooth scrolling, which partially reveals the extra tiles. Scrolling is limited to the buffer size, and scrolling further wraps around to show data from the other side of the buffer. So in order to scroll through an entire level, when the scrolling amounts to a whole tile's worth, Carmack's code then draws the next row of tiles from the level into the buffer, just off the edge of the screen, ready to be displayed when the scrolling continues in that direction. But since only the edges of the screen are being redrawn at any time, sprites in the level do not get redrawn until they reach the edge of the screen. To counteract this, the code calculates which tiles a moving sprite had previously covered and redraws them to erase the old sprite image, then draws the new sprite image in its new position. This allows sprites to be animated independently of the scrolling with minimal computational effort. Since moving a sprite in this way involves first erasing it and then redrawing it, the image of the erased sprite may be visible briefly, causing flicker. The final part of Carmack's technique is the use of the same EGA hardware features used for scrolling to also implement double buffering: setting up a second buffer into which the code can draw while the first buffer is being shown on screen, which is then switched out during screen refresh. This ensures that no frame is ever displayed mid-drawing, which yields smooth, flicker-free animation.