Our Properties: Gamasutra GameCareerGuide IndieGames Indie Royale GDC IGF Game Developer Magazine GAO
My Message close
Latest News
spacer View All spacer
 
February 9, 2012
 
DICE 2012: Culture, pride lead to success at Skyrim maker Bethesda [3]
 
DICE 2012: Is the publishing model broken? [12]
 
Double Fine launches $400K Kickstarter for Schafer-led adventure game [4]
spacer
Latest Jobs
spacer View All     Post a Job     RSS spacer
 
February 9, 2012
 
2K Marin
FX Artist - XCOM
 
Visual Concepts
Senior Producer, VC China (Shanghai)
 
Visual Concepts
Software Engineer, VC China (Shanghai)
 
Zindagi Games
Presentation/Game Programmer
 
Visceral Games Redwood Shores
Sr. Gameplay Engineer-Visceral Games
 
Visceral Games Redwood Shores
Sr. Audio Artist-Visceral Games
spacer
Latest Features
spacer View All spacer
 
February 9, 2012
 
arrow Postmortem: CyberConnect 2's Solatorobo: Red the Hunter
 
arrow Jerked Around by the Magic Circle - Clearing the Air Ten Years Later [32]
 
arrow Building the World of Reckoning [4]
 
arrow SPONSORED FEATURE: TwitchTV - How to Build Community Around Your Game in 2012 [13]
 
arrow Happy Action, Happy Developer: Tim Schafer on Reimagining Double Fine [9]
 
arrow Building an iOS Hit: Phase 1 [11]
 
arrow Postmortem: Appy Entertainment's SpellCraft School of Magic [5]
 
arrow Talking Copycats with Zynga's Design Chief [82]
spacer
Latest Blogs
spacer View All     Post     RSS spacer
 
February 9, 2012
 
The Devil Is in the Details of Action RPGs - Part One: The Logistics of Loot [2]
 
Xbox LIVE Indie Games at it Again
 
Merging Waterfall and SCRUM [3]
 
Business Post Mortem: Wolf Toss: Pre-launch Planning & Blended CAC
 
Minmaxing - Is turn-based fun anymore? [53]
spacer
About
spacer Editor-In-Chief/News Director:
Kris Graft
Features Director:
Christian Nutt
Senior Contributing Editor:
Brandon Sheffield
News Editors:
Frank Cifaldi, Tom Curtis, Mike Rose, Eric Caoili, Kris Graft
Editors-At-Large:
Leigh Alexander, Chris Morris
Advertising:
Jennifer Sulik
Recruitment:
Gina Gross
 
Feature Submissions
 
Comment Guidelines
Sponsor
Features
  Manager In A Strange Land: Turnaround Time
by Jamie Fristrom [Programming, Manager In A Strange Land]
Post A Comment Share on Twitter Share on Facebook RSS
 
 
November 28, 2003
 

Enough general advice. Let's hit some specifics. One of the most obvious ways you can optimize your team is by decreasing turnaround time.

By turnaround time, I mean the time between making a change and testing the change. Different sorts of changes require different turnaround times. Some of them are as low as several seconds, such as using "Edit and Continue" in Visual C++ to stop the program, fix something, and keep running. ("Edit and Continue" is the coolest thing since source control.) After that we get into the minute range: changing one .CPP file will usually require around a one-minute rebuild and then the one to two minutes to load the level. (Although we do have a light level that takes only around 30 seconds, great for prototyping new features.) Changing an .H file often necessitates a complete rebuild, which can take anywhere from five minutes (for a debug PC version) to thirty (for an optimized PS2 version.) This is coder-centric, but artists and designers are in the same boat: they make a change, they need to export data, build data, load a level.


I find that when it takes more than a few minutes to see a change in the game, I lose "flow". I drop out of the zone. I start browsing web-sites, go get a drink, wander over to someone else's office, post another article to my blog, whatever: often the build finishes or the level loads and I don't even notice, creating additional idle time. And I forget what the hell I was doing. Frequently, when I see others "goofing off" at work, and go to investigate, there's a reason: they're waiting for data to build, they're waiting for a sync to finish. Although there are some conscientious people who sit and meditate on what they're working on while they wait for turnarounds -- and those guys are often the best employees on the team -- for most people, there's a point where turnaround times cost much more than just the wasted time spent waiting.

How much time do you waste while you wait for a rebuild? Adding up all of those minutes during the day might surprise you.
Or depress you.

By way of comparison, I've done some programming in interpreted languages. Scripting missions for our game or writing database clients in Visual Basic, for example. And currently I've got a side-project going on at home where the build time is still under ten seconds. These experiences are pure pleasure. Flow is achieved. I feel like a potter at the wheel, sculpting my software. Some coders would be horrified by that analogy, as it shows a code-like-Hell inclination rather than the inclination to write correct code the first time around. Guilty as charged. Still, just because fast turnaround times allow us to be bad programmers doesn't mean we have to be bad programmers. Or maybe we should go back to job control and mainframes because that encourages us to triple-check and code review before we even compile?

Enough preaching. Here are some techniques to lower turnaround. I'm going to start with coder turnaround because that's what I know best, but on your project code may not be your biggest problem; you may be more worried about getting as much art, or as many levels, into your game as possible. In which case you should focus on content turnaround.

Measure your build times. You can't control what you can't measure. Just like optimizing code, optimizing build times requires an iterative process of measurement followed by single-variable changes.

With Visual C++ 6.0, you can pass in the /y3 option when running MSDEV.EXE and it will time your builds. Cool little undocumented feature. With .NET, go to Tools -> Options -> Projects -> Build Timing and set it to Yes. With command line tools you can use %time%.

Use metafiles. Symantec once had a C compiler called LightSpeed that had what they called a "Missing Link" - the link was almost instantaneous. Their secret, I believe, was that they didn't link, they just compiled all the C files into one big C file, and then somehow incrementally compiled single modules. I believe this because files listed later in the project could refer to the global variables declared in the earlier modules. Pure evil, obviously, especially if you don't know the compiler is doing it. Still, maybe we can use this for good.

If you create "metafiles" (.CPP files that include a dozen or so of your real .CPP files and nothing else), you'll see your build time improve, partly because your link time will go down, and mostly because your .H files will only be compiled once per dozen files instead of once per individual file.

Ain't it the truth.

Then you have a trade-off; when making an isolated change to a .CPP file, your build time for that single file is now longer. It's up to you to find the optimum balance between individual file compile time and full project compile time. One thing you can do is make a FILES_FAST.CPP metafile. If you're going to be working on a single file for a while, you can copy that file to FILES_FAST. It's the only file you put in there, so it takes very little time to rebuild. Best of both worlds, if you have the foresight to know which files you're going to be working on.

Of course, the downside to metafiles is it butchers your modularity. Suddenly, programmers working in one module could, in theory, see the static variables and declarations in another module, and violate their encapsulation.

Use precompiled headers. I've found that most programmers don't know how to use this feature with Visual C++. You can't just go into your project settings, turn on "Using precompiled headers", and expect it to work. What you need to do is this:

  • Make a header file that includes your other commonly-used but rarely-changed headers. Microsoft usually calls theirs STDAFX.H. I call mine GLOBAL.H. Obvious things that might go in here are the Windows and STL headers.
  • Have a .CPP file that includes that file and nothing else. I call mine "PRECOMP.CPP". In the Project Settings for this file, turn Create Precompiled Header on.
  • For all the other files, either include "GLOBAL.H" as the first line in the file, or set "Use precompiled headers" to off.
  • Watch your build times improve.

One warning: everybody on the team needs to know how precompiled headers work. A problem I frequently see is a new programmer tries to add a new .CPP file to the project and gets an error message about the precompiled headers. So they go in to the project settings and turn the precompiled headers off for everything. Voila, it works again. Forgive them, for they know not what they do.

There's a theoretical minimum time your compiler will take to do a complete rebuild. If you compile and link a 1000-line program and measure how long it took, you can then come up with a pretty good estimate of how fast you're going to be able to get your 200,000 line game to build -- unless you use a distributed build environment. We haven't bothered with that, because our full build times are around five minutes and products like IncrediBuild only promise to get that number down to three. If we had a ten-minute build, we would have signed up for IncrediBuild yesterday.

______________________________________________________

 
Article Start Page of
 
Comments


none
 
Comment:
 




UBM Techweb
Game Network
Game Developers Conference | GDC Europe | GDC Online | GDC China | Gamasutra | Game Developer Magazine | Game Advertising Online
Game Career Guide | Independent Games Festival | Indie Royale | IndieGames

Other UBM TechWeb Networks
Business Technology | Business Technology Events | Telecommunications & Communications Providers

Privacy Policy | Terms of Service | Contact Us | Copyright © UBM TechWeb, All Rights Reserved.