geek - PowerPoint PPT Presentation

About This Presentation
Title:

geek

Description:

* High-performance Updates are performed per-type (per-pool) Cache friendly Designed to encourage & simplify async update e.g. on SPU Roster contains contiguous list ... – PowerPoint PPT presentation

Number of Views:125
Avg rating:3.0/5.0
Slides: 77
Provided by: Goo7729
Category:
Tags: dynamic | geek

less

Transcript and Presenter's Notes

Title: geek


1
(No Transcript)
2
(No Transcript)
3
(No Transcript)
4
geek poke
5
A Dynamic Component Architecture for High
Performance Gameplay
Terrance Cohen Lead Systems Engineer Insomniac
Games
6
A Dynamic Component Architecturefor High
Performance Gameplay
  • Purpose
  • The Dynamic Component System
  • Implementation by Example
  • Questions (note slide )

7
A Dynamic Component Architecturefor High
Performance Gameplay
  • Purpose
  • Statement of Problem
  • Proposed Solution
  • The Dynamic Component System
  • Implementation by Example

8
Purpose Statement of Problem
  • Monolithic / deep Game Object hierarchy
  • Memory binds data _at_ compile time
  • Allocated throughout lifetime

9
Purpose 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

10
Purpose 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

11
Purpose 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.

12
Purpose 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!

13
A Dynamic Component Architecturefor High
Performance Gameplay
  • Purpose
  • Statement of Problem
  • Proposed Solution
  • The Dynamic Component System
  • Implementation by Example

14
Purpose Proposed Solution
  • Construction of Game Object through composition
    of components at runtime

15
Purpose Proposed Solution
  • Construction of Game Object through composition
    of components at runtime
  • Simple!
  • Thank you for coming!

16
Purpose Proposed Solution
  • Construction of Game Object through composition
    of components at runtime
  • Simple!
  • Thank you for coming!
  • Oh, you want details !?!

17
Purpose Proposed Solution
  • Construction of Game Object through composition
    of components at runtime
  • Small chunks
  • Represent a data transformation

18
A Dynamic Component Architecturefor High
Performance Gameplay
  • Purpose
  • The Dynamic Component System
  • Features
  • Implementation by Example

19
The 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

20
The 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.

21
The 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.)

22
The Dynamic Component System
  • Side-by-side implementation
  • Not necessary to refactor existing code
  • Coexist with components
  • General solution

23
The 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

24
A Dynamic Component Architecturefor High
Performance Gameplay
  • Purpose
  • The Dynamic Component System
  • Features
  • Implementation by Example

25
Dynamic Component System Features
  • Components
  • High-performance
  • Dynamic
  • System

26
Dynamic 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

27
Dynamic Component System Features
  • Components
  • High-performance
  • Small, constant-time operations
  • Allocate/free
  • Resolve handle
  • Get type
  • Type implements (derived from)
  • No instance copying

28
Dynamic 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

29
Dynamic Component System Features
  • Components
  • High-performance
  • Resolving handle
  • Small, constant-time operation
  • Index into Pool
  • Compare generation
  • Return Component

30
Dynamic 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

31
Dynamic Component System Features
  • Components
  • High-performance
  • Dynamic
  • High-frequency alloc() free()
  • alloc()
  • test for availability
  • make handle from index generation
  • increment Roster Partition
  • ComponentInit()

32
Dynamic 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

33
Demo DynamicComponentFree()
  //free the component from host's component
chain                                            
         void         DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
                                           
ComponentHandle component_handle )            
    
34
Demo DynamicComponentFree()
  //free the component from host's component
chain                                            
         void         DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
                                           
ComponentHandle component_handle )            
    
35
Demo DynamicComponentFree()
  //free the component from host's component
chain                                            
         void         DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
                                           
ComponentHandle component_handle )            
    
36
Demo DynamicComponentFree()
  //free the component from host's component
chain                                            
         void         DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
                                           
ComponentHandle component_handle )            
    
37
Demo DynamicComponentFree()
  //free the component from host's component
chain                                            
         void         DynamicComponentFree(
Type type, HostHandle host_handle, Chain chain,
                                           
ComponentHandle component_handle )            
    
38
Dynamic Component System Features
  • Components
  • High-performance
  • Dynamic
  • System
  • Not all-or-nothing!
  • Examples
  • Conversation
  • Script Events
  • Shots no game object

39
A 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

40
namespace 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 )
                  
41
namespace 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 )  
    
42
namespace 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 )
   
43
namespace 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
)    
44
namespace 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 )                      
    
45
namespace 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 )            
              
46
namespace 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 )            
    
47
namespace 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 )              
48
namespace 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 )  
                
49
namespace 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
)                             
50
namespace 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 )                         
51
namespace 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 )                    
                    
52
namespace DynamicComponent                      
                                                 
                                              
                                                 
        // Hosts' API                            
                                                 
                                                
                                                 
             Component        Allocate          
       ( Type type, HostHandle host_handle,      
                                                 
           Chain chain, void prius NULL )  
                  Component        ResolveHandle
            ( Type type, ComponentHandle
component_handle )          Component      
Write a Comment
User Comments (0)
About PowerShow.com