Top Banner
Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology
20

Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Dec 14, 2015

Download

Documents

Robin Milman
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Game Architecture and best practices

Reinhold Preiner

Thomas Weber

Institute of Computer Graphics and Algorithms

Vienna University of Technology

Page 2: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

2

Topics for today

Software Architecture for Game DevelopmentRules of software engineering

Entity Management

Scene-Representation

Basic Game-Lifecycle

The Render-Loop

Resource Management

Best Practices and Useful Tips

Institute of Computer Graphics and Algorithms

Page 3: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

TOPICS FOR TODAY

Software Architecture for Game Development

Institute of Computer Graphics and Algorithms 3

Page 4: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 4

Some Rules of Good SW-Engineering

SCALABILITYBe able to extend your System with minimal effort

MAINTAINABILITYBe able to change/adapt your System with minimal effort

MODULARITYIf you have to do the procedure in different corners of your System, do it once in one module (class) and call it wherever you need it.

These Concepts interact with each other

But: Beware of Overengineering -> you only have one Semester!

Page 5: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

5

Entity management

Character::update() handles user input

Vehicle::update() controlled by AI

Tree::update() does nothing

Institute of Computer Graphics and Algorithms

SceneObject {abstract}+ update( double timediff )+ draw()

Character Vehicle Tree

Page 6: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 6

Scene-Representation

Which data-structure for object organization?

Depends on your needs

2 Basic approaches:

Linear List (e.g. std::list<SceneObject*>)

Advantage: Easy to implement

Disadvantage: Bad for hierarchical scenes

Scene-Graphs:

Ideal for hierarchical animations (e.g. solar system)

You can also use both (or none ;) )

Page 7: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 7

Basic Game Lifecycle

Load ContentLoad Content

Render-Loop Render-Loop

Update Content Update Content

Cleanup ContentCleanup Content

User InputUser Input

Display OutputDisplay Output Draw Content Draw Content

Page 8: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 8

Resource-Management

Load ContentLoad Content

Render-Loop Render-Loop

Update Content Update Content

Cleanup ContentCleanup Content

User InputUser Input

Display OutputDisplay Output Draw Content Draw Content

Page 9: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 9

Resource-Management

Common Design-Concepts:

RAII

Resource managing module

Page 10: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 10

RAII

“Resource Acquisition Is Initialization”

Constructor: Resource acquisitionTextures, shader, meshes etc.

Destructor: Release resources

Advantages:Simplifies programming work

Exception safe

Disadvantage:Beware of shallow copies

(see C++ talk / part 2)

Page 11: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 11

Resource-Managing-Module

Central resource manager class handles all resources

Has methods like: loadMesh, loadTexture, etc.

Loads resources once and returns references

Internally stores resources in maps

Could also support reference counting

Handles cleanup at application end

Page 12: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 12

Resource-Managing-Module

Resource* loadResource( "resourceName" )

{

if ( "resourceName" already loaded )return lookup( "resourceName" );

else

{

res = loadFromFile( "resourceName" );

storeInMap( "resourceName", res );

return res;

}

}

Page 13: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 13

Render-Loop

Load ContentLoad Content

Render-Loop Render-Loop

Update Content Update Content

Cleanup ContentCleanup Content

User InputUser Input

Display OutputDisplay Output Draw Content Draw Content

Page 14: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 14

Render-Loop

while( <running> )

{

double dt = <Calculate time Delta to prev. Frame>;

foreach SceneObject* so in sceneObjectList

so->update( dt );

foreach SceneObject* so in sceneObjectList

so->draw ();

<Swap Buffers>

}

SceneObject {abstract}+ update( double timediff )+ draw()

Character Vehicle Tree

Page 15: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

TOPICS FOR TODAY

Best Practices and

Useful Tips

Institute of Computer Graphics and Algorithms 15

Page 16: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

16

OpenGL C++ Wrappers

Wrapper objects for OpenGL functions

For things like textures or shaders

Example usageShader shader(“my_shader”);

Mesh mesh(“teapot.mesh”);

shader.bind();

shader.setUniform(“color”, vec3(1,0,0));

mesh.draw(&shader);

shader.unbind();

Write code before implementing wrappers

Reinhold Preiner & Thomas Weber

Page 17: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

Reinhold Preiner & Thomas Weber 17

Config-Loading

Don’t hardcode constant values

Use a config file

Example syntax:lightColor 1 0.5 0.5lightPosition 10 10 30shaderName “shader/myShader”

Tweak values without recompilation

Example Config class:Config config(“game.config”);String shaderName = config.shaderName;

Page 18: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

18

Time Measurement

Most frameworks support timer functions

Clamp longer time differencesUseful for debugging, pause state, etc.

double last = 0.0, logicTime = 0.0;while (running) { double now = glfwGetTime(); double dT = min(config.maxDT, now-last); last = now; logicTime = logicTime + dT;}

Reinhold Preiner & Thomas Weber

Page 19: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

19

FPS computation

Each frame do

++frames;if (now – last > config.framerateUpdateTime) {

msPerFrame = 1000.0 * (now-last) / frames;last = now;frames = 0;

}

Encapsulate in function or class

FPS = 1000 / msPerFrame

ms/frame is preferable metric

FPS just better known

Reinhold Preiner & Thomas Weber

Page 20: Game Architecture and best practices Reinhold Preiner Thomas Weber Institute of Computer Graphics and Algorithms Vienna University of Technology.

21

Input handling

Polling for time spanning actionsPressing forward key

Firing machine gunglfwGetKey(‘W’);

Events for single key hitsESC, F-keys, etc.

Firing grenade

Execute actionvoid GLFWCALL keyCallback(int key, int state) {…}glfwSetKeyCallback(keyCallback);

Reinhold Preiner & Thomas Weber