SlideShare una empresa de Scribd logo
1 de 67
The Next Mainstream
Programming Language:
A Game Developer’s Perspective
        Tim Sweeney
         Epic Games
Outline
 Game Development
  – Typical Process
 What’s in a game?
  – Game Simulation
  – Numeric Computation
  – Shading
 Where are today’s languages failing?
  – Concurrency
  – Reliability
Game Development
Game Development: Gears of War
 Resources
  –   ~10 programmers
  –   ~20 artists
  –   ~24 month development cycle
  –   ~$10M budget
 Software Dependencies
  – 1 middleware game engine
  – ~20 middleware libraries
  – OS graphics APIs, sound, input, etc
Software Dependencies
                    Gears of War
                   Gameplay Code
            ~250,000 lines C++, script code




                   Unreal Engine 3
               Middleware Game Engine
               ~250,000 lines C++ code




                                                            …
                        Ogg                wx       ZLib
                                Speex
DirectX    OpenAL      Vorbis            Widgets    Data
                                Speech
Graphics    Audio      Music
                                Codec
                                         Window    Compr-
                       Codec             Library   ession
Game Development: Platforms

 The typical Unreal Engine 3 game will
  ship on:
  – Xbox 360
  – PlayStation 3
  – Windows
 Some will also ship on:
  – Linux
  – MacOS
What’s in a game?
The obvious:
 Rendering
 Pixel shading
 Physics simulation, collision detection
 Game world simulation
 Artificial intelligence, path finding

But it’s not just fun and games:
 Data persistence with versioning, streaming
 Distributed Computing (multiplayer game simulation)
 Visual content authoring tools
 Scripting and compiler technology
 User interfaces
Three Kinds of Code
 Gameplay Simulation
 Numeric Computation
 Shading
Gameplay Simulation
Gameplay Simulation
 Models the state of the game world as
  interacting objects evolve over time
 High-level, object-oriented code
 Written in C++ or scripting language
 Imperative programming style
 Usually garbage-collected
Gameplay Simulation – The Numbers

 30-60 updates (frames) per second
 ~1000 distinct gameplay classes
  – Contain imperative state
  – Contain member functions
  – Highly dynamic
 ~10,000 active gameplay objects
 Each time a gameplay object is updated, it
  typically touches 5-10 other objects
Numeric Computation
 Algorithms:
   – Scene graph traversal
   – Physics simulation
   – Collision Detection
   – Path Finding
   – Sound Propagation
 Low-level, high-performance code
 Written in C++ with SIMD intrinsics
 Essentially functional
   – Transforms a small input data set to a small output data
     set, making use of large constant data structures.
Shading
Shading
 Generates pixel and vertex attributes
 Written in HLSL/CG shading language
 Runs on the GPU
 Inherently data-parallel
  – Control flow is statically known
  – “Embarassingly Parallel”
  – Current GPU’s are 16-wide to 48-wide!
Shading in HLSL
Shading – The Numbers
 Game runs at 30 FPS @ 1280x720p
 ~5,000 visible objects
 ~10M pixels rendered per frame
  – Per-pixel lighting and shadowing requires multiple
    rendering passes per object and per-light
 Typical pixel shader is ~100 instructions long
 Shader FPU’s are 4-wide SIMD
 ~500 GFLOPS compute power
Three Kinds of Code


                Game          Numeric       Shading
                Simulation    Computation
Languages       C++, Scripting C++          CG, HLSL
CPU Budget      10%           90%           n/a
Lines of Code   250,000       250,000       10,000
FPU Usage       0.5 GFLOPS    5 GFLOPS      500 GFLOPS
What are the hard problems?
 Performance
   – When updating 10,000 objects at 60 FPS, everything is
     performance-sensitive
 Modularity
   – Very important with ~10-20 middleware libraries per game
 Reliability
   – Error-prone language / type system leads to wasted effort
     finding trivial bugs
   – Significantly impacts productivity
 Concurrency
   – Hardware supports 6-8 threads
   – C++ is ill-equipped for concurrency
Performance
Performance
 When updating 10,000 objects at 60 FPS,
  everything is performance-sensitive
 But:
  – Productivity is just as important
  – Will gladly sacrifice 10% of our performance
    for 10% higher productivity
  – We never use assembly language
 There is not a simple set of “hotspots” to
  optimize!
                     That’s all!
Modularity
Unreal’s game framework
   Gameplay
    module
                package UnrealEngine;

                class Actor
Base class of
                {
  gameplay         int Health;
   objects         void TakeDamage(int Amount)
                   {
                        Health = Health – Amount;
   Members              if (Health<0)
                               Die();
                   }
                }

                class Player extends Actor
                {
                   string PlayerName;
                   socket NetworkConnection;
                }
Game class hierarchy
Generic Game Framework
  Actor
     Player
     Enemy
     InventoryItem
        Weapon


Game-Specific Framework Extension
  Actor
  Player
     Enemy
         Dragon
         Troll
     InventoryItem
         Weapon
            Sword
            Crossbow
Software Frameworks
 The Problem:
   Users of a framework
   need to extend the functionality
   of the framework’s base classes!

 The workarounds:
  – Modify the source
     …and modify it again with each new version
  – Add references to payload classes, and
    dynamically cast them at runtime to the
    appropriate types.
Software Frameworks
 The Problem:
   Users of a framework
   want to extend the functionality
   of the framework’s base classes!

 The workarounds:
  – Modify the source
     …and modify it again with each new version
  – Add references to payload classes, and
    dynamically cast them at runtime to the
    appropriate types.
  – These are all error-prone:
    Can the compiler help us here?
What we would like to write…
Base Framework                      Extended Framework
package Engine;                     Package GearsOfWar extends Engine;

class Actor                         class Actor extends Engine.Actor
{                                   {
    int Health;                         // Here we can add new members
    …                                   // to the base class.
}                                       …
class Player extends Actor          }
{                                   class Player extends Engine.Player
    …                               {
}                                       // Thus virtually inherits from
class Inventory extends Actor           // GearsOfWar.Actor
{                                       …
    …                               }
}                                   class Gun extends GearsOfWar.Inventory
                                    {
                                        …
                                    }


           The basic goal:
              To extend an entire software framework’s class
              hierarchy in parallel, in an open-world system.
Reliability
             Or:
 If the compiler doesn’t beep,
   my program should work
Dynamic Failure in Mainstream Languages

Example (C#):
  Given a vertex array and an index array, we
  read and transform the indexed vertices into
  a new array.
Vertex[] Transform (Vertex[] Vertices, int[] Indices, Matrix m)
{
    Vertex[] Result = new Vertex[Indices.length];
    for(int i=0; i<Indices.length; i++)
          Result[i] = Transform(m,Vertices[Indices[i]]);
    return Result;
};



What can possibly go wrong?
Dynamic Failure in Mainstream Languages
                                             May contain indices
                                            outside of the range of
                                               the Vertex array

                                                                            May be NULL
         May be NULL          May be NULL




Vertex[] Transform (Vertex[] Vertices, int[] Indices, Matrix m)
{
    Vertex[] Result = new Vertex[Indices.length];
    for(int i=0; i<Indices.length; i++)
          Result[i] = Transform(m,Vertices[Indices[i]]);
    return Result;
};                     Could dereference
                         a null pointer       Array access
                                                             might be out
          Will the compiler
                                                              of bounds
        realize this can’t fail?




       Our code is littered with runtime failure cases,
       Yet the compiler remains silent!
Dynamic Failure in Mainstream Languages

Solved problems:
 Random memory overwrites
 Memory leaks

Solveable:
 Accessing arrays out-of-bounds
 Dereferencing null pointers
 Integer overflow
 Accessing uninitialized variables

   50% of the bugs in Unreal can be traced to these problems!
What we would like to write…
                                    An index buffer containing natural numbers less than n


                   An array of exactly known size


Universally quantify over
  all natural numbers




        Transform{n:nat}(Vertices:[n]Vertex, Indices:[]nat<n, m:Matrix):[]Vertex=
            for each(i in Indices)
               Transform(m,Vertices[i])




                                          The only possible failure mode:
     Haskell-style array
      comprehension                            divergence, if the call to
                                               Transform diverges.
How might this work?

 Dependent types
   int                              The Integers
   nat
   nat<n                     The Natural Numbers

                       The Natural Numbers less than n,
                          where n may be a variable!




 Dependent functions
   Sum(n:nat,xs:[n]int)=..                                Explicit type/value dependency
   a=Sum(3,[7,8,9])                                        between function parameters


 Universal quantification
  Sum{n:nat}(xs:[n]int)=..
  a=Sum([7,8,9])
How might this work?

 Separating the “pointer to t” concept
  from the “optional value of t” concept
     xp:^int                       A pointer to an integer
     xo:?int
     xpo:?^int                       An optional integer

                    An optional pointer to an integer!


 Comprehensions (a la Haskell),
  for safely traversing and generating
  collections
     Successors(xs:[]int):[]int=
         foreach(x in xs)
               x+1
How might this work?

A guarded casting mechanism for cases
  where need a safe “escape”:
          Here, we cast i to
 type of natural numbers bounded by
           the length of as,
       and bind the result to n                GetElement(as:[]string, i:int):string=
                                                   if(n:nat<as.length=i)
                                                         as[n]
               We can only access i                else
                within this context                      “Index Out of Bounds”



                       If the cast fails, we
                     execute the else-branch



All potential failure must be explicitly
  handled, but we lose no expressiveness.
Analysis of the Unreal code

 Usage of integer variables in Unreal:
   – 90% of integer variables in Unreal exist to index into arrays
       • 80% could be dependently-typed explicitly,
         guaranteeing safe array access without casting.
       • 10% would require casts upon array access.
   – The other 10% are used for:
       • Computing summary statistics
       • Encoding bit flags
       • Various forms of low-level hackery
 “For” loops in Unreal:
   – 40% are functional comprehensions
   – 50% are functional folds
Accessing uninitialized variables
   Can we make this work?
      class MyClass
      {
          const int a=c+1;
          const int b=7;
          const int c=b+1;
      }
      MyClass myvalue = new C; // What is myvalue.a?


    This is a frequent bug. Data structures are often rearranged,
    changing the initialization order.

   Lessons from Haskell:
     – Lazy evaluation enables correct out-of-order evaluation
     – Accessing circularly entailed values causes thunk reentry (divergence),
       rather than just returning the wrong value
   Lesson from Id90: Lenient evaluation is sufficient to guarantee this
Dynamic Failure: Conclusion

Reasonable type-system extensions could statically eliminate all:
 Out-of-bounds array access
 Null pointer dereference
 Integer overflow
 Accessing of uninitialized variables

See Haskell for excellent implementation of:
   – Comprehensions
   – Option types via Maybe
   – Non-NULL references via IORef, STRef
   – Out-of-order initialization
Integer overflow

The Natural Numbers
      data Nat = Zero | Succ Nat



Factoid: C# exposes more than 10 integer-like data
  types, none of which are those defined by
  (Pythagoras, 500BC).


In the future, can we get integers right?
Can we get integers right?

Neat Trick:
   In a machine word (size 2n), encode an integer ±2n-1 or a pointer to a
    variable-precision integer
   Thus “small” integers carry no storage cost
   Additional access cost is ~5 CPU instructions

But:
   A natural number bounded so as to index into an active array is
    guaranteed to fit within the machine word size (the array is the proof
    of this!) and thus requires no special encoding.
   Since ~80% of integers can dependently-typed to access into an
    array, the amortized cost is ~1 CPU instruction per integer operation.


                                       This could be a viable
                                              tradeoff
Concurrency
The C++/Java/C# Model:
     “Shared State Concurrency”

 The Idea:
  – Any thread can modify any state at any
    time.
  – All synchronization is explicit, manual.
  – No compile-time verification of
    correctness properties:
    • Deadlock-free
    • Race-free
The C++/Java/C# Model:
      “Shared State Concurrency”

 This is hard!
 How we cope in Unreal Engine 3:
  – 1 main thread responsible for doing all work we
    can’t hope to safely multithread
  – 1 heavyweight rendering thread
  – A pool of 4-6 helper threads
     • Dynamically allocate them to simple tasks.
  – “Program Very Carefully!”
 Huge productivity burden
 Scales poorly to thread counts
                  There must be a better way!
Three Kinds of Code: Revisited
 Gameplay Simulation
  – Gratuitous use of mutable state
  – 10,000’s of objects must be updated
  – Typical object update touches 5-10 other objects
 Numeric Computation
  – Computations are purely functional
  – But they use state locally during computations
 Shading
  – Already implicitly data parallel
Concurrency in Shading
 Look at the solution of CG/HLSL:
  – New programming language aimed at
    “Embarassingly Parallel” shader programming
  – Its constructs map naturally to a data-parallel
    implementation
  – Static control flow (conditionals supported via
    masking)
Concurrency in Shading
Conclusion: The problem of data-parallel concurrency is effectively solved(!)




     “Proof”: Xbox 360 games are running with 48-wide data shader
           programs utilizing half a Teraflop of compute power...
Concurrency in Numeric
              Computation
 These are essentially pure functional algorithms, but they
  operate locally on mutable state

 Haskell ST, STRef solution enables encapsulating local
  heaps and mutability within referentially-transparent code

 These are the building blocks for implicitly parallel
  programs

 Estimate ~80% of CPU effort in Unreal can be parallelized
  this way

                 In the future, we will write these
                   algorithms using referentially-
                   transparent constructs.
Numeric Computation Example:
       Collision Detection
A typical collision detection algorithm takes a line
  segment and determines when and where a point
  moving along that line will collide with a (constant)
  geometric dataset.
            struct vec3
            {
                float x,y,z;
            };
            struct hit
            {
                bool DidCollide;
                float Time;
                vec3 Location;
            };
            hit collide(vec3 start,vec3 end);

            Vec3 = data Vec3 float float float
            Hit   = data Hit float Vec3
            collide :: (vec3,vec3)->Maybe Hit
Numeric Computation Example:
      Collision Detection
 Since collisionCheck is effects-free, it may be
  executed in parallel with any other effects-free
  computations.
 Basic idea:
   – The programmer supplies effect annotations to the compiler.
   – The compiler verifies the annotations.     A pure function
                                                 (the default)
       collide(start:Vec3,end:Vec3):?Hit
                                              Effectful functions require
       print(s:string)[#imperative]:void         explicit annotations


   – Many viable implementations (Haskell’s Monadic effects,
     effect typing, etc)

                     In a concurrent world, imperative is
                               the wrong default!
Concurrency in Gameplay Simulation

This is the hardest problem…
 10,00’s of objects
 Each one contains mutable state
 Each one updated 30 times per second
 Each update touches 5-10 other objects
Manual synchronization (shared state concurrency)
                         is
            hopelessly intractible here.

Solutions?
   – Rewrite as referentially-transparent functions?
   – Message-passing concurrency?
   – Continue using the sequential, single-threaded approach?
Concurrency in Gameplay Simulation:
    Software Transactional Memory

See “Composable memory transactions”;
  Harris, Marlow, Peyton-Jones, Herlihy

The idea:
 Update all objects concurrently in arbitrary order,
  with each update wrapped in an atomic {...} block
 With 10,000’s of updates, and 5-10 objects touched per
  update, collisions will be low
 ~2-4X STM performance overhead is acceptable:
  if it enables our state-intensive code to scale to many threads,
  it’s still a win



            Claim: Transactions are the only plausible
                solution to concurrent mutable state
Three Kinds of Code: Revisited


                Game          Numeric       Shading
                Simulation    Computation
Languages       C++, Scripting C++          CG, HLSL
CPU Budget      10%           90%           n/a
Lines of Code   250,000       250,000       10,000
FPU Usage       0.5 GFLOPS    5 GFLOPS      500 GFLOPS
Parallelism     Software      Implicit      Implicit Data
                Transactional Thread        Parallelism
                Memory        Parallelism
Parallelism and purity
                   Physics, collision detection,
                 scene traversal, path finding, ..
                                                     Game World State
Graphics shader programs




                           Data Parallel Subset


                       Purely functional core

              Software Transactional Memory
Musings
On the Next Maintream Programming Language
Musings
There is a wonderful correspondence between:
 Features that aid reliability
 Features that enable concurrency.

Example:
 Outlawing runtime exceptions through dependent types
   – Out of bounds array access
   – Null pointer dereference
   – Integer overflow
   Exceptions impose sequencing constraints on concurrent execution.

              Dependent types and concurrency must
                      evolve simultaneously
Language Implications

Evaluation Strategy
 Lenient evaluation is the right default.
 Support lazy evaluation through explicit
  suspend/evaluate constructs.
 Eager evaluation is an optimization the compiler may
  perform when it is safe to do so.
Language Implications

Effects Model
 Purely Functional is the right default
 Imperative constructs are vital features
  that must be exposed through explicit
  effects-typing constructs
 Exceptions are an effect


                Why not go one step further and define
                 partiality as an effect, thus creating a
                  foundational language subset suitable
                                for proofs?
Performance – Language Implications

Memory model
  – Garbage collection should be the only option


Exception Model
  – The Java/C# “exceptions everywhere” model
    should be wholly abandoned
     • All dereference and array accesses must be statically
       verifyable, rather than causing sequenced exceptions
  – No language construct except “throw” should
    generate an exception
Syntax

Requirement:
 Must not scare away mainstream programmers.
 Lots of options.
                                                    C Family: Least scary,
     int f{nat n}(int[] as,natrange<n> i)           but it’s a messy legacy
     {
         return as[i];
     }



                                                Haskell family: Quite scary :-)
     f :: forall n::nat. ([int],nat<n) -> int
     f (xs,i) = xs !! i


                                                         Pascal/ML family:
     f{n:nat}(as:[]int,i:nat<n)=as[i]                    Seems promising
Conclusion
A Brief History of Game Technology
    1972 Pong (hardware)


    1980 Zork (high level interpretted language)


    1993 DOOM (C)


    1998 Unreal (C++, Java-style scripting)


    2005-6 Xbox 360, PlayStation 3
    with 6-8 hardware threads


    2009 Next console generation. Unification of the
    CPU, GPU. Massive multi-core, data parallelism, etc.
The Coming Crisis in Computing

 By 2009, game developers will face…
 CPU’s with:
  – 20+ cores
  – 80+ hardware threads
  – >1 TFLOP of computing power
 GPU’s with general computing capabilities.
 Game developers will be at the forefront.
 If we are to program these devices
  productively, you are our only hope!
Questions?
Backup Slides
The Genius of Haskell

 Algebraic Datatypes
  – Unions done right
    Compare to: C unions, Java union-like class
    hierarchies
  – Maybe t
    C/Java option types are coupled to
    pointer/reference types
 IO, ST
  – With STRef, you can write a pure function that
    uses heaps and mutable state locally, verifyably
    guaranteeing that those effects remain local.
The Genius of Haskell

    Comprehensions
                                          Sorting in C
                                          int partition(int y[], int f, int l);
                                          void quicksort(int x[], int first, int last) {
                                              int pivIndex = 0;
                                              if(first < last) {
                                                   pivIndex = partition(x,first, last);
                                                   quicksort(x,first,(pivIndex-1));


Sorting in Haskell
                                                   quicksort(x,(pivIndex+1),last);
                                              }
                                          }
                                          int partition(int y[], int f, int l) {
                                              int up,down,temp;
sort []     = []                              int cc;
sort (x:xs) = sort [y | y<-xs, y<x ] ++       int piv = y[f];
                                              up = f;
                   [x              ] ++       down = l;
              sort [y | y<-xs, y>=x]          do {
                                                   while (y[up] <= piv && up < l) {
                                                       up++;
                                                   }
                                                   while (y[down] > piv ) {
                                                       down--;
                                                   }
                                                   if (up < down ) {
                                                       temp = y[up];
                                                       y[up] = y[down];
                                                       y[down] = temp;
                                                   }
                                              } while (down > up);
                                              temp = piv;
                                              y[f] = y[down];
                                              y[down] = piv;
                                              return down;
                                          }
Why Haskell is Not My Favorite
       Programming Language

 The syntax is … scary
 Lazy evaluation is a costly default
  – But eager evaluation is too limiting
  – Lenient evaluation would be an interesting default
 Lists are the syntactically preferred
  sequence type
  – In the absence of lazy evaluation, arrays seem
    preferable
Why Haskell is Not My Favorite
         Programming Language

 Type inference doesn’t scale
   – To large hierarchies of open-world
     modules
   – To type system extensions
   – To system-wide error propagation
f(x,y) = x+y
a=f(3,”4”)
                       …   ERROR - Cannot infer instance
                           *** Instance   : Num [Char]
                                                                         ???
                           *** Expression : f (3,"4")


f(int x,int y) = x+y
a=f(3,”4”)
                       …   Parameter mismatch paremter 2 of call to f:
                              Expected: int
                              Got:      “4”

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Java tutorials
Java tutorialsJava tutorials
Java tutorials
 
Playfulness at Work
Playfulness at WorkPlayfulness at Work
Playfulness at Work
 
Your Own Metric System
Your Own Metric SystemYour Own Metric System
Your Own Metric System
 
A Survey of Concurrency Constructs
A Survey of Concurrency ConstructsA Survey of Concurrency Constructs
A Survey of Concurrency Constructs
 
Java Basics
Java BasicsJava Basics
Java Basics
 
What`s New in Java 8
What`s New in Java 8What`s New in Java 8
What`s New in Java 8
 
Attention mechanisms with tensorflow
Attention mechanisms with tensorflowAttention mechanisms with tensorflow
Attention mechanisms with tensorflow
 
Introduction to Functional Programming with Scala
Introduction to Functional Programming with ScalaIntroduction to Functional Programming with Scala
Introduction to Functional Programming with Scala
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance Tuning
 
Climb - Property-based dispatch in functional languages [Report]
Climb - Property-based dispatch in functional languages [Report]Climb - Property-based dispatch in functional languages [Report]
Climb - Property-based dispatch in functional languages [Report]
 
Pizza compiler
Pizza compilerPizza compiler
Pizza compiler
 
Erlang session2
Erlang session2Erlang session2
Erlang session2
 
Introduction to java Programming
Introduction to java ProgrammingIntroduction to java Programming
Introduction to java Programming
 
Autoencoders
AutoencodersAutoencoders
Autoencoders
 
Behavioral Reflection
Behavioral ReflectionBehavioral Reflection
Behavioral Reflection
 
Learn Java Part 2
Learn Java Part 2Learn Java Part 2
Learn Java Part 2
 
Presentation to java
Presentation  to  javaPresentation  to  java
Presentation to java
 
Java Programming
Java ProgrammingJava Programming
Java Programming
 
Java Tutorial
Java Tutorial Java Tutorial
Java Tutorial
 
Java Tutorial | My Heart
Java Tutorial | My HeartJava Tutorial | My Heart
Java Tutorial | My Heart
 

Destacado

מחברת וירטואלית, ביולוגיה, תש
מחברת וירטואלית, ביולוגיה, תשמחברת וירטואלית, ביולוגיה, תש
מחברת וירטואלית, ביולוגיה, תשתוכנית נחשון
 
מחברת וירטואלית, ביולוגיה
מחברת וירטואלית, ביולוגיהמחברת וירטואלית, ביולוגיה
מחברת וירטואלית, ביולוגיהתוכנית נחשון
 
Dev party 2014 - AWS & JS
Dev party 2014 - AWS & JSDev party 2014 - AWS & JS
Dev party 2014 - AWS & JSCorley S.r.l.
 
Cloud computing & lamp applications
Cloud computing & lamp applicationsCloud computing & lamp applications
Cloud computing & lamp applicationsCorley S.r.l.
 
Chromecast - DevParty Torino 2014
Chromecast - DevParty Torino 2014Chromecast - DevParty Torino 2014
Chromecast - DevParty Torino 2014Corley S.r.l.
 
Symfony2 Specification by examples
Symfony2   Specification by examplesSymfony2   Specification by examples
Symfony2 Specification by examplesCorley S.r.l.
 
Protecting Our Trading Partners
Protecting Our Trading PartnersProtecting Our Trading Partners
Protecting Our Trading Partnersnakenatter
 
Php & cloud computing
Php & cloud computingPhp & cloud computing
Php & cloud computingCorley S.r.l.
 

Destacado (8)

מחברת וירטואלית, ביולוגיה, תש
מחברת וירטואלית, ביולוגיה, תשמחברת וירטואלית, ביולוגיה, תש
מחברת וירטואלית, ביולוגיה, תש
 
מחברת וירטואלית, ביולוגיה
מחברת וירטואלית, ביולוגיהמחברת וירטואלית, ביולוגיה
מחברת וירטואלית, ביולוגיה
 
Dev party 2014 - AWS & JS
Dev party 2014 - AWS & JSDev party 2014 - AWS & JS
Dev party 2014 - AWS & JS
 
Cloud computing & lamp applications
Cloud computing & lamp applicationsCloud computing & lamp applications
Cloud computing & lamp applications
 
Chromecast - DevParty Torino 2014
Chromecast - DevParty Torino 2014Chromecast - DevParty Torino 2014
Chromecast - DevParty Torino 2014
 
Symfony2 Specification by examples
Symfony2   Specification by examplesSymfony2   Specification by examples
Symfony2 Specification by examples
 
Protecting Our Trading Partners
Protecting Our Trading PartnersProtecting Our Trading Partners
Protecting Our Trading Partners
 
Php & cloud computing
Php & cloud computingPhp & cloud computing
Php & cloud computing
 

Similar a Game development

02 direct3 d_pipeline
02 direct3 d_pipeline02 direct3 d_pipeline
02 direct3 d_pipelineGirish Ghate
 
Extension and Evolution
Extension and EvolutionExtension and Evolution
Extension and EvolutionEelco Visser
 
Gdc 14 bringing unreal engine 4 to open_gl
Gdc 14 bringing unreal engine 4 to open_glGdc 14 bringing unreal engine 4 to open_gl
Gdc 14 bringing unreal engine 4 to open_glchangehee lee
 
고급컴파일러구성론_개레_230303.pptx
고급컴파일러구성론_개레_230303.pptx고급컴파일러구성론_개레_230303.pptx
고급컴파일러구성론_개레_230303.pptxssuser1e7611
 
Unmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeUnmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeDmitri Nesteruk
 
Minko - Targeting Flash/Stage3D with C++ and GLSL
Minko - Targeting Flash/Stage3D with C++ and GLSLMinko - Targeting Flash/Stage3D with C++ and GLSL
Minko - Targeting Flash/Stage3D with C++ and GLSLMinko3D
 
The Ring programming language version 1.9 book - Part 58 of 210
The Ring programming language version 1.9 book - Part 58 of 210The Ring programming language version 1.9 book - Part 58 of 210
The Ring programming language version 1.9 book - Part 58 of 210Mahmoud Samir Fayed
 
CS 354 Programmable Shading
CS 354 Programmable ShadingCS 354 Programmable Shading
CS 354 Programmable ShadingMark Kilgard
 
Porting VisualWorks code to Pharo
Porting VisualWorks code to PharoPorting VisualWorks code to Pharo
Porting VisualWorks code to PharoESUG
 
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...Stefan Marr
 
Hacking with Reverse Engineering and Defense against it
Hacking with Reverse Engineering and Defense against it Hacking with Reverse Engineering and Defense against it
Hacking with Reverse Engineering and Defense against it Prakashchand Suthar
 
Standardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for PythonStandardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for PythonRalf Gommers
 
Scala clojure techday_2011
Scala clojure techday_2011Scala clojure techday_2011
Scala clojure techday_2011Thadeu Russo
 
Skiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DSkiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DMithun Hunsur
 
Reverse code engineering
Reverse code engineeringReverse code engineering
Reverse code engineeringKrishs Patil
 
Native client (Евгений Эльцин)
Native client (Евгений Эльцин)Native client (Евгений Эльцин)
Native client (Евгений Эльцин)Ontico
 

Similar a Game development (20)

02 direct3 d_pipeline
02 direct3 d_pipeline02 direct3 d_pipeline
02 direct3 d_pipeline
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
Extension and Evolution
Extension and EvolutionExtension and Evolution
Extension and Evolution
 
Gdc 14 bringing unreal engine 4 to open_gl
Gdc 14 bringing unreal engine 4 to open_glGdc 14 bringing unreal engine 4 to open_gl
Gdc 14 bringing unreal engine 4 to open_gl
 
고급컴파일러구성론_개레_230303.pptx
고급컴파일러구성론_개레_230303.pptx고급컴파일러구성론_개레_230303.pptx
고급컴파일러구성론_개레_230303.pptx
 
MXNet Workshop
MXNet WorkshopMXNet Workshop
MXNet Workshop
 
Unmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeUnmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/Invoke
 
NvFX GTC 2013
NvFX GTC 2013NvFX GTC 2013
NvFX GTC 2013
 
Minko - Targeting Flash/Stage3D with C++ and GLSL
Minko - Targeting Flash/Stage3D with C++ and GLSLMinko - Targeting Flash/Stage3D with C++ and GLSL
Minko - Targeting Flash/Stage3D with C++ and GLSL
 
The Ring programming language version 1.9 book - Part 58 of 210
The Ring programming language version 1.9 book - Part 58 of 210The Ring programming language version 1.9 book - Part 58 of 210
The Ring programming language version 1.9 book - Part 58 of 210
 
CS 354 Programmable Shading
CS 354 Programmable ShadingCS 354 Programmable Shading
CS 354 Programmable Shading
 
Porting VisualWorks code to Pharo
Porting VisualWorks code to PharoPorting VisualWorks code to Pharo
Porting VisualWorks code to Pharo
 
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
Metaprogramming, Metaobject Protocols, Gradual Type Checks: Optimizing the "U...
 
Hacking with Reverse Engineering and Defense against it
Hacking with Reverse Engineering and Defense against it Hacking with Reverse Engineering and Defense against it
Hacking with Reverse Engineering and Defense against it
 
Standardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for PythonStandardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for Python
 
Scala clojure techday_2011
Scala clojure techday_2011Scala clojure techday_2011
Scala clojure techday_2011
 
Skiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in DSkiron - Experiments in CPU Design in D
Skiron - Experiments in CPU Design in D
 
Reverse code engineering
Reverse code engineeringReverse code engineering
Reverse code engineering
 
Native client (Евгений Эльцин)
Native client (Евгений Эльцин)Native client (Евгений Эльцин)
Native client (Евгений Эльцин)
 

Último

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 

Último (20)

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 

Game development

  • 1. The Next Mainstream Programming Language: A Game Developer’s Perspective Tim Sweeney Epic Games
  • 2. Outline  Game Development – Typical Process  What’s in a game? – Game Simulation – Numeric Computation – Shading  Where are today’s languages failing? – Concurrency – Reliability
  • 4. Game Development: Gears of War  Resources – ~10 programmers – ~20 artists – ~24 month development cycle – ~$10M budget  Software Dependencies – 1 middleware game engine – ~20 middleware libraries – OS graphics APIs, sound, input, etc
  • 5. Software Dependencies Gears of War Gameplay Code ~250,000 lines C++, script code Unreal Engine 3 Middleware Game Engine ~250,000 lines C++ code … Ogg wx ZLib Speex DirectX OpenAL Vorbis Widgets Data Speech Graphics Audio Music Codec Window Compr- Codec Library ession
  • 6. Game Development: Platforms  The typical Unreal Engine 3 game will ship on: – Xbox 360 – PlayStation 3 – Windows  Some will also ship on: – Linux – MacOS
  • 7. What’s in a game? The obvious:  Rendering  Pixel shading  Physics simulation, collision detection  Game world simulation  Artificial intelligence, path finding But it’s not just fun and games:  Data persistence with versioning, streaming  Distributed Computing (multiplayer game simulation)  Visual content authoring tools  Scripting and compiler technology  User interfaces
  • 8. Three Kinds of Code  Gameplay Simulation  Numeric Computation  Shading
  • 10. Gameplay Simulation  Models the state of the game world as interacting objects evolve over time  High-level, object-oriented code  Written in C++ or scripting language  Imperative programming style  Usually garbage-collected
  • 11. Gameplay Simulation – The Numbers  30-60 updates (frames) per second  ~1000 distinct gameplay classes – Contain imperative state – Contain member functions – Highly dynamic  ~10,000 active gameplay objects  Each time a gameplay object is updated, it typically touches 5-10 other objects
  • 12. Numeric Computation  Algorithms: – Scene graph traversal – Physics simulation – Collision Detection – Path Finding – Sound Propagation  Low-level, high-performance code  Written in C++ with SIMD intrinsics  Essentially functional – Transforms a small input data set to a small output data set, making use of large constant data structures.
  • 14. Shading  Generates pixel and vertex attributes  Written in HLSL/CG shading language  Runs on the GPU  Inherently data-parallel – Control flow is statically known – “Embarassingly Parallel” – Current GPU’s are 16-wide to 48-wide!
  • 16. Shading – The Numbers  Game runs at 30 FPS @ 1280x720p  ~5,000 visible objects  ~10M pixels rendered per frame – Per-pixel lighting and shadowing requires multiple rendering passes per object and per-light  Typical pixel shader is ~100 instructions long  Shader FPU’s are 4-wide SIMD  ~500 GFLOPS compute power
  • 17. Three Kinds of Code Game Numeric Shading Simulation Computation Languages C++, Scripting C++ CG, HLSL CPU Budget 10% 90% n/a Lines of Code 250,000 250,000 10,000 FPU Usage 0.5 GFLOPS 5 GFLOPS 500 GFLOPS
  • 18. What are the hard problems?  Performance – When updating 10,000 objects at 60 FPS, everything is performance-sensitive  Modularity – Very important with ~10-20 middleware libraries per game  Reliability – Error-prone language / type system leads to wasted effort finding trivial bugs – Significantly impacts productivity  Concurrency – Hardware supports 6-8 threads – C++ is ill-equipped for concurrency
  • 20. Performance  When updating 10,000 objects at 60 FPS, everything is performance-sensitive  But: – Productivity is just as important – Will gladly sacrifice 10% of our performance for 10% higher productivity – We never use assembly language  There is not a simple set of “hotspots” to optimize! That’s all!
  • 22. Unreal’s game framework Gameplay module package UnrealEngine; class Actor Base class of { gameplay int Health; objects void TakeDamage(int Amount) { Health = Health – Amount; Members if (Health<0) Die(); } } class Player extends Actor { string PlayerName; socket NetworkConnection; }
  • 23. Game class hierarchy Generic Game Framework Actor Player Enemy InventoryItem Weapon Game-Specific Framework Extension Actor Player Enemy Dragon Troll InventoryItem Weapon Sword Crossbow
  • 24. Software Frameworks  The Problem: Users of a framework need to extend the functionality of the framework’s base classes!  The workarounds: – Modify the source …and modify it again with each new version – Add references to payload classes, and dynamically cast them at runtime to the appropriate types.
  • 25. Software Frameworks  The Problem: Users of a framework want to extend the functionality of the framework’s base classes!  The workarounds: – Modify the source …and modify it again with each new version – Add references to payload classes, and dynamically cast them at runtime to the appropriate types. – These are all error-prone: Can the compiler help us here?
  • 26. What we would like to write… Base Framework Extended Framework package Engine; Package GearsOfWar extends Engine; class Actor class Actor extends Engine.Actor { { int Health; // Here we can add new members … // to the base class. } … class Player extends Actor } { class Player extends Engine.Player … { } // Thus virtually inherits from class Inventory extends Actor // GearsOfWar.Actor { … … } } class Gun extends GearsOfWar.Inventory { … } The basic goal: To extend an entire software framework’s class hierarchy in parallel, in an open-world system.
  • 27. Reliability Or: If the compiler doesn’t beep, my program should work
  • 28. Dynamic Failure in Mainstream Languages Example (C#): Given a vertex array and an index array, we read and transform the indexed vertices into a new array. Vertex[] Transform (Vertex[] Vertices, int[] Indices, Matrix m) { Vertex[] Result = new Vertex[Indices.length]; for(int i=0; i<Indices.length; i++) Result[i] = Transform(m,Vertices[Indices[i]]); return Result; }; What can possibly go wrong?
  • 29. Dynamic Failure in Mainstream Languages May contain indices outside of the range of the Vertex array May be NULL May be NULL May be NULL Vertex[] Transform (Vertex[] Vertices, int[] Indices, Matrix m) { Vertex[] Result = new Vertex[Indices.length]; for(int i=0; i<Indices.length; i++) Result[i] = Transform(m,Vertices[Indices[i]]); return Result; }; Could dereference a null pointer Array access might be out Will the compiler of bounds realize this can’t fail? Our code is littered with runtime failure cases, Yet the compiler remains silent!
  • 30. Dynamic Failure in Mainstream Languages Solved problems:  Random memory overwrites  Memory leaks Solveable:  Accessing arrays out-of-bounds  Dereferencing null pointers  Integer overflow  Accessing uninitialized variables 50% of the bugs in Unreal can be traced to these problems!
  • 31. What we would like to write… An index buffer containing natural numbers less than n An array of exactly known size Universally quantify over all natural numbers Transform{n:nat}(Vertices:[n]Vertex, Indices:[]nat<n, m:Matrix):[]Vertex= for each(i in Indices) Transform(m,Vertices[i]) The only possible failure mode: Haskell-style array comprehension divergence, if the call to Transform diverges.
  • 32. How might this work?  Dependent types int The Integers nat nat<n The Natural Numbers The Natural Numbers less than n, where n may be a variable!  Dependent functions Sum(n:nat,xs:[n]int)=.. Explicit type/value dependency a=Sum(3,[7,8,9]) between function parameters  Universal quantification Sum{n:nat}(xs:[n]int)=.. a=Sum([7,8,9])
  • 33. How might this work?  Separating the “pointer to t” concept from the “optional value of t” concept xp:^int A pointer to an integer xo:?int xpo:?^int An optional integer An optional pointer to an integer!  Comprehensions (a la Haskell), for safely traversing and generating collections Successors(xs:[]int):[]int= foreach(x in xs) x+1
  • 34. How might this work? A guarded casting mechanism for cases where need a safe “escape”: Here, we cast i to type of natural numbers bounded by the length of as, and bind the result to n GetElement(as:[]string, i:int):string= if(n:nat<as.length=i) as[n] We can only access i else within this context “Index Out of Bounds” If the cast fails, we execute the else-branch All potential failure must be explicitly handled, but we lose no expressiveness.
  • 35. Analysis of the Unreal code  Usage of integer variables in Unreal: – 90% of integer variables in Unreal exist to index into arrays • 80% could be dependently-typed explicitly, guaranteeing safe array access without casting. • 10% would require casts upon array access. – The other 10% are used for: • Computing summary statistics • Encoding bit flags • Various forms of low-level hackery  “For” loops in Unreal: – 40% are functional comprehensions – 50% are functional folds
  • 36. Accessing uninitialized variables  Can we make this work? class MyClass { const int a=c+1; const int b=7; const int c=b+1; } MyClass myvalue = new C; // What is myvalue.a? This is a frequent bug. Data structures are often rearranged, changing the initialization order.  Lessons from Haskell: – Lazy evaluation enables correct out-of-order evaluation – Accessing circularly entailed values causes thunk reentry (divergence), rather than just returning the wrong value  Lesson from Id90: Lenient evaluation is sufficient to guarantee this
  • 37. Dynamic Failure: Conclusion Reasonable type-system extensions could statically eliminate all:  Out-of-bounds array access  Null pointer dereference  Integer overflow  Accessing of uninitialized variables See Haskell for excellent implementation of: – Comprehensions – Option types via Maybe – Non-NULL references via IORef, STRef – Out-of-order initialization
  • 38. Integer overflow The Natural Numbers data Nat = Zero | Succ Nat Factoid: C# exposes more than 10 integer-like data types, none of which are those defined by (Pythagoras, 500BC). In the future, can we get integers right?
  • 39. Can we get integers right? Neat Trick:  In a machine word (size 2n), encode an integer ±2n-1 or a pointer to a variable-precision integer  Thus “small” integers carry no storage cost  Additional access cost is ~5 CPU instructions But:  A natural number bounded so as to index into an active array is guaranteed to fit within the machine word size (the array is the proof of this!) and thus requires no special encoding.  Since ~80% of integers can dependently-typed to access into an array, the amortized cost is ~1 CPU instruction per integer operation. This could be a viable tradeoff
  • 41. The C++/Java/C# Model: “Shared State Concurrency”  The Idea: – Any thread can modify any state at any time. – All synchronization is explicit, manual. – No compile-time verification of correctness properties: • Deadlock-free • Race-free
  • 42. The C++/Java/C# Model: “Shared State Concurrency”  This is hard!  How we cope in Unreal Engine 3: – 1 main thread responsible for doing all work we can’t hope to safely multithread – 1 heavyweight rendering thread – A pool of 4-6 helper threads • Dynamically allocate them to simple tasks. – “Program Very Carefully!”  Huge productivity burden  Scales poorly to thread counts There must be a better way!
  • 43. Three Kinds of Code: Revisited  Gameplay Simulation – Gratuitous use of mutable state – 10,000’s of objects must be updated – Typical object update touches 5-10 other objects  Numeric Computation – Computations are purely functional – But they use state locally during computations  Shading – Already implicitly data parallel
  • 44. Concurrency in Shading  Look at the solution of CG/HLSL: – New programming language aimed at “Embarassingly Parallel” shader programming – Its constructs map naturally to a data-parallel implementation – Static control flow (conditionals supported via masking)
  • 45. Concurrency in Shading Conclusion: The problem of data-parallel concurrency is effectively solved(!) “Proof”: Xbox 360 games are running with 48-wide data shader programs utilizing half a Teraflop of compute power...
  • 46. Concurrency in Numeric Computation  These are essentially pure functional algorithms, but they operate locally on mutable state  Haskell ST, STRef solution enables encapsulating local heaps and mutability within referentially-transparent code  These are the building blocks for implicitly parallel programs  Estimate ~80% of CPU effort in Unreal can be parallelized this way In the future, we will write these algorithms using referentially- transparent constructs.
  • 47. Numeric Computation Example: Collision Detection A typical collision detection algorithm takes a line segment and determines when and where a point moving along that line will collide with a (constant) geometric dataset. struct vec3 { float x,y,z; }; struct hit { bool DidCollide; float Time; vec3 Location; }; hit collide(vec3 start,vec3 end); Vec3 = data Vec3 float float float Hit = data Hit float Vec3 collide :: (vec3,vec3)->Maybe Hit
  • 48. Numeric Computation Example: Collision Detection  Since collisionCheck is effects-free, it may be executed in parallel with any other effects-free computations.  Basic idea: – The programmer supplies effect annotations to the compiler. – The compiler verifies the annotations. A pure function (the default) collide(start:Vec3,end:Vec3):?Hit Effectful functions require print(s:string)[#imperative]:void explicit annotations – Many viable implementations (Haskell’s Monadic effects, effect typing, etc) In a concurrent world, imperative is the wrong default!
  • 49. Concurrency in Gameplay Simulation This is the hardest problem…  10,00’s of objects  Each one contains mutable state  Each one updated 30 times per second  Each update touches 5-10 other objects Manual synchronization (shared state concurrency) is hopelessly intractible here. Solutions? – Rewrite as referentially-transparent functions? – Message-passing concurrency? – Continue using the sequential, single-threaded approach?
  • 50. Concurrency in Gameplay Simulation: Software Transactional Memory See “Composable memory transactions”; Harris, Marlow, Peyton-Jones, Herlihy The idea:  Update all objects concurrently in arbitrary order, with each update wrapped in an atomic {...} block  With 10,000’s of updates, and 5-10 objects touched per update, collisions will be low  ~2-4X STM performance overhead is acceptable: if it enables our state-intensive code to scale to many threads, it’s still a win Claim: Transactions are the only plausible solution to concurrent mutable state
  • 51. Three Kinds of Code: Revisited Game Numeric Shading Simulation Computation Languages C++, Scripting C++ CG, HLSL CPU Budget 10% 90% n/a Lines of Code 250,000 250,000 10,000 FPU Usage 0.5 GFLOPS 5 GFLOPS 500 GFLOPS Parallelism Software Implicit Implicit Data Transactional Thread Parallelism Memory Parallelism
  • 52. Parallelism and purity Physics, collision detection, scene traversal, path finding, .. Game World State Graphics shader programs Data Parallel Subset Purely functional core Software Transactional Memory
  • 53. Musings On the Next Maintream Programming Language
  • 54. Musings There is a wonderful correspondence between:  Features that aid reliability  Features that enable concurrency. Example:  Outlawing runtime exceptions through dependent types – Out of bounds array access – Null pointer dereference – Integer overflow Exceptions impose sequencing constraints on concurrent execution. Dependent types and concurrency must evolve simultaneously
  • 55. Language Implications Evaluation Strategy  Lenient evaluation is the right default.  Support lazy evaluation through explicit suspend/evaluate constructs.  Eager evaluation is an optimization the compiler may perform when it is safe to do so.
  • 56. Language Implications Effects Model  Purely Functional is the right default  Imperative constructs are vital features that must be exposed through explicit effects-typing constructs  Exceptions are an effect Why not go one step further and define partiality as an effect, thus creating a foundational language subset suitable for proofs?
  • 57. Performance – Language Implications Memory model – Garbage collection should be the only option Exception Model – The Java/C# “exceptions everywhere” model should be wholly abandoned • All dereference and array accesses must be statically verifyable, rather than causing sequenced exceptions – No language construct except “throw” should generate an exception
  • 58. Syntax Requirement:  Must not scare away mainstream programmers.  Lots of options. C Family: Least scary, int f{nat n}(int[] as,natrange<n> i) but it’s a messy legacy { return as[i]; } Haskell family: Quite scary :-) f :: forall n::nat. ([int],nat<n) -> int f (xs,i) = xs !! i Pascal/ML family: f{n:nat}(as:[]int,i:nat<n)=as[i] Seems promising
  • 60. A Brief History of Game Technology 1972 Pong (hardware) 1980 Zork (high level interpretted language) 1993 DOOM (C) 1998 Unreal (C++, Java-style scripting) 2005-6 Xbox 360, PlayStation 3 with 6-8 hardware threads 2009 Next console generation. Unification of the CPU, GPU. Massive multi-core, data parallelism, etc.
  • 61. The Coming Crisis in Computing  By 2009, game developers will face…  CPU’s with: – 20+ cores – 80+ hardware threads – >1 TFLOP of computing power  GPU’s with general computing capabilities.  Game developers will be at the forefront.  If we are to program these devices productively, you are our only hope!
  • 64. The Genius of Haskell  Algebraic Datatypes – Unions done right Compare to: C unions, Java union-like class hierarchies – Maybe t C/Java option types are coupled to pointer/reference types  IO, ST – With STRef, you can write a pure function that uses heaps and mutable state locally, verifyably guaranteeing that those effects remain local.
  • 65. The Genius of Haskell  Comprehensions Sorting in C int partition(int y[], int f, int l); void quicksort(int x[], int first, int last) { int pivIndex = 0; if(first < last) { pivIndex = partition(x,first, last); quicksort(x,first,(pivIndex-1)); Sorting in Haskell quicksort(x,(pivIndex+1),last); } } int partition(int y[], int f, int l) { int up,down,temp; sort [] = [] int cc; sort (x:xs) = sort [y | y<-xs, y<x ] ++ int piv = y[f]; up = f; [x ] ++ down = l; sort [y | y<-xs, y>=x] do { while (y[up] <= piv && up < l) { up++; } while (y[down] > piv ) { down--; } if (up < down ) { temp = y[up]; y[up] = y[down]; y[down] = temp; } } while (down > up); temp = piv; y[f] = y[down]; y[down] = piv; return down; }
  • 66. Why Haskell is Not My Favorite Programming Language  The syntax is … scary  Lazy evaluation is a costly default – But eager evaluation is too limiting – Lenient evaluation would be an interesting default  Lists are the syntactically preferred sequence type – In the absence of lazy evaluation, arrays seem preferable
  • 67. Why Haskell is Not My Favorite Programming Language  Type inference doesn’t scale – To large hierarchies of open-world modules – To type system extensions – To system-wide error propagation f(x,y) = x+y a=f(3,”4”) … ERROR - Cannot infer instance *** Instance : Num [Char] ??? *** Expression : f (3,"4") f(int x,int y) = x+y a=f(3,”4”) … Parameter mismatch paremter 2 of call to f: Expected: int Got: “4”