Download - Oddworld : Stranger’s Wrath

Transcript

Oddworld : Stranger’s Wrath

The good news –

The bad news - you’re not Valve or Bungie

• Most of your team are weak links

• Design is unclear and changes often

• Have to make demos with little notice

• Features get cut and added at all times

• Content team and other coders don’t follow the rules

The Oddworld Method

• Lead Programmers – make the whole company more productive

• Use the code and engine to help other coders, content developers

• Improve your weak points, don’t perfect your strong points – each company is unique

• Rapid development and messy design – iteration, ease of changes, forgiving design tools

• …

The Oddworld Method, cont.

• robustness, flexibility, and rapid-response• the engine is at all times crash-free and can be

turned into a shippable demo on short notice• little tips to improve productivity are worth

millions• many of your coders are junior – make it hard for

juniors to write broken code; eg. Code that seniors write should be self-correcting & self-enforcing

Never bring down other people

• People make mistakes, you can’t stop that

• Make mistakes only affect that one system

• Everything is in perforce; roll back bad content, bad builds

• All code is reviewed

• Compiler asserts; table size checks

• Exceptions…

Background : engine summary

• All tools in Maya, all geometry triangle soup• Visibility through portals, clip frustum, scissor• Zones also define paging units and ticking objects; only

current & adjacent zones tick• Collision on triangle soup w/ KDtree and spatial index• Lightmapper for static lighting; cube maps for characters;

material-based renderer with high triangle throughput• Objects tick one by one and move themselves; simple

zone-based manager• Paging in big blocks; huge continuous levels with

persistent state

Exceptions

• Not in final game• Not for normal errors, only for fatal errors• Default action is to propagate error; better than

return values (malloc example)• Catch in individual object creation, tick & render• SEH is better than C++ EH, lets you write code

in the catch and provides call stack• Handler can detect attached debugger and int 3• Bad for cross-platform

Stack traces and error logs

• Small binary stack traces on Xbox (64 bytes)

• Parser on PC• Mailer to coders• VC double-click• Used for many things• Error messages – for anything the artists

can get wrong. Log stack traces with every error.

Builder

• Use free POP3 client; just check mail to build account

• Run the subject line as a command

• Batch file does sync+incredibuild+submit

• Can easily do any task – so also process lipsync, make DVD, just use windows task scheduler

NetSlave

• Simple distributed farm; master machine controls a set of slaves

• Just a queue of commands, farmed out FIFO with dependency analysis

• Lets you use simple single-proc tools; no need for multi-proc bugs!

• Slaves use p4 for data transfer

Memory Management

• Systems use more or less memory at different times.

• Stack traced alloc tracker, parser for hierarchies in tabview.

• 3 heaps – contiguous (20 M, relocatable), small block (5 M, fast), heap (used rarely at runtime).

• STL and XMemAlloc directed into our allocators• Future – separate heap for 64 meg debug data

STL

• Saves dev time; dev time is not just writing code

• STL-port; configurable

• Vector is used heavily; all other containers very rarely used

• Array<>; few C-style arrays, lots of vectors!

• …

STL - vector

• Release(), tighten(), tighten if excessive

• Modified vector growth scheme; doubles on PC, limit at 4k on Xbox

• Vecsorted – like a map, but tight in memory; sometimes faster

• Vector_s, vector_t, vector_a ; note that the base vector class itself is 12 bytes

Inst/Def paradigm

• Many insts created from one shared def

• CoreObject = instance, made from tag, class factory, needs to be IO’d in save games.

• Resource = def, const, made from binary data blocks, const, shared, kept in memory across level loads, etc.

• Many other things use inst/def

IOZ (the Z is for cool)

• Templated type-traits based IO system.• Client code is very easy – just call IOZ on all

members; all logic is compile-time• Type traits and template specialization know if a

type is binary or not, also if vectors are vectors of binary, etc.

• Pointer IO – CoreObject or Resource?• Resources written as Token references • CoreObject data must be written once, but other

pointers just write references (use the RefCounted table index)

Smart Pointers

• Every type should clean itself up on destruction, so pointers should too.

• Other types of GC would be okay; GC reduces errors, GC is required for exceptions. SP is the simplest form of GC.

• Weak Pointers – a reference, not a hack; 4 bytes + 4 for table entry. Table also provides index for IO. (2 byte table index, 2 byte UID)

• …

Smart Pointers, cont.

• Can’t have loops; use Weak or Naked for back pointers; must have a tree-structure of ownership.

• Pass naked pointers; avoids exposing interface and avoids temporaries; can’t do with boost style SP, need base class RefCounted; need to be a little careful with this.

• Stack-trace ref tracking for ref leaks; catches loops and other bugs.

Tweaker and Prefs

• Text is nice for p4 diffs and searches with simple perl tools – making spreadsheets of all healths, dependency finding, etc.

• Cvar – no per instance overhead, handles MI. In the future, generic template Reflection visitor.

• GameControl system for spatial overrides and inheritance

• In the future – more pref inheritance with rule-based inheritance, eg. Super Wolvark = Wolvark w/ health*2

Resource Bundler

• Just load the level and track resource queries.

• Bundle resources for NPC’s, Zones, cines, etc.

• Bundle optimization – minimize bundle count, constrain to 64 meg limit, minimize total bundle size

ArtWatcher

• Watch dirs with ReadDirectoryChangesW, copies content to Xbox and notifies game; ArtWatched resources override bundled content

• Does p4 adds (we add .cpp and .h files too), helps artists a lot

• Right click menu for common tools• One error – on restart, ArtWatched info is

lost

Other stuff

• Skeleton LOD

• Cube Map Lighting

• Practical PSM

• Decorator Renderer

• AI System

• Animation control

• … but technology is easy!

Conclusion

• Code responds well to bad use – enforces rules, never crashes, flexible, easily changed.

• Finish a good game on time; clearly helped OW

• Hopefully one tip here is useful at your company

• No C++ bashing please