Readit News logoReadit News
dmbaggett commented on Making Crash Bandicoot (2011)   all-things-andy-gavin.com... · Posted by u/davikr
djmips · 4 months ago
How long did it take you guys to write the dynamic layout/loader and packer? How long did it take to run it on a level when an artist changed a turtle or something?
dmbaggett · 4 months ago
I don’t know how much time Andy spent building the “poor man’s VM” system, but I know it was a significant effort that underpinned the rest of the game. The packer was something I probably put a few days into in the beginning (greedy and other trivial heuristics) and then kept improving in my “spare time” over the next year or so.

The packer was the final step after a level was pre-sorted and otherwise processed. It was quite fast, so it added only a little bit of extra time to the primary work of pre-rendering every frame of the level to recover the sort order (which typically took around an hour).

I did experiment with solver algorithms but they were so obviously going to be too slow that I abandoned the idea.

dmbaggett commented on Making Crash Bandicoot (2011)   all-things-andy-gavin.com... · Posted by u/davikr
monocasa · 4 months ago
> 2MB of RAM (half of which was VRAM as I recall)

Separate 2MB of main ram and 1MB of VRAM for 3MB total.

dmbaggett · 4 months ago
Thank you. Too many startups ago. :)
dmbaggett commented on Making Crash Bandicoot (2011)   all-things-andy-gavin.com... · Posted by u/davikr
corysama · 4 months ago
Note that the pre-sorting wasn't just for drawing. It was for loading as well. The PS1 only had 2MB of RAM and a 2X CD-ROM with a seek time of a 1/4 second or more depending on the distance traveled by the drive head. So, straight-line physical layout of data to be loaded throughout the level was critical.
dmbaggett · 4 months ago
Sort of. While it was helpful to have the delta-compressed polygon list for each part of the level in its own 64KB chunk, the minor miracle of fitting >10MB levels into 2MB of RAM (half of which was VRAM as I recall) was down to two things: 1) Andy wrote this insane dynamic layout/loader thing that optimized the CD’s bandwidth (which was of course pathetic by today’s standards, as you point out); 2) I wrote a tool that packed the chunks into pages so that we never needed too many active at any given point in the level. This is an NP-Complete problem and we didn’t have solvers back then so the tool just tried a bunch of heuristics, including a stochastic one (think early simulated annealing). The problem with the latter was that if you “got lucky” you might never achieve the required packing again after the artist changed a turtle or something…
dmbaggett commented on Making Crash Bandicoot (2011)   all-things-andy-gavin.com... · Posted by u/davikr
busfahrer · 4 months ago
One of the interesting points to me from reading this (or something similar about CB) the last time was this:

The PSX had no real 3D capability, you could just throw a list of triangles at it to draw. The problem here is that you have to sort the list of triangles yourself, since there is no such thing as a z-buffer.

For Crash Bandicoot, since the path is essentially linear, they were able to pre-sort most of the triangles at build time, which allowed them to achieve greater visual fidelity compared to contemporary titles that allowed for freer movement.

dmbaggett · 4 months ago
Exactly right! I had been working on a prototype for a Doom-style game in the summer of 1994 for the 3DO and built out the beginnings of the “sort polygons AOT” concept. While the idea was conceptually simple, the details were a bear. I guessed that using keyframes with the entire polygon list plus deltas would “just work out” and fit in the limited storage and computational budget of the PS1… and I was very relived when it was clear my intuition was right. (Otherwise we would have needed to redo the entire game engine.)

Another challenge was dealing with foreground objects: you have to somehow sort these into the pre-sorted background polygons. This mostly worked with bucket sorting but we had to use the gross hack of allowing each foreground object to have tunable “push-back” to fix sorting glitches. This required manual work for each level.

Finally, while precomputing the per-frame sort order for a game like Crash would be trivial now, in 1995 we had to build our own Beowulf cluster thingy and farm the level precompute out in pieces to the artists’ SGI workstations, and levels typically took an hour to process. The artists LOVED that. :)

dmbaggett commented on Sony's Mark Cerny Has Worked on "Big Chunks of RDNA 5" with AMD   overclock3d.net/news/gpu-... · Posted by u/ZenithExtreme
deaddodo · 8 months ago
I've never seen the Crash source code, so was making my statements based on second hand knowledge. So thanks for that clarification. I do think it's worth pointing out that Naughty Dog and Insomnia were two companies well known for making highly optimized software for the PSX; so probably not a standard most other companies matched.

Additionally, I have written my own PSX software as well as reviewed plenty of contemporaneous PSX software. While many have some bit of assembler, it's usually specifically around the graphics pipeline. About 90+% of all code is C. This is in line with interviews from developers at the time, as well.

The point wasn't that ASM wasn't used at all (in fact, I specifically acknowledged it in my original post), it was that the PSX was in an era passed the time when entire codebases were hand massaged/tuned assembler (e.g. "the 16-bit era" and before).

dmbaggett · 8 months ago
Insomniac was down the hall from us when we wrote Crash 1 and yes, the Hastings brothers definitely wrote some very tight assembly code!
dmbaggett commented on Sony's Mark Cerny Has Worked on "Big Chunks of RDNA 5" with AMD   overclock3d.net/news/gpu-... · Posted by u/ZenithExtreme
deaddodo · 8 months ago
Not to mention that few developers were doing hand optimized assembly by the time of PSX. They were certainly hand optimizing models and the 3D pipeline (with some assembler tuning), but C and SDKs were well in use by that point.

Even Naughty Dog went with their own LISP engine for optimization versus ASM.

dmbaggett · 8 months ago
I don’t know about other developers at the time, but we had quite a lot of hand-written assembly code in the Crash games. The background and foreground renderers were all written in assembly by hand, as was the octree-based collision detection system. (Source: me; I wrote them.)

And this thread comes full circle: Mark Cerny actually significantly improved the performance of my original version of the Crash collision detection R3000 code. His work on this code finally made it fast enough, so it’s a really good thing he was around to help out. Getting the collision detection code correct and fast enough took over 9 months —- it was very difficult on the PS1 hardware, and ended up requiring use of the weird 2K static RAM scratchpad Sony including in place of the (removed) floating point unit.

GOOL was mainly used for creature control logic and other stuff that didn’t have to be optimized so much to be feasible. Being able to use a lisp dialect for a bunch of the code in the game saved us a ton of time. The modern analogue would be writing most of the code in Python but incorporating C extensions when necessary for performance.

Andy made GOAL (the successor lisp to GOOL) much more low-level, and it indeed allowed coding essentially at the assembly level (albeit with lispy syntax). But GOOL wasn’t like this.

dmbaggett commented on How to program a text adventure in C   helderman.github.io/htpat... · Posted by u/nivethan
dmbaggett · 10 months ago
Many years ago (circa 1993) I ported the original Colossal Cave adventure by Crowther and Woods to TADS, a language created by Mike Roberts specifically for authoring text adventures. (Colossal Cave just came up recently here.)

https://ifdb.org/viewgame?id=c896g2rtsope497w

Graham Nelson ported my port to his Inform language, and Inform is probably your best choice if what you actually want to do is write a (plain text) adventure game.

If you want to learn C programming, writing a text adventure in C would be a fun learning project! But aside from pedagogy there’s no real reason to write a text adventure in anything other than Inform, TADS, etc. Not only is it much easier to use one of these purpose-built languages, with Inform you get multi-platform compatibility going back to the 8-bit era for free!

Personally if I had any free time, I’d be more interested in looking at how to use a frontier LLM like llama as an integral part of a text adventure. There was something like this using GPT-2 circulating on here a while back, but it was pretty rough.

However, it’s clear that if you figured out how to precisely control the LLM so it didn’t produce crazy stuff, you could realize the dream of truly realistic NPCs in these games. Text adventures would seem to be a perfect laboratory for experimenting with this.

dmbaggett commented on What commercial flight route needs the most (min poss.) stops from A to B?   travel.stackexchange.com/... · Posted by u/beatthatflight
dmbaggett · a year ago
It depends on when you do the query. Years ago (mid 2000s) at ITA, Carl wrote code to find the longest possible shortest route between any two airports with scheduled flights. At the time the winner was Wasu, New Guinea to Peawanuck, Ontario, which took a minimum of 90 hours and many flights. There are airports you can only get to at the end of a long line of stops; this drives the number of stops way up.
dmbaggett commented on Silicon Graphics Indigo 2 Workstation [video]   youtube.com/watch?v=1PP--... · Posted by u/doener
dmbaggett · 2 years ago
We used these to make Crash Bandicoot and we even had a mode where you could run on the game on the SGI. It was ... sort of ... playable.
dmbaggett commented on Ryanair wins screen scraping case against Booking.com in US court ruling   rte.ie/news/business/2024... · Posted by u/rodhan
sega_sai · 2 years ago
If it was up to me, I would have required all airlines publish their fares in machine readable format.
dmbaggett · 2 years ago
They were once required to do so (and may still be; I’m not sure at this point), at least if they want to offer flights to or from the US:

https://en.wikipedia.org/wiki/ATPCO

However, interpreting this data properly is decidedly nontrivial (>1M LoC).

Pricing does not imply booking is OK, though. And even circa 1999, Southwest hassled us (ITA Software) about even showing their fares, without us offering any way to book any flights on any carrier.

u/dmbaggett

KarmaCake day4752January 11, 2011
About
I was the first employee at Naughty Dog, and as such wrote around half the code for Crash Bandicoot, as well as a bunch of code for Crash 2. I also produced the music (composed by Josh Mancell) for Crash 1, 2, 3, and Crash Team Racing.

After that, I co-founded travel search company ITA Software with Jeremy Wertheimer and Carl de Marcken; this company powers Kayak, Orbitz, and many airline websites. Google bought ITA Software in 2010 (closed Apr 2011) for ~$700M, and the system is now known as Google Flights.

INKY, my most recent startup, pioneered new techniques in email security. Kaseya acquired INKY in October 2025.

View Original