0% found this document useful (0 votes)
87 views64 pages

Duran Alex

This document provides a summary of Alex Duran's talk on building object systems for games. The talk discusses static hierarchy-based systems and component-based systems. For component-based systems, it covers decisions around inheritance, whether the system is component-centric or object-centric, simple vs complex components, and inter-component interactions. It also discusses optimization strategies for inheritance like caching and instantiation to improve performance of object queries.

Uploaded by

Kamila
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
87 views64 pages

Duran Alex

This document provides a summary of Alex Duran's talk on building object systems for games. The talk discusses static hierarchy-based systems and component-based systems. For component-based systems, it covers decisions around inheritance, whether the system is component-centric or object-centric, simple vs complex components, and inter-component interactions. It also discusses optimization strategies for inheritance like caching and instantiation to improve performance of object queries.

Uploaded by

Kamila
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 64

Building Object Systems

Features, Tradeoffs, and Pitfalls


Introduction
• Cellphones
• Who am I?
– Alex Duran
[email protected]
– Programmer
– Object System for Deus Ex 2 and Thief 3
Outline
• Purpose and Scope of Talk
• Brief Definition of Terms
• Static Hierarchy Based Systems –
Brief Discussion
• Component Based Systems -
Decisions and Consequences
• Summary
Purpose of Talk
• Hard to correctly plan for everything,
even with experience.
• Deus Ex 2 / Thief 3 system designed
with knowledge from a previous
system in mind.
• I still made mistakes.
• Know about the options.
• Understand the dangers.
Scope of Talk
• My experience is single player games.
• And large (20+ total team size)
development teams.
• Not very familiar with:
– Network communication for Object
Systems
– Persistent Worlds (Massively
Multiplayer).
– Differences for really small teams.
What do I mean by these?
• I expect most of you define these the
way I do, but let’s be clear:
• Object System
• Hierarchy
• Component / Property
• Archetype
• Instance
• Designer
What do I mean by…
…Object System?
• System responsible for maintaining
data about Objects and Attributes.
• Clients of the system can do queries
about the value of an Attribute on an
Object.
• Answers the question: What is the
value of “Health” on a “MedBot”?
...Hierarchy?
…Component/Property
…Archetype and Instance?
…Designer?
• Edits data on Archetypes or Instances.
• Data editing doesn’t cause a
recompile and doesn’t require a
programmer.
• Generally not a programmer, so
doesn’t know how code works
underneath.
Static Hierarchies
• Standard C++ model of inheritance.
• Components are required – every
child of has all the components of the
parent(and maybe more).
• Memory / Complexity are issues,
nobody wants to put all functionality
on the base archetype.
• Since the layout is static and known –
code can be faster, data apparent to
programmers (no extraneous data).
Static Hierarchies - Mistake
• Ultima Underworld 1 – First Person
RPG, fairly complex game.
• Assumed: NPCs and Doors don’t need
to share many components.
• Later in design, player needed to have
conversation with a door… but only
NPCs have the conversation
component.
• Can’t push component up now, must
hack around problem.
Static Hierarchies - Success
• Halo 1 – Much simpler in terms of
objects.
• Design fairly well understood.
• Needed a fast, simple object system.
• Can safely make NPCs and Doors
separate.
• Still had minor issues – NPC
archetypes not subdivided enough.
• Halo 2 – even better understood.
Dynamic Hierarchies
• aka Component-Based hierarchies.
• Data determines:
• Hierarchy Organization
• Kinds and values of data on Archetypes
• …and on Instances
Static/Dynamic Hybrid
• Static hierarchies improve speed.
• Dynamic hierarchies improve
flexibility.
• Can have a hierarchy with some static
branching at top, dynamic below that.
• Be careful… can still make mistakes.
• Deus Ex 2 – Emitters, characters,
everything else.
On to the new…
• I expect most people in this room
already were familiar with most of
what I just talked about.
• If not, see Scott Bilas’s talk from last
year’s GDC.
• Doug Church also did a useful talk
recently.
• Now that we’re on the same page…
Component Based Systems -
Decisions and Consequences
• Next:
– Inheritance – Basic
• Later:
– Component-Centric vs. Object-Centric
– Components – Simple vs. Complex
– Inter-Component Interactions
– Inheritance – Advanced
Inheritance – What I Mean
• Components are optional… objects
don’t have to have them.
• If an archetype has values for a
component, must the instance?
• Store values on instances (or child
archetypes) when distinction from
parent value is desired (when a
medbot takes damage, start storing
hitpoints)
Inheritance - Example
Inheritance – Benefits
• Removes problem of storing
redundant data.
• This saves memory.
• Often more importantly, this helps
designers. If they have to maintain
the same data in multiple places… it
will get out of sync.
Inheritance - Cost
• If an object doesn’t have a
component, must ask parent.
• If parent doesn’t have it… must ask
parent’s parent… etc.
• Depth of five or more not uncommon
(average depth traversal for failure in
Deus Ex 2 is ~3.6)
• There are strategies to deal with
these problems… I’ll get to them
later.
Inheritance –
Failed Health Query
Component Based Systems
-Decisions and Consequences
• Done:
– Inheritance - Basic
• Next:
– Component-Centric vs. Object-Centric
• Later:
– Components – Simple vs. Complex
– Inter-Component Interactions
– Inheritance – Advanced
Component-Centric vs.
Object-Centric
• What is Object-Centric?
• What is Component-Centric?
• Why one or the other?
What is Object-Centric?
• Object-Centric is the way people
usually conceptually think of systems.
• System thinks of its data as a collection
of Objects, each of which has its own
Components.
• Data “belongs” to objects.
• Object-Centric is the way data is
presented to designers… every image
so far has been “Object-Centric”.
What is Component-Centric?
• Objects are just UIDs(unique
identifiers). They’re identical.
• Components store UID-data pairs.
• The behavior of an object is
determined by the data that
components store for that UID.
• Internal only – externally data is
displayed as if it were object-centric.
• Thief 1, Thief 2 worked this way.
Component-Centric: Diagram
Why Be Object-Centric?
• Intuitive. Internal representation
matches the way people think about
the data.
• Easier to extract/insert an object
from the world. (Streamed Worlds,
maybe)
• Objects can have associated code.
Good for static-dynamic hybrid
hierarchy systems (Like Deus Ex 2)
• Can scope components.
Why Be Component-Centric?
• Efficiency – Each component stores its
own data… can optimize for:
– Sparse vs. Dense (HackStrength vs. Mass)
– Random Access vs. Iterated (Hitpoints vs.
Physics)
• Helps enforce data-driven aspect of
game… objects can’t be anything but
data.
Component Based Systems -
Decisions and Consequences
• Done:
– Inheritance – Basic
– Component-Centric vs. Object-Centric
• Next:
– Components – Simple vs. Complex
• Later:
– Inter-Component Interactions
– Inheritance – Advanced
Components –
Simple vs. Complex
• Simple Components (Hitpoints, Mass,
Friction, Elasticity)
• Complex Components (DamageModel,
PhysicsModel)
• Complex also “Aggregate” or
“Bundled” components.
Simple Components –
Pros/Cons
• Lightweight – low memory cost to
setting data(just add Hitpoints)
• Easy inheritance.
• More allocations, more overhead to
tracking. (Deus Ex 2: >50% spent on
tracking. Most components are
simple.)
• Be careful not to split functionality up
too much. (Deus Ex 2 Inventory)
Complex Components –
Pros/Cons
• Keep relevant data together(Physics
vs. Mass,Friction,Elasticity)
• Less overhead on tracking whether
objects have particular components.
• Sub-component inheritance/override
becomes important (inherit just
Friction).
• Heavyweight allocation(Suppose you
only need Elasticity?)
Too Simple?
Deus Ex 2 Inventory
• Four different components:
• Inventory Type (essential)
• User Arm Animation Set (essential)
• Inventory Icon (important)
• Inventory Sound Effects (important)
• Could get around with inter-
component requirements, but that
adds overhead (and we don’t have
that feature)
Too Complex?
Dungeon Siege - Inventory
• 9000 lines of code. One component.
• Not all of that necessary.
• Tendency for component to have
everything except the kitchen sink.
Component Based Systems -
Decisions and Consequences
• Done:
– Inheritance – Basic
– Component-Centric vs. Object-Centric
– Components – Simple vs. Complex
• Next:
– Inter-Component Interactions
• Later:
– Inheritance – Advanced
Inter-Component
Interactions : Requiring
• Some components only make sense
when other components exist
(RenderScale without RenderMesh)
• You’d like to have some components
require other components.
• Simple components – more important.
• Deus Ex 2 doesn’t have a built-in
system for this, so we have to rely on
warnings or forcefully setting default
values.
Inter-Component
Interactions : Excluding
• On the other hand, some components
don’t make sense with each other
(RenderMesh and RenderSprite).
• To know which to use, you need
another component (RenderType)
• Being able to make some component
exclusive(or mutually exclusive)
would change this.
• SetProperty generally ok to have
logic, since infrequent in-game.
Component Based Systems -
Decisions and Consequences
• Done:
– Inheritance – Basic
– Component-Centric vs. Object-Centric
– Components – Simple vs. Complex
– Inter-Component Interactions
• Next:
– Inheritance – Advanced
Inheritance - Advanced
• Optimization Strategies
– Caching
– Instantiation
– Tree Flattening
• Dynamic Archetypes
– Changing the values on Archetypes
– Changing the Archetypes for an Instance
• Multiple Inheritance
• Inheritance Blocking
Inheritance Optimization -
Caching
• Every time a query fails you go up the
tree a level… and do another lookup.
• Failures go all the way up.
• Cache the results of queries in the
hierarchy.
• Make sure to cache failures as well as
successes… since failures are more
expensive.
• Good statistics can inform caching
(cache Physics, not HackStrength)
Inheritance Optimization –
Cache Invalidation
• Does it matter?
• Most systems don’t support changing
data on archetypes while running the
game (where speed matters most).
• If you can’t affect the results of an
up-tree query in game, you can’t
invalidate the cache.
Inheritance Optimization -
Instantiation
• Similar to caching, but not on-the-fly.
• Mark components as “instantiated”,
meaning that their values get copied
down to instances automatically.
• Better for things where instances are
likely to differ from archetypes
anyway (TimeSinceRendered).
• No need to cache failures… implied.
• Same potential for cache invalidation.
Inheritance Optimization –
Instantiation Dangers
• Can do this in editor, or as part of
“compiling” levels.
• If you do on data used in editor, get
invalidation problem for sure, since
archetypes change in the editor.
• Example: Thief 1 – Physics
component, always forcing global
replace on instances, invalidating
some special objects(Key “hanging”
on board)
Query Statistics – Deus Ex 2
Base Queries 2365 100.00%
Queries for Instantiated Component 1172 49.56%
Percent Failed: Instantiated Queries 556 47.44%
Queries for Inherited Component 1193 50.44%
Percent Uptree: Inherited Queries 655 54.90%

If Uptree: Avg. Search Depth 3.63 3278

Examples: # of Queries Total Lookups


Physics : Inherited 160 819
Mesh : Instantiated 637 637
PrePivot: Inherited 175 352
RotationRate: Inherited 2 5
Inheritance Optimization –
Tree Flattening
• Can also reduce inheritance cost by
flattening the hierarchy as a
“compile” step on data before running
the game.
• Dungeon Siege does this.
• Like instantiation, but stops at
archetypes, not instances.
• Loses inheritance benefit of memory
savings.
• Prevents changing archetypes.
Dynamic Archetypes –
Changing Values
• Single Player Games - Just change
existing instances manually.
• But… Massively Multiplayer Persistent
World?
– Prefer instances to match archetypes.
– Don’t want to shut down.
– Just change the archetype…
Dynamic Archetypes –
Getting a Different Archetype
• What about changing which
archetype is my parent?
• I can see uses… but none of them
seem worth it in a single inheritance
system. Just copy the relevant data
over to a new instance.
• But worth thinking about?
• There are use cases under a multiple
inheritance model…
Multiple Inheritance
• Data rather than code…
• Multiple code inheritance seems
destined to confuse people, especially
designers who can’t see the code.
• Not so for data, if:
– Very simple rules for order of inheritance
– Results of rules apparent to designers
• Example: Thief 1 Metaproperties
Multiple Inheritance –
Thief 1 Metaproperties
• Metaproperties are just archetypes
with data associated with various
component settings. Values set by
designers.
• Many were vulnerabilities. Every
wooden object inherited from
WoodVulnerability in addition to
normal inheritance.
• Also used to affect NPC behaviors
(example on next slide)
Metaproperty Example
Multiple Inheritance –
Thief 1 Metaproperties
• Metaproperties could be changed in
game.
• Since this meant that an instance’s
archetype could change, it affect
caching and other assumptions.
• But easy way for designers to control
behavior.
• Set all data for a guard to fall asleep
(anim, barks…) by adding appropriate
Metaproperty.
Inheritance Blocking
• What if parent archetype has
component, like DamageModel, but
this archetype doesn’t want it.
• Could just recreate data elsewhere,
but then you’ve got data duplication
issues.
• If there were a way to specifically
NOT inherit a component, then you
can put it where you want it, and just
block the inheritance.
Summary
• Brief summary of the talk
• Acknowledgments
• Q&A
Static Hierarchies vs.
Dynamic Hierarchies
• Component-based hierarchies provide
flexibility for future design decisions.
• Static hierarchies provide speed.
Component-Centric vs.
Object-Centric
• Component-Centric systems provide
efficiency when managing existing
objects.
• Object-Centric systems provide
simplicity and easier addition and
removal of objects.
Simple Components vs.
Complex Components
• Simple components support
inheritance more easily, at the cost of
tracking overhead and additional
inter-component dependencies.
• Complex components encapsulate
entire concepts better, but proper
inheritance requires sub-component
inheritance.
Inheritance
• Inheritance prevents duplication of
data, making it easier for designers to
keep objects up to date.
• Can be slow. A number of
optimization tricks exist, but reduce
options for changing archetypes.
• Changing archetypes is often not
useful, but can work for you in
MMORPGs or with multiple
inheritance.
What I Didn’t Talk About
• Massively Multiplayer Games (except
in Dynamic Archetypes)
• Networking… communicating value
changes.
• Effects of system on end users trying
to build content with provided tools.
• References between objects.
Acknowledgements
• For talking about their systems:
– Scott Bilas (Dungeon Siege)
– Chris Butcher (Halo)
– Steve Jakab (Star Wars Galaxies)
• For additional insight into Thief 1
system:
– Doug Church, Randy Smith, Chris Carollo
Other Talks (from last year)
• GDC 2002 : Scott Bilas :
– "A Data-Driven Game Object System"
– http://www.drizzle.com/~scottb/gdc/

• GDC 2002 : Rob Fermier :


– Creating a Data Driven Engine: Case
Study: The Age Of Mythology
– http://www.gdconf.com/archives/2002/index.htm

• And more recently…


Other Talks (this year)
• GDC 2003 : Jeremy Chatelaine
– “Enabling Data Driven Design Tuning
via Existing Tools”
– www.kamron.net

• Non-GDC : Doug Church :


– “Object Systems : Methods for
attaching data to objects, and
connecting behaviors.
– http://www.d6.com/users/checker/ObjSys.ppt
Q&A
• Fill out your evaluations.
• Any questions?
• If I don’t have time to answer your
question during Q&A, I’ll be around to
talk afterwards.
• After GDC, you’ll be able to find the
slides for this talk at:
– http://www.ionstorm.com/GDC2003/AlexDuran/
• And I can be reached at:
[email protected]

You might also like