abrash-black-book/64-01.md
2013-12-30 20:26:41 +11:00

102 lines
7.2 KiB
Markdown

Chapter 64\
Quake's Visible-Surface Determination {#Heading1}
--------------------------------------
### The Challenge of Separating All Things Seen from All Things Unseen {#Heading2}
Years ago, I was working at Video Seven, a now-vanished video adapter
manufacturer, helping to develop a VGA clone. The fellow who was
designing Video Seven's VGA chip, Tom Wilson, had worked around the
clock for months to make his VGA run as fast as possible, and was
confident he had pretty much maxed out its performance. As Tom was
putting the finishing touches on his chip design, however, news came
fourth-hand that a competitor, Paradise, had juiced up the performance
of the clone they were developing by putting in a FIFO.
That was all he knew; there was no information about what sort of FIFO,
or how much it helped, or anything else. Nonetheless, Tom, normally an
affable, laid-back sort, took on the wide-awake, haunted look of a man
with too much caffeine in him and no answers to show for it, as he tried
to figure out, from hopelessly thin information, what Paradise had done.
Finally, he concluded that Paradise must have put a write FIFO between
the system bus and the VGA, so that when the CPU wrote to video memory,
the write immediately went into the FIFO, allowing the CPU to keep on
processing instead of stalling each time it wrote to display memory.
Tom couldn't spare the gates or the time to do a full FIFO, but he could
implement a one-deep FIFO, allowing the CPU to get one write ahead of
the VGA. He wasn't sure how well it would work, but it was all he could
do, so he put it in and taped out the chip.
The one-deep FIFO turned out to work astonishingly well; for a time,
Video Seven's VGAs were the fastest around, a testament to Tom's
ingenuity and creativity under pressure. However, the truly remarkable
part of this story is that Paradise's FIFO design turned out to bear not
the slightest resemblance to Tom's, and *didn't work as well.* Paradise
had stuck a *read* FIFO between display memory and the video output
stage of the VGA, allowing the video output to read ahead, so that when
the CPU wanted to access display memory, pixels could come from the FIFO
while the CPU was serviced immediately. That did indeed help
performance—but not as much as Tom's write FIFO.
------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
![](images/i.jpg) *What we have here is as neat a parable about the nature of creative design as one could hope to find. The scrap of news about Paradise's chip contained almost no actual information, but it forced Tom to push past the limits he had unconsciously set in coming up with his original design. And, in the end, I think that the single most important element of great design, whether it be hardware, software, or any creative endeavor, is precisely what the Paradise news triggered in Tom: the ability to detect the limits you have built into the way you think about your design, and then transcend those limits.*
------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The problem, of course, is how to go about transcending limits you don't
even know you've imposed. There's no formula for success, but two
principles can stand you in good stead: simplify and keep on trying new
things.
Generally, if you find your code getting more complex, you're
fine-tuning a frozen design, and it's likely you can get more of a
speed-up, with less code, by rethinking the design. A really good design
should bring with it a moment of immense satisfaction in which
everything falls into place, and you're amazed at how little code is
needed and how all the boundary cases just work properly.
As for how to rethink the design, do it by pursuing whatever ideas occur
to you, no matter how off-the-wall they seem. Many of the truly
brilliant design ideas I've heard of over the years sounded like
nonsense at first, because they didn't fit my preconceived view of the
world. Often, such ideas are in fact off-the-wall, but just as the news
about Paradise's chip sparked Tom's imagination, aggressively pursuing
seemingly outlandish ideas can open up new design possibilities for you.
Case in point: The evolution of Quake's 3-D graphics engine.
### VSD: The Toughest 3-D Challenge of All {#Heading3}
I've spent most of my waking hours for the last several months working
on Quake, id Software's successor to DOOM, and I suspect I have a few
more months to go. The very best things don't happen easily, nor
quickly—but when they happen, all the sweat becomes worthwhile.
In terms of graphics, Quake is to DOOM as DOOM was to its predecessor,
Wolfenstein 3-D. Quake adds true, arbitrary 3-D (you can look up and
down, lean, and even fall on your side), detailed lighting and shadows,
and 3-D monsters and players in place of DOOM's sprites. Someday I hope
to talk about how all that works, but for the here and now I want to
talk about what is, in my opinion, the toughest 3-D problem of all:
visible surface determination (drawing the proper surface at each
pixel), and its close relative, culling (discarding non-visible polygons
as quickly as possible, a way of accelerating visible surface
determination). In the interests of brevity, I'll use the abbreviation
VSD to mean both visible surface determination and culling from now on.
Why do I think VSD is the toughest 3-D challenge? Although rasterization
issues such as texture mapping are fascinating and important, they are
tasks of relatively finite scope, and are being moved into hardware as
3-D accelerators appear; also, they only scale with increases in screen
resolution, which are relatively modest.
In contrast, VSD is an open-ended problem, and there are dozens of
approaches currently in use. Even more significantly, the performance of
VSD, done in an unsophisticated fashion, scales directly with scene
complexity, which tends to increase as a square or cube function, so
this very rapidly becomes the limiting factor in rendering realistic
worlds. I expect VSD to be the increasingly dominant issue in realtime
PC 3-D over the next few years, as 3-D worlds become increasingly
detailed. Already, a good-sized Quake level contains on the order of
10,000 polygons, about three times as many polygons as a comparable DOOM
level.