Title: geek
1(No Transcript)
2(No Transcript)
3(No Transcript)
4geek poke
5A Dynamic Component Architecture for High
Performance Gameplay
Terrance Cohen Lead Systems Engineer Insomniac
Games
6A Dynamic Component Architecturefor High
Performance Gameplay
- Purpose
- The Dynamic Component System
- Implementation by Example
- Questions (note slide )
7A Dynamic Component Architecturefor High
Performance Gameplay
- Purpose
- Statement of Problem
- Proposed Solution
- The Dynamic Component System
- Implementation by Example
8Purpose Statement of Problem
- Monolithic / deep Game Object hierarchy
- Memory binds data _at_ compile time
- Allocated throughout lifetime
9Purpose Statement of Problem
- Monolithic / deep Game Object hierarchy
- Memory binds data _at_ compile time
- Performance poor cache coherence
- Arrays of non-homogeneous objects
- Virtual dispatch
- Fragmented instance data
10Purpose Statement of Problem
- Monolithic / deep Game Object hierarchy
- Memory binds data _at_ compile time
- Performance poor cache coherence
- Architecture capability ltgt inheritance
- Fixed at compile time
- Fully determined by class
- Change capabilities -gt change hierarchy
11Purpose Statement of Problem
- Monolithic / deep Game Object hierarchy
- Memory binds data _at_ compile time
- Performance poor cache coherence
- Architecture capability ltgt inheritance
- "What we're used to"
- But select the best tool for the job.
12Purpose Statement of Problem
- Monolithic / deep Game Object hierarchy
- Memory binds data _at_ compile time
- Performance poor cache coherence
- Architecture capability ltgt inheritance
- "What we're used to"
- But select the best tool for the job.
- There's a better way!
13A Dynamic Component Architecturefor High
Performance Gameplay
- Purpose
- Statement of Problem
- Proposed Solution
- The Dynamic Component System
- Implementation by Example
14Purpose Proposed Solution
- Construction of Game Object through composition
of components at runtime
15Purpose Proposed Solution
- Construction of Game Object through composition
of components at runtime - Simple!
- Thank you for coming!
16Purpose Proposed Solution
- Construction of Game Object through composition
of components at runtime - Simple!
- Thank you for coming!
- Oh, you want details !?!
17Purpose Proposed Solution
- Construction of Game Object through composition
of components at runtime - Small chunks
- Represent a data transformation
18A Dynamic Component Architecturefor High
Performance Gameplay
- Purpose
- The Dynamic Component System
- Features
- Implementation by Example
19The Dynamic Component System
- Evolution
- Resistance 1 - Proof of Concept (1 type)
- Resistance 2 - "Early Adopters" (32 types)
- Ongoing (295 types as of May 1st 2010)
- Majority of new gameplay code
- Large portions of old gameplay refactored
20The Dynamic Component System
- Evolution
- Resistance 1 - Proof of Concept (1 type)
- Resistance 2 - "Early Adopters" (32 types)
- Ongoing (295 types as of May 1st 2010)
- Majority of new gameplay code
- Large portions of old gameplay refactored
- So its mature.
21The Dynamic Component System
- Evolution
- Resistance 1 - Proof of Concept (1 type)
- Resistance 2 - "Early Adopters" (32 types)
- Ongoing (295 types as of May 1st 2010)
- Majority of new gameplay code
- Large portions of old gameplay refactored
- So its mature. (No, not that way.)
22The Dynamic Component System
- Side-by-side implementation
- Not necessary to refactor existing code
- Coexist with components
- General solution
23The Dynamic Component System
- Does not address matters of
- Reflection
- Serialization
- Data building
- Instance versioning
- ... those things are handled separately
- outside the scope of this discussion
24A Dynamic Component Architecturefor High
Performance Gameplay
- Purpose
- The Dynamic Component System
- Features
- Implementation by Example
25Dynamic Component System Features
- Components
- High-performance
- Dynamic
- System
26Dynamic Component System Features
- Components
- Originally Aspects
- Base Component class
- 8 bytes of administrative data
- Allocated from pools
- One pool per concrete type
- "Roster" indexes instances
- "Partition" separates allocated/free instances
27Dynamic Component System Features
- Components
- High-performance
- Small, constant-time operations
- Allocate/free
- Resolve handle
- Get type
- Type implements (derived from)
- No instance copying
28Dynamic Component System Features
- Components
- High-performance
- Updates per-type (per-pool)
- Cache friendly
- Encourage async update
- e.g. on SPU
- Roster contiguous list of alloc'd instances
- Roster up to partition is DMA list
29Dynamic Component System Features
- Components
- High-performance
- Resolving handle
- Small, constant-time operation
- Index into Pool
- Compare generation
- Return Component
30Dynamic Component System Features
- Components
- High-performance
- Dynamic
- Runtime composition of game objects
- Dynamically alter behavior without baggage
- Component allocated in use
- Pool sizes max concurrent allocations
31Dynamic Component System Features
- Components
- High-performance
- Dynamic
- High-frequency alloc() free()
- alloc()
- test for availability
- make handle from index generation
- increment Roster Partition
- ComponentInit()
32Dynamic Component System Features
- Components
- High-performance
- Dynamic
- High-frequency alloc() free()
- alloc()
- free()
- ComponentDeinit()
- swap Roster index with Partition-adjacent index
- decrement Partition
- increment generation
33Demo DynamicComponentFree()
//free the component from host's component
chain
void DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
ComponentHandle component_handle )
34Demo DynamicComponentFree()
//free the component from host's component
chain
void DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
ComponentHandle component_handle )
35Demo DynamicComponentFree()
//free the component from host's component
chain
void DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
ComponentHandle component_handle )
36Demo DynamicComponentFree()
//free the component from host's component
chain
void DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
ComponentHandle component_handle )
37Demo DynamicComponentFree()
//free the component from host's component
chain
void DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
ComponentHandle component_handle )
38Dynamic Component System Features
- Components
- High-performance
- Dynamic
- System
- Not all-or-nothing!
- Examples
- Conversation
- Script Events
- Shots no game object
39A Dynamic Component Architecturefor High
Performance Gameplay
- Purpose
- The Dynamic Component System
- Implementation by Example
- API
- Script Events Type Registration
- Navigation Allocation Init
- Shots Asynchronous Update
40namespace DynamicComponent
//
// Hosts' API
//
// Call these from GameObjects
(or other objects) that host Dynamic Components
//
_____________________________
__________________________________________________
________________________
//allocate a component
of type, add it to host's component chain,
// and optionally
park a prius in the component
// returns null
if no space is available for allocation
Component
Allocate ( Type type,
HostHandle host_handle,
Chain
chain, void prius NULL )
41namespace DynamicComponent
//
// Hosts' API
//
// Call these from GameObjects
(or other objects) that host Dynamic Components
//
Component
Allocate ( Type type,
HostHandle host_handle,
Chain
chain, void prius NULL )
________________________________________________
__________________________________________________
_____
//resolve a ComponentHandle to a
Component
// returns NULL if
component_handle is null or is a stale handle
// (i.e.
component instance has been reused)
Component ResolveHandle (
Type type, ComponentHandle component_handle )
42namespace DynamicComponent
//
// Hosts' API
//
// Call these from GameObjects
(or other objects) that host Dynamic Components
//
Component
Allocate ( Type type,
HostHandle host_handle,
Chain
chain, void prius NULL )
Component ResolveHandle (
Type type, ComponentHandle component_handle )
_____________________________________________
__________________________________________________
________
//get one component of type that
belongs to host
Component Get
( Type type, HostHandle
host_handle, Chain chain )
43namespace DynamicComponent
//
// Hosts' API
//
// Call these from GameObjects
(or other objects) that host Dynamic Components
//
Component
Allocate ( Type type,
HostHandle host_handle,
Chain
chain, void prius NULL )
Component ResolveHandle (
Type type, ComponentHandle component_handle )
Component Get
( Type type, HostHandle host_handle, Chain
chain ) _____________________________________
__________________________________________________
________________
//get the first Component in
host's chain that implements the type interface
Component
GetComponentThatImplements( Type type,
HostHandle host_handle, Chain chain
)
44namespace DynamicComponent
//
// Hosts' API
//
// Call these from GameObjects
(or other objects) that host Dynamic Components
//
Component
Allocate ( Type type,
HostHandle host_handle,
Chain
chain, void prius NULL )
Component ResolveHandle (
Type type, ComponentHandle component_handle )
Component Get
( Type type, HostHandle host_handle, Chain
chain ) Component
GetComponentThatImplements( Type type,
HostHandle host_handle, Chain chain )
________________________________________________
__________________________________________________
_____
//get all Components of type in host's
chain, up to a max of count instances.
// count should be passed with the
size of the component array.
// on return, count will
contain the number of matching components, up to
the specified limit. Component
GetComponents ( Type type, HostHandle
host_handle,
Chain chain, u32
count )
45namespace DynamicComponent
//
// Hosts' API
//
// Call these from GameObjects
(or other objects) that host Dynamic Components
//
Component
Allocate ( Type type,
HostHandle host_handle,
Chain
chain, void prius NULL )
Component ResolveHandle (
Type type, ComponentHandle component_handle )
Component Get
( Type type, HostHandle host_handle, Chain
chain ) Component
GetComponentThatImplements( Type type,
HostHandle host_handle, Chain chain )
Component GetComponents (
Type type, HostHandle host_handle,
Chain chain, u32 count )
___________________________________________
__________________________________________________
__________
//get all Components in host's
chain that implement type's interface.
// count should be passed
with the size of the component array.
// on return, count
will contain the number of matching components,
up to the specified limit. Component
GetComponentsThatImplement( Type type,
HostHandle host_handle,
Chain
chain, u32 count )
46namespace DynamicComponent
//
// Hosts' API
//
// Call these from GameObjects
(or other objects) that host Dynamic Components
//
Component
Allocate ( Type type,
HostHandle host_handle,
Chain
chain, void prius NULL )
Component ResolveHandle (
Type type, ComponentHandle component_handle )
Component Get
( Type type, HostHandle host_handle, Chain
chain ) Component
GetComponentThatImplements( Type type,
HostHandle host_handle, Chain chain )
Component GetComponents (
Type type, HostHandle host_handle,
Chain chain, u32 count )
Component GetComponentsThatImplem
ent( Type type, HostHandle host_handle,
Chain chain, u32 count )
_______________________________________
__________________________________________________
______________
//free the component from
host's component chain
void Free
( Type type, HostHandle
host_handle, Chain chain,
ComponentHandle
component_handle )
47namespace DynamicComponent
//
// Hosts' API
//
// Call these from GameObjects
(or other objects) that host Dynamic Components
//
Component
Allocate ( Type type,
HostHandle host_handle,
Chain
chain, void prius NULL )
Component ResolveHandle (
Type type, ComponentHandle component_handle )
Component Get
( Type type, HostHandle host_handle, Chain
chain ) Component
GetComponentThatImplements( Type type,
HostHandle host_handle, Chain chain )
Component GetComponents (
Type type, HostHandle host_handle,
Chain chain, u32 count )
Component GetComponentsThatImplem
ent( Type type, HostHandle host_handle,
Chain chain, u32 count )
void Free
( Type type, HostHandle host_handle,
Chain chain,
ComponentHandle
component_handle )
_______________________________________________
__________________________________________________
______
//free all of the components in host's
component chain
// (GameObjects automatically free
their component chain when they are destroyed)
void FreeChain
( HostHandle host_handle, Chain
chain )
48namespace DynamicComponent
//
// Hosts' API
//
// Call these from GameObjects
(or other objects) that host Dynamic Components
//
Component
Allocate ( Type type,
HostHandle host_handle,
Chain
chain, void prius NULL )
Component ResolveHandle (
Type type, ComponentHandle component_handle )
Component Get
( Type type, HostHandle host_handle, Chain
chain ) Component
GetComponentThatImplements( Type type,
HostHandle host_handle, Chain chain )
Component GetComponents (
Type type, HostHandle host_handle,
Chain chain, u32 count )
Component GetComponentsThatImplem
ent( Type type, HostHandle host_handle,
Chain chain, u32 count )
void Free
( Type type, HostHandle host_handle,
Chain chain,
ComponentHandle
component_handle ) void
FreeChain ( HostHandle
host_handle, Chain chain )
________________________________________________
__________________________________________________
_____
//downcast a Component to one of its
subclasses.
// please use this instead of the
c-style '(Type)object' so that casts are checked
in debug //Example
// HeadComponent my_head
COMPONENT_CAST(component_ptr, Head)
//
define
COMPONENT_CAST(component, type) \
((typeComponent)ValidCast(component,
DynamicComponenttype))
inline Component ValidCast
( Component component, Type type )
49namespace DynamicComponent
// Hosts' API
Component Allocate
( Type type, HostHandle host_handle,
Chain chain, void prius NULL )
Component ResolveHandle
( Type type, ComponentHandle
component_handle ) Component
Get ( Type type,
HostHandle host_handle, Chain chain )
Component GetComponentThatImplements(
Type type, HostHandle host_handle, Chain chain )
Component GetComponents
( Type type, HostHandle host_handle,
Chain chain, u32 count )
Component GetComponentsThatImpl
ement( Type type, HostHandle host_handle,
Chain chain, u32 count )
void Free
( Type type, HostHandle host_handle,
Chain chain,
ComponentHandle
component_handle ) void
FreeChain ( HostHandle
host_handle, Chain chain )
define COMPONENT_CAST(component, type) \
((typeComponent)ValidCast(component,
DynamicComponenttype))
inline Component ValidCast
( Component component, Type type )
___________________________________
__________________________________________________
__________________
//
// Systems' API
//
// Call these from
systems that use the DCS
//
//get a
list of component types that implement the
interface of the given component type
// count should be passed with the size of
the types array.
// on return, count will contain the
number of matching component types,
// up to the specified limit.
Type
GetTypesThatImplement ( Type type, u32 count
)
50namespace DynamicComponent
// Hosts' API
Component Allocate
( Type type, HostHandle host_handle,
Chain chain, void prius NULL )
Component ResolveHandle
( Type type, ComponentHandle
component_handle ) Component
Get ( Type type,
HostHandle host_handle, Chain chain )
Component GetComponentThatImplements(
Type type, HostHandle host_handle, Chain chain )
Component GetComponents
( Type type, HostHandle host_handle,
Chain chain, u32 count )
Component GetComponentsThatImpl
ement( Type type, HostHandle host_handle,
Chain chain, u32 count )
void Free
( Type type, HostHandle host_handle,
Chain chain,
ComponentHandle
component_handle ) void
FreeChain ( HostHandle
host_handle, Chain chain )
define COMPONENT_CAST(component, type) \
((typeComponent)ValidCast(component,
DynamicComponenttype))
inline Component ValidCast
( Component component, Type type )
//
// Systems' API
//
// Call these from
systems that use the DCS
//
Type
GetTypesThatImplement ( Type type,
u32 count )
_______________________________________________
__________________________________________________
______
//returns whether component type
implements interface
bool
TypeImplements ( Type type, Type
interface )
51namespace DynamicComponent
// Hosts' API
Component Allocate
( Type type, HostHandle host_handle,
Chain chain, void prius NULL )
Component ResolveHandle
( Type type, ComponentHandle
component_handle ) Component
Get ( Type type,
HostHandle host_handle, Chain chain )
Component GetComponentThatImplements(
Type type, HostHandle host_handle, Chain chain )
Component GetComponents
( Type type, HostHandle host_handle,
Chain chain, u32 count )
Component GetComponentsThatImpl
ement( Type type, HostHandle host_handle,
Chain chain, u32 count )
void Free
( Type type, HostHandle host_handle,
Chain chain,
ComponentHandle
component_handle ) void
FreeChain ( HostHandle
host_handle, Chain chain )
define COMPONENT_CAST(component, type) \
((typeComponent)ValidCast(component,
DynamicComponenttype))
inline Component ValidCast
( Component component, Type type )
//
// Systems' API
//
// Call these from
systems that use the DCS
//
Type
GetTypesThatImplement ( Type type,
u32 count ) bool
TypeImplements ( Type
type, Type interface )
_______________________________________________
__________________________________________________
______
//returns the number of components of
type that are currently allocated
u32 GetNumAllocated
( Type type )
52namespace DynamicComponent
// Hosts' API
Component Allocate
( Type type, HostHandle host_handle,
Chain chain, void prius NULL )
Component ResolveHandle
( Type type, ComponentHandle
component_handle ) Component