csce 552 spring 2010 language and programming by jijun tang
TRANSCRIPT
CSCE 552 Spring 2010
Language and Programming
By Jijun Tang
Announcements
Send me group names and logos XNA demo/learning on Feb 1st, in 1D11
Install XNA Game Studio and VC# Express on your laptop
Please bring your laptop to the class Presentation on Feb 3rd
In 1D11 Each group 10 minutes to present, 3 minutes to
answer question Homework #1
Game Design Presentation
Expecting formal presentations with powerpoint files, pictures, musics, etc
10 points total for this presentation Grade will be group based, you can have
the whole group or part of the group to present
Grade will be based on scores from me and from the class
Homework #1
Game Treatment Document Due on Feb 8th after class Each group turn in one hard copy and
the grade will be assigned based on group
Example of Treatment
http://www.csc.kth.se/utbildning/kth/kurser/DH2650/spel08/The%20Game%20Treatment.doc
Design Procedure
Waterfall method Development methodology Design and production are broken into phases
Iterative development Practice of producing things incrementally Refining and re-refining the product May iterate many cycles before get it right
Waterfall vs. Iterative
testing
Brainstorming Generating ideas without discrimination Evaluation after elaboration, can be
unfocused
Programming Teams
In the 1980s programmers developed the whole game (and did the art and sounds too!)
Now programmers write code to support designers and artists (content creators)
Different Programs
Game codeAnything related directly to the game
Game engineAny code that can be reused between
different games Tools
In house tools
Plug-ins for off-the-shelf tools
Methodologies: Code and Fix
Unfortunately very common Little or no planning Always reacting to events Poor quality and unreliability of finished
product “Crunch” time normal
Methodologies: Waterfall
Very well-defined steps in development Lots of planning ahead of time Great for creating a detailed milestone
schedule Doesn't react well to changes Game development is too unpredictable
for this approach
Methodologies: Iterative
Multiple development cycles during a single project Each delivering a new set of functionality Refinements are needed
The game could ship at any moment Allows for planning but also for changes
Methodologies: Agile Methods
Deal with the unexpected Very short iterations: 2-3 weeks Iterate based on feedback of what was
learned so far Very good visibility of state of game Difficult for publishers or even
developers to adopt because it's relatively new
Make Coding Easier
Version control Coding standards Automated build Code review Unit testing and acceptance testing
Version Control
Recommended to use for team project Version control is
Database with all the files and history. Only way to work properly with a team. Branching and merging can be very useful Used for source code as well as game assets (text
and binary) Tools:
CVS is one of the most popular tool Source anywhere
Coding standards
Coding standards are Set of coding rules for the whole team to follow Improves readability and maintainability of the code Easier to work with other people's code They vary a lot from place to place
Some simple, some complex Get used to different styles
Sample standards can be found at: http://www.chris-lott.org/resources/cstyle/CppCodingStandard.html
Automated builds
Dedicated build server builds the game from scratch
Takes the source code and creates an executable
Also takes assets and builds them into game-specific format
Build must never break
Quality Control
Code reviews Knowing others will read the code will make coding
more carefully Another programmer reads over some code and
tries to find problems Sometimes done before code is committed to
version control Can be beneficial if done correctly
Follow coding standards, and put comments
Avoid Run-time Errors
Run-time errors are hardest to trace and have the biggest damage
Initialize variables, use tools (Visual .Net is good at this), check boundaries, etc.
purify on Windows valgrind on Linux
Asserts and crashes Use asserts anytime the game could crash or something could go
very wrong An assert is a controlled crash in the debug version Much easier to debug and fix Happens right where the problem occurred Don't use them for things that a user could do
Open a non-existing file Press the wrong button
Leveraging Existing Code
A lot of code that games use is the same
It's a total waste of time to write it over and over
Instead, spend your time in what's going to make your game unique
Avoid Not Invented Here (NIH) syndrome!
Where Are Existing Codes
Reuse code from previous project Easier in a large company if you have an engine and
tools group Use freeware code and tools
No support Make sure license allows it
Middleware Companies provide with components used in game
development physics, animation, graphics, etc
Commercial game engines You can license the whole engine and tools and a
single package Good if you're doing exactly that type of game
Languages
C/C++ Java Script: Flash, Python, LISP, etc. C# XNA for PC and Xbox
C++
C used to be the most popular language for games
Today, C++ is the language of choice for game development
C++: Strengths - I
Performance Control over low-level functionality (memory management,
etc) Can switch to assembly or C whenever necessary Good interface with OS, hardware, and other languages
High-level, object-oriented High-level language features are essential for making today's
complex games Has inheritance, polymorphism, templates, and exceptions Strongly typed, so it has improved reliability
C++: Strengths - II
C Heritage C++ is the only high-level language that is
backwards-compatible with C Has APIs and compiler support in all platforms Easier transition for experienced programmers
Libraries STL (Standard Template Library)
Comprehensive set of standard libraries Boost: widely used library with wide variety of
functionality Many commercial C++ libraries also available
C++: Weaknesses - I
Too low-level Still forces programmers to deal with low-level issues Too error-prone Attention to low-level details is overkill for high-level features
or tools Slow iteration
C++ is fully compiled into binary format from source code Compiling large numbers of files is very slow This will only become more of a problem as games become
more complex
C++: Weaknesses - II
Too complicated Because of its C heritage, C++ is very
complicated Long learning curve to become competent
with the language Lacking features
No reflection or introspection features No method of object serialization No native support for message passing
C++: When to Use It?
When performance is crucial If your current code base is mostly C and C++ If you have a lot of in-house expertise in C++ Avoid using it for high-level code, such as tools
Java for Game Development
Why use Java? It's a high-level OO language that
simplifies many C++ features Adds several useful high-level features Easy to develop for multiple platforms
because of intermediate bytecode Good library support
Java Performance
Has typically been Java's weak point Has improved in the last few years: still
not up to C++ level, but very close Uses Just-In-Time compiling and
HotSpot optimizations Now has high-performance libraries Also has access to native functionality
Java Platforms
Well suited to downloadable and browser-based games
Dominates development on mobile and handheld platforms
Possible to use in full PC games, but more likely to be embedded into a game
Commercial Games using Java
Downloadable games like those from PopCap Games: Mummy Maze, etc
Online card games PC games using Java as a scripting
language: Vampire: The Masquerade, Star Wars Galaxies
PC games fully written in Java: You Don't Know Jack, Who Wants to Be a Millionaire
C#
Developed by MS, now ISO standard A simple, modern, general-purpose, object-
oriented programming language Support for software engineering principles:
strong type checking array bounds checking detection of attempts to use uninitialized
variables automatic garbage collection.
Software robustness, durability, and programmer productivity are important.
Strength and Weakness
C# is intended to be suitable for writing applications for both hosted and embedded systems
Source code portability is very important, as is programmer portability
Although is intended to be economical (memory/processing power), it cannot compete directly with C or assembly language.
Scripting Languages
Why use scripting languages? Ease and speed of development Short iteration time Code becomes a game asset Offer additional features and are
customizable
Drawbacks of Scripting Languages
Slow performance Limited tool support Dynamic typing makes it difficult to catch
errors Awkward interface with the rest of the
game Difficult to implement well
Popular scripting languages
Python Lua Other off-the-shelf options such as
Ruby, Perl, Javascript Custom scripting languages
UnrealScript, QuakeC, NWNScript
Lua Example
Choose a Scripting Languages
Consider whether you need one at all What features do you need? What kind of performance do you need? What debugging facilities does the
language have? On what platforms does it need to run? What resources and expertise are
available?
Programming Fundamentals
Data Structures: Array
Elements are adjacent in memory (great cache consistency) Requires continuous memory space
They never grow or get reallocated Use dynamic incremental array concept GCC has a remalloc function
In C++ there's no check for going out of bounds Use vector if possible Keep in mind of checking boundaries
Inserting and deleting elements in the middle is expensive
List
Very cheap to add/remove elements. Available in the STL (std::list) Every element is allocated separately,
not placed contiguously in memory Lots of little allocations Bad cache awareness, but can use arrays
to hold pre-allocated items Single/Double linked list
Lists
Dictionaries
Maps a set of keys to some data. std::map, std::hash, etc Very fast access to data Perfect for mapping IDs to pointers, or
resource handles to objects May waste space, need to design
comparison operators
Hash Table
Others
Stacks First in, last out std::stack adaptor in STL
Queues First in, first out std::deque Priority queue is useful in game to schedule
events
Stack/Queue/Priority Queue
Bit packing
Fold all necessary data into a smaller number of bits
Bool in C++ may use up to 4 bytes, thus is very expensive
Very useful for storing boolean flags: pack 32 in an integer
Possible to apply to numerical values if we can give up range or accuracy
Very low level trick Use shifts to handle the operation or use assembly Only use when absolutely necessary
Bits
Inheritance
Models “is-a” relationship Extends behavior of existing classes by
making minor changes Do not overuse, if possible, use component
systerm UML diagram representing inheritance
E ne m y B o s s Supe rD upe rB o s s
Polymorphism
The ability to refer to an object through a reference (or pointer) of the type of a parent class
Key concept of object oriented design C++ implements it using virtual functions
Multiple Inheritance
Allows a class to have more than one base class
Derived class adopts characteristics of all parent classes
Huge potential for problems (clashes, casting, dreaded diamond, etc)
Multiple inheritance of abstract interfaces is much less error prone (virtual inheritance)
Java has no multiple inheritance
Dreaded Diamond
It is an ambiguity that arises when two classes B and C inherit from A, and class D inherits from both B and C.
If a method in D calls a method defined in A (and does not override the method), and B and C have overridden that method differently, then from which class does it inherit: B, or C?
Component Systems
Component system organization
G am e E nti ty
N am e = s w o r d
R e nde rC o m p C o ll is io nC o m p D am age C o m p P ic kupC o m p W ie ldC o m p
Object Factory
Creates objects by name Pluggable factory allows for new object
types to be registered at runtime Extremely useful in game development
for passing messages, creating new objects, loading games, or instantiating new content after game ships
Factory Pattern
Simple Sample Factory - I
Simple Sample Factory - II
Singleton
Implements a single instance of a class with global point of creation and access
For example, GUI Don't overuse it!!!
Single to ns ta tic S in g le to n & G etI n s tan c e ( ) ;/ / R eg u lar m em b er f u n c tio n s . . .
s ta t ic S in g le to n u n iq u eI n s tan c e ;
Singleton Example
Adapter
Convert the interface of a class into another interface clients expect.
Adapter lets classes work together that couldn't otherwise because of incompatible interfaces
Real interface
Adapter Pattern
Adapter Example - I
Adapter Example - II
Observer
Allows objects to be notified of specific events with minimal coupling to the source of the event
Two parts subject and observer
Observer Pattern
Composite
Allow a group of objects to be treated as a single object
Very useful for GUI elements, hierarchical objects, inventory systems, etc
Composite Pattern
Composite Pattern Example - I
Add many more inherited classes
The Five StepDebugging Process
1. Reproduce the problem consistently
2. Collect clues
3. Pinpoint the error
4. Repair the problem
5. Test the solution
Expert Debugging Tips
Question assumptions Minimize interactions and interference Minimize randomness Break complex calculations into steps Check boundary conditions, use assertions Disrupt parallel computations Exploit tools in the debugger (VC is good, purify) Check code that has recently changed Explain the bug to someone else Debug with a partner (A second pair of eyes) Take a break from the problem Get outside help (call people)