Re: Decision Graphs (or whatever they're called)
Nisarg Kothari <[email protected]> Fri, 11 Jun 2010 09:37:37 -0400
| Newsgroups | gmane.games.devel.sweng |
|---|---|
| Message-ID | <[email protected]> |
I believe they're called decision trees. They were used by Halo 2. There's a paper about it somewhere out there. Sorry I can't check right now, I'm posting from my phone. Nisarg On Friday, June 11, 2010, Phill Djonov <[email protected]> wrote: > The recent discussion on OO and architecture (hear me out, I'm not > trolling, I swear! :) ) got me thinking about a technique II've been > toying with for a while (well, it's been put to *some* productive use, > but only in a primitive incarnation). That primitive incarnation > turned out good enough that, much to my surprise, it's probably going > to ship soon, and I get the feeling it'd be worth putting in the time > to refine it some for future use. > > Apologies in advance if this is something really obvious that > everybody but me's been doing for ages, I only recently came out of my > tools and graphics hole where life is simple... > > Anyway, the basic problem I'm solving is implementing absurd designy > high-level logic. For instance, a designer hands you a document that > boils down to a dozen levels of if and switch statements. It's a mess, > but you code it up, and all is well. And then they decide that on > level four they want an entire branch of that logic to be something > else completely, and you've got to go back to your design and add a > virtual call at that branch point (because it was completely > non-obvious that anyone would ever want to screw with the logic > *there*) and override it in level four. Ten levels later and you can't > tell what anything does anymore because code branches off to strange > places all over the place, iteration time goes up and up, and you > start wishing the designers would just hurry up and die (but instead > they change the base design and now half of your override points no > longer make any sense and...). > > So what I did to deal with this, is I basically transcribed their > document directly into the game not as code but rather *as data*. The > end result was something like a graph of associative maps, each taking > as a key the result of one level of if/switch statement and returning > either another map for the next level or a leaf node which is either a > function or a list of parameters to some other update function. All > that's then left is to evaluate all of the branch values ahead of > time, stick them in a list, and use that list to traverse the graph in > some sane manner. > > My initial experience has been ridiculously promising (given how > ridiculously ad-hoc the implementation is). All of the updates happen > at the leaves, meaning I have a bunch of very simple little > objects/functions to maintain. Fixing "game breaks in condition X, Y, > Z" bugs has been obscenely easy since all I have to do is trace those > conditions through the graph and there's everything that happens. None > of the nightmares of tracing updates through "oh this is virtual and > the level four object is eight levels of inheritance away" or even > just through stuff like: > > if( X ) > { > if( Y ) > { > //pages of code > } > else > { > //pages of code > } > > //some good code > statement_which_offends_when_Y_and_Z(); > //some more good code > } > > ever happened. Crazy "hey, let's make level nine be different" > requests also never really added much complexity since simply patching > the base logic graph at level load ended up being *far* more > maintainable than going back and adding hooks specifically for level > nine overrides. Hell, the final scripts are nearly simple enough for a > designer (who couldn't code hello world to save his life) to read. And > it's pretty obvious that the whole thing could be boiled down into a > mess of ugly branchy code, if that were ever needed for performance > (or whatever) reasons, though it also seems that it's awfully close to > something that could be bent to a more stream-processing type > approach... (beyond the obvious compute_traverse_keys( entity[] ); > traverse_logic_graphs( traverse_key_list[] ) split). > > So, what's that called? "Decision graph" brings up hits on Google, but > that which isn't simply "how we draw flow charts" seems to be mostly > academic, and I'm more interested in getting a good grounding in the > related practical issues (at least at this stage). I assume I've badly > reinvented Lisp or somesuch, and there must be a body of practices > surrounding this already... > > Have any of you done serious work with such an architecture? Any "oh > look out for this" type thoughts you can share? > > Cheers! > Phill > _______________________________________________ > Sweng-Gamedev mailing list > [email protected] > http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder.com > _______________________________________________ Sweng-Gamedev mailing list [email protected] http://lists.midnightryder.com/listinfo.cgi/sweng-gamedev-midnightryder.com