Michael Abrash on Games Programming
An anonymous reader sent in an awesome article by Michael Abrash (If you don't know, I'm not telling). Tons of great bits in there, advice, anecdotes etc. Definitely worth a read if you are
either a programmer, or a game fan.
One counter argument to the notion that violent games like Quake cause violence is that such games actually give an outlet to violent tendencies, preventing them from manifesting themselves in everyday life. If you believe that argument, you could extend it to believe that games have prevented some people from becoming serial killers, thus saving lives.
I doubt many people who write games believe either side of that. I know I don't. But it's what you asked for, an argument that games save lives.
No one needs to sell a programmer on the benefits (both personal and professional) of a job programming games (or of scientific programming). How about giving us a few urls discussing how one prepares for and ultimately lands a job developing games?
As I sit in my cubicle coding financial crap, I feel like articles like these only aim at making fun of me! Don't just talk to me about the value of freedom when I'm stuck in a prison... liberate me!
w o r l d w i d e w e b e r
This is, by far, the most salient piece of advice Michael offers. Do what you love. If you don't love what you do, or stop loving it, do something else -- fast.
... or if you don' love what you do, do something else until you find it.
I count myself lucky to have known so many of the seminal game designers "way back when." Michael, whom I met years ago when he was working with Dan Illowski's game company, is one of those folks who always seemed to be right-focused, and he inspired me to stay happy.
I count myself fortunate to be able to say that I've always loved the things I have done for a living. But that was only because of a willingness to change what I do. When game-design turned into a drag, I found the law. When that stalled, I went back to engineering for a brief time. Now I'm doing both, and loving it.
MIchael's observations will seem kitch and cliche to some -- but if you think its pointless, you are most certainly missing a very important point.
Just do something you love
When I tell people that I'm a Computer Science major, their first reaction is that I'll probably make lots of money. Regardless of the truth of that statement, it saddens me that people think of that first. Even many of my peers are in this program because they think it will be a ticket to a high paying career, even though they hate what they are doing.
So its incredibly refreshing to see an article like this. This reminds me why I chose computer science -- because I love it! Its in my blood! Call me a geek, but binary search is beautiful (log n!!). I can't stop reading about this stuff after school and on weekends.
It almost seems like Abrash really enjoyed his time with game programming, but wanted to 'do the right thing' and go into "a software field with deep structure and long-term challenges-something more significant, difficult, and ultimately rewarding." But in the end, his love for games and graphics programming won out.
Thank you for this inspiration, Mr. Abrash!
The entire Java industry is based on this assumption. Check back in 5 years or so to see whether it's correct or not.
I consider Mike Abrash my personal hero. His writing inspired me to get into graphics programming. He has a simple way of writing, and he makes it a pleasure to follow him thorough the complex concepts he writes about.
Mike's "Zen of..." books should be on any graphics programmer's bookshelf.
It's kind of sad that he now works for Microsoft, but I guess it's good for MS--if nothing else it proves that they CAN hire talented (and old-school) coders.
His tips on the second page are golden! Particularly:
Get past the abstractions and know what your code does. Profile in many ways: profilers, NULL drivers, bracketing key code with timing calls, breaking into the debugger at random and seeing where you are. If you don't do this, you're guessing.
Knowing what to optimize matters as much as knowing how to optimize. Otherwise, you'll optimize the wrong thing, and end up with really fast slow code.
He changed the way average programmers thought about hardware. For anyone who dosen't know, michael abrash espoused 100's of algorithims and assembley techniques in his books which were non-intutitive uses of the hardware and language -- but which ran dramatically faster. And he made some great games in the progress ... Doom ? :)
Free Techno/Jazz/DNB/MI Music by guys obsessed with monkeys!
> games cover a huge range of technologies-graphics, physics, modeling, scripting, AI, networking, databases-more than any other kind of software I can think of. What I finally realized was that, for me at least, game programming is the sweetest spot in all of software development.
They might be fulfilling to the programmer, but that does not necessarily mean that games programming is the highest form of programming. Don't get me wrong, I like a Quake deathmatch with the rest of the office as much as the next guy, but to say that games programming somehow transcends other software is wrong.
Surely it's much more fulfilling to say that you created the software that runs a hospital which saves people lives, or that we sent man to the moon on one of your programs. Compared with these games seem just a little trivial.
I'm a game developer working on the Open Source Genesis3D game engine for a new version coming out.
It has always been my dream to do some type of programming that was constantly a challenge as I tend to become bored very easily. There is always some challenge to game programming as you do your best at something then have to do even better next time around. You are constantly trying to out perform the best out there and constantly pushing the computer to it's limits with the latest games.
It can be a great field to be in but getting in is the difficult part as along the way you are viewed as a game programming wannabe and most people don't even make it over the "write a simple game" hurdle. Even after getting into the area you have to prove your worth against others at or possibly above your level of knowledge. Reading a ton of tutorials doesn't always help as you have to break away from the tutorials sometime and take your own steps out in doing a game or an area of a game. Alot of people fall down at this point too and never get back up because they decide it is too hard and don't really understand what is going on so they continue on the tutorial path or just quit all together. For those that break away from tutorials and understand what is really going on to make the game run can great some good games. From there it is a matter of finding a game company to take you in. Of course you would want to get into a company that is constantly using the latest things and this isn't always easy either.
The road is long but can be very enjoyable for those that have the patience, always want a challenge, and have fun with their job.
I have no idea if I explained that like I wanted to. But I know what I meant.
www.HearMySoulSpeak.com
fluffluffflufflufffluffluffflufflufffluffluff
I completely agree. The near-last bullet about using your right brain: "go wild, listen to that little voice inside" made me cringe. It was like some Oprah Winfrey moment, or a page from one of those little "Life's Little Book of Quotes" crap that they sell near the cash registers at bookstores.
---
https://www.accountkiller.com/removal-requested
There's a similar sentiment in the hacker community I have witnessed in open source projects. I've participated in a few, and I inevitably get blank stares when I ask for an SRS or architecture document so my components blend well and extend the current structure elegantly. Nevermind when I ask where in the source tree to drop my UML diagrams. I just ask that for kicks nowadays :)
In the business world, no one gets paid to write code. We get paid to ship software, and I've found that regardless of their attitude coming into the project, everyone is delighted when we ship a solid product on time and within budget. It's so rare a thing in this industry that coders get simply giddy at the thought of telling their friends they actually did it.
From my experience, a realistic estimation and budgeting system and thorough engineering process is the number one most effective perk in terms of retaining happy programmers.
-- ShadyG
Nerd Rock In Progress
He says, "games are pushing the envelope harder than almost any other kind of software-what else does a consumer need a 700 MHz machine with a high-end 3D accelerator for?" This pretty much sums up the motivation of the 'Average Consumer' in picking out a PC, and supports my belief that PC users play games on their 1 GHz PC's and Mac users do work on theirs -- It's also why PC users constantly whine about the 'high prices' of Macs -- if I weren't making my money back one-hundred-fold on my hardware investment, I'd bitch about it too. Just something to think about. BTW I use six computers, and they run everything from OS9 - OSX - MS95 & Linux so I'm not partial -- well actually I am ;)
We apologise for the fault in this post. Those responsible have been sacked. -- Signed RICHARD M. NIXON
You have to be comfortable in the basics at least. Actually, to do well in any area of computer science, you have to be generally good at math, not necessarily a master, but you still proficient and if you run across something you don't understand, you need to have the ability to sit down and teach yourself. IE, I know basic linear algebra, when I run across something that requires a new skill, I sit down with a text book and acquire it. When I read Abrash's book "Zen of Graphics Programming", I remember thinking to myself about the difficulty of the math (I was in late middle school, early high school), but after working through it, it's kinda neat to see what you can do with numbers. And Abrash is one hell of a programmer and thinker. He and Donald Knuth are two of my favorite CS guys.
Humorless sig goes here.
Makes it even more amazing considering that engine is now GPL'd and underscores your point completely, gameplay is king. I think the fact that a freely available Half-Life mod (CounterStrike) is now reigning king of multiplayer, at least by server count. The last time I checked, there were over 3000 Half Life servers in my list, with a little over 2000 Q3 and a little over 1000 UT servers. Thats not to say that someone is going to come up with an even better mod to one of those games and dominate the multiplayer scene in the future, but it sure makes for some interesting points right now.
Bleh!
I once said to a boss "Exactly how fast do you want it? I mean, I'll go lock myself in my office and put my optimizing hat on and I'll give you lightning. It'll be hard to follow the code and probably pretty unstable, but that sucker'll fly." That helps set boundaries on the expectations. :)
www.HearMySoulSpeak.com
If you had original Quake, you would have agreed with me on Half-Life being based on that engine. Compare the weapon-bobbing between Q1 and Half-Life: the same. Try typing in "killserver" in the console during a game in HL. Unlike Q2 (at which point it drops to the console with "Server was killed."), nothing happens. What's the extension for model files? Right, .mdl, and not .md2 like in Quake2. What protocols are supported for multiplayer? Incredibly, IPX as well as TCP/IP are supported in HL (Q2 only supports TCP/IP, while Quake1 supported IPX as well in the original DOS version). The only similarity I see between the HL engine and the Q2 engine is how you seem to drift when standing on moving platforms (in HL, it's most noticeable on tracktrains).
"Ancillary does not mean you get to rule the world." --U.S. Circuit Judge Harry Edwards, speaking to the FCC's lawyer
Actually, computer games do save lives in that they provide income and health benefits to a large populace in the electronic entertainment industry. That same multi-billion dollar industry also saves lives in the general populace by contributing to the economy at large. (Recall that there is a strong association between a nation's economic strength and its citizens' life expectancy.)
So, games do save lives, but in order to see the fact one must be willing to examine indirect economic effects.
Easy, automatic testing for Perl.
This is so true. Just visit Sourceforge and check out projects that die between working and complete. There are so few programmers who can actually finish a project. More so than pure programming ability it separates the great from the merely competent programmers.
Keep in mind that because of graphics card advances, the number of polygons used has been going up as well, so per-polygon collision detection is also a moving target.
Hey, ever seen the part in Dune (DeLaurentiis/Lynch production, not the Sci-Fi series) where Gurney and Paul fight with the shields? How about if the bounding model is as grainy as that? It'd be a lot less hard to calculate collisions with such a low polycount, but the functionality would still be there!
"Ancillary does not mean you get to rule the world." --U.S. Circuit Judge Harry Edwards, speaking to the FCC's lawyer
I myself am on the verge of spending some serious cycles on NL programming (adding 'smart' bots to a MUD) and am curious what about NLP he didn't find satisfying. Seems to me NLP is one of those 'deep knowledge areas the industry is moving to'.
Well, at least in all the games I've ever played the AIs are stupid as fu**, especially when it comes to language, so obviously somebody needs to look into it.
As a layman, I ask the following:
Could it possibly be less expensive to just use faster hardware than spend time/money on programmer's to optimize code. I would imagine that at some point, code optimization becomes too expensive an alternative.
Praying for the end of your wide-awake nightmare.
In many games, polygonal objects are stored at several levels of detail; objects close up are drawn with more complex models. If you always use the lowest LOD model for collision detection, people will notice how much better it is than a cubic bounding box but will probably not notice a couple cm difference in the detail silhouettes.
Like Tetris? Like drugs? Ever try combining them?
Will I retire or break 10K?
I remember reading his articles religously in DDJ--talk about some incredible stuff. They got me to the point where I wrote a real-time free directional 3d texture mapping engine in Pascal! (With a bit of inline assembly of course.) Of all people, I'd have to say that he's had the most profound effect on my coding style; what an edge.
Seeing his name on the X-Box team was a sort of blast from the past. It may even pursuade me to set aside my contempt for M$ and buy my first console since the nintendo.
While this article was great in terms of general programming knowledge, it seemed to neglect a detail that many game developers sadly overlook. A game is *nothing* without playability.
Mr. Abrash spends quite a bit of time in the article talking about the best ways to go about programming a game. This is obviously something that comes through in his designs, since the certain software company he developed for spent more time on their game engine than they did level design. This tendancy is even stronger in today's game market where the 'definitive' FPS's are Quake 3 Arena and Unreal Tournament. Both of these spent much, *much* more time on engine development and programming than they did on making their games enjoyable.
Don't get me wrong... Q3A and UT are loads of fun, but compare them to the playability of Half-Life, a little older game that is based (IIRC) on the Quake 2 Engine. There's a lot of custom code in HL, but the majority of it is still a big Q2 total conversion. Valve focussed on playability, story, and fun in HL, rather than code and this shows. I'll play Q3A for a little while, especially if I'm waiting on a long download, but I've lost entire weekends to the plot details in Half-Life.
Programming can be and end unto itself, and even *should* be in some circumstances, but its only half of the equation when building a video game.
The next Slashdot story will be ready soon, but subscribers can beat the rush and slashdot the links early!
Abrash is a great guy who has done great stuff but that article was total fluff. If it weren't for hero worship it would never have been posted. If Joe Schmoe had written it, it would still be languishing on some never visited web page. I got to the end and kept looking for a link to the next page because I couldn't believe that was all there was too it. I think that article was kinda like the geek equivalent of the post-game locker-room interview. "Well, we just gotta get out there and do our best and give it our all and work a team and whichever teams wants it more will get it!"
I'm work for MS (Yeah, yeah), in XBOX development. Per-poly detection is a real problem because of the sheer number of operations. We'll probably end up using a lower poly count to do the shadow volumes and the collision (with a higher poly count for the characters themselves). The biggest problem we run into is the memory to store it all- in the latest generation of video cards, it's bad to try to access the polies the video card uses, which means you have to duplicate polies. 64M is a lot, but it's still tough to fit everything in it.
This paragraph made me smile.
Aim high, think big. Right now is a particularly good time for ambitious game programming, because so much more is possible now than ever before, thanks to CPU performance and 3D accelerators.
You know -- that's as opposed to five years ago when CPU performance was at its lowest in over ten years.
I mean, you know, I dig the point and all, but won't it always be a good time for ambitious game programming?
-- dR.fuZZo
Half life's rendering routines were updated when Q2 was released, but most of the network and game logic is descended from Q1.
:)
I could run across the street and ask for all the specifics, but it's raining out and it makes me miserable.
could you give the parent of this post a +1 funny?
-- Jeff Paulsen
Games programming and scientific programming can often be similar in spirit. If people are interested in either learning to program or want to push their skills elsewhere, they should try working in science, especially in the bio arena where programmers are needed....
-Moondog
I've been doing this subconsciously for years, but I didn't really take note until this past Christmas. My gf and I were at Walmart buying a tree, and it was pretty friggin' sharp. To carry it to the car, I needed gloves. No gardening gloves were to be found in the garden department, so my gf asked an employee where the tools were, thinking they might be there. I instinctively re-asked the question in a different way: "Where can I find gloves suitable for protecting my hands from the tree spines?" We found then in sporting goods. The tool department was a proposed design, but analysis led me back to the core problem that needed solving.
Of course when I got home, I realized that I didn't need gloves at all. The problem was scratched/punctured hands, not an explicit need for gloves. On that same trip, we had already purchased a tarp to lay over our carpet. I could have wrapped the tree in it and not needed the gloves. So I actually failed to address the original problem to determine the most efficient solution. Still learning after all these years :)
Back to software engineering, this new focus has been of tremendous help in developing product requirements, architecture, and design. I feel much more confident that the product my team develops is actually providing a useful service to the customer, rather than usefulness being accidental to the cool technology we invented.
-- ShadyG
Nerd Rock In Progress
Abrash gave the light side. Now I'd like to give you the dark side of the games industry:
(1) Game coders are expected to work burn-out hours. The 60+- horu week si a NORMAL week. It gets worse at push tiems like ebfore shows.
(2) Game coders get periodically pulled off of realwork to code "demos" that mean neothign but are apprently just vital to show at trade shows.
(3) Game coders are, by sotfware industry standards, highly underpaid. this i particualrly sad in that the ones who survive are by and large very fine, if sometiems not formally trained, engineers. Some game companies hav held out royalties as a compensatio nbut generally you only get thsoe as long as you continue to work for the same company. (See tabiulity commenst to follow.)
(4) The game industry is highly unstable. Combine the fact that it is a boom/bust busienss with the fact that management is generally fairly incompetant and what you have is an industry where companies go from being industry darlings to out of business in 2 to 3 years. (Anyone remember looking glass? Thats just a recent example.)
(5) Typical coding siutation: you have no control over budget, you have no control over schedule, you have no control over functionality and you are totally responsible for the success of the engineering effort. In point of fact, when a proejct fails, it is typical game company behavior not to ask why but just to fire everyoen associated with it. (Ironicly the one palce the fault msotlikel lies-- upper management, aren';t the oens who get canned.)
(6) Viewable/playable milestones. Because management is fudnementally incompetant they are afraid to commit to decisons. Theya re also afrid of their own judgement in people, and thus do not trsut their engineering team to deliver. The result is a schedule that forces the engioneers to get little tiny peices of functionality working and "playable" at a time.
As any good engineer knows this is a recipe for disaster in the form of monolithic, redundant, bug laden code.
(7) Design changes. Again, thanks to managemetns inabilti to commit, once they start playing with thsoe peices likely as not they will start doubting and changing their minds. They will make snap decisions that "this isn't fun" before enough of the game is there to tell anything. And then they wil lstar tchanging your spec... without changing your budget or delivery dates.
SO if you enjoy working too hard for too little money in a situation where you are forced to work in ways that make no engineering sense and upon which, at the end of the day, your job depends. The game industry is it.
Abrasj hasn't really experienced tyhe game industry. he's experienced workign in one, ver special place-- ID. I'm sure if we coudl al work for John Carmack game programming woudl be a dream-- but we can't.
but my boss tells me that we have 2yrs of work to do by July. Optimize code? Hell, as soon as something looks as if it might possibly work one day it is ripped from my hands, stamped with Version 1.0 and shipped to the customer. I'm told that 'we'll fix it later', but there is another list of features that are slated for the next release (December).
I do code as the author suggest at home on my own projects. I'll rework a program at the drop of a hat if I see or hear of a better way. But, at work, and I'm sure this holds for the vast majority of programmers, code is considered optimized when it works correctly on 95% of a regression test set.
Aah, change is good. -- Rafiki
Yeah, but it ain't easy. -- Simba