developing ronimo's multiplatform graphics engine joost van dongen co-founder lead programmer

85
Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Upload: seth

Post on 15-Jan-2016

37 views

Category:

Documents


0 download

DESCRIPTION

Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer. Ronimo Games. Currently 21 people (7 coders) Utrecht city centre Exists over 7 years now Indie game developer De Blob, Swords & Soldiers, Awesomenauts, Swords & Soldiers 2. Joost van Dongen. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Developing Ronimo's multiplatform graphics

engine

Joost van DongenCo-founder

Lead programmer

Page 2: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Ronimo Games Currently 21 people (7 coders) Utrecht city centre Exists over 7 years now Indie game developer De Blob, Swords & Soldiers, Awesomenauts,

Swords & Soldiers 2

Page 3: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Joost van Dongen

Lead programmer and co-founder Studied Game & Media Technology And Game Design & Development at HKU Also hobby games: Proun, Cello Fortress

Page 4: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Video?

Video!

Page 5: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Awesomenauts 2D MOBA League of Legends + Super Smash Brothers Over 1.7 million copies sold 3 VS 3 online Fast action game Launched mid-2012 Very active user base

Page 6: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

2D games tech

Often underestimated compared to 3D Many things similar: certification, file handling,

online multiplayer, etc Just as interesting!

Page 7: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Console development

Page 8: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Normal programming

Standard C++ Normal Visual Studio Special compiler

Page 9: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Deviations from C++ standard

Visual Studio adds to C++ standard Other compilers do not Cannot use those extras Differences:

std::vector<std::vector<int>> #include <cmath> inline for templates

Page 10: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Pragma

Cannot use #pragma once Must use this instead:

#ifndef MYCLASS_H

#define MYCLASS_H

//code goes here

#endif

Page 11: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Other APIs

Biggest difference Special APIs for all kinds of things File access, graphics, sound, controllers,

networking, etc

Page 12: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Multiplatform

Must write specifics for every platform! Or use existing engine (Unreal, Unity, etc) Or partially use specialised middleware (e.g.

FMOD)

Page 13: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Compiling multiplatform

Must hide platform-specific code behind defines

Page 14: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

void writeFile(const std::string& text)

{

#ifdef _PC

std::ofstream.write(text);

#elif _X360

xWriteData(text);

#elif _PS3

ninWrite(text.c_str());

#else

implement_me;

#endif

}

Page 15: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Practical multiplatform

Big challenge: how to structure this? Huge structural differences per platform Lots of platform-specific code Must keep as much multi-platform as possible

Page 16: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Our structure

Example class structure for file handling:

As much as possible in FileTools itself Similar systems for other topics

Page 17: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

class FileTools

{

virtual void write(string) = 0;

};

class PS3FileTools: public FileTools

{

virtual void write(string)

{

//blabla real code yo

}

};

Page 18: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

FileTools* create()

{

#ifdef _PC

return new PCFileTools();

#elif _PS3

return new PS3FileTools();

#else

implement_me;

#endif

}

Page 19: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Console certification

Console manufacturers test game extensively Must adhere to certification requirements Long lists Hundreds of detailed requirements Months of work per platform!

Page 20: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Example requirements

"Pause game if controller disconnected" "Do not crash" "Load in less than 30 seconds"

Page 21: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Consistency requirements

Not all requirements make sense from developer's standpoint

Make experience similar across platform "Home menu always accessible" "Use standard terminology"

Page 22: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Console development flow

Gain development license for console Order devkits Ask for concept permission Get age ratings Send in for certification Get failed for stupid oversight or lame detail Make fixes Send in again Wait for release slot

Page 23: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Limited RAM

Traditional challenge on console Much less RAM than on PC Won't overflow onto hard disc when out of RAM Less of an issue on PS4/XBoxOne Big challenge on Wii/360/PS3 (88 / 512 / 2x256mb)

Page 24: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Graphics API differences

Page 25: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Graphics API

Library for communicating with videocard Call functions to render triangles, use textures,

etc

Page 26: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Per platform

PC: DirectX, OpenGL, Mantle Mac / Linux: OpenGL iOS / Android: OpenGL ES PS3: OpenGL, GCM X360: DirectX 9 Wii: GX Wii U: GX2

Special versions of GL and DX per platform!

Page 27: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Similarities

Basic primitive is always triangle Textures Hardware is similar, so APIs wrap around

similar concepts

Page 28: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Differences

APIs do same thing differently Each console has special hardware features Some consoles lack major features

Page 29: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

API difference: texture sampling

Page 30: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

API difference: texture sampling

GL: per texture DX: per stage For performance must only set when needed Must decide differently per platform

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,

GL_LINEAR);

device->SetSamplerState(textureIndex, D3DSAMP_MINFILTER,

D3DTEXF_LINEAR);

Page 31: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Speed

Consoles are slower than PCs... ...but targeting specific hardware gives huge

boost Also much more efficient drivers Plus economics: no one targets high end PCs

Page 32: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Texture handling

Console: just memory PC/Mac/Linux: abstracted, no direct access

Console: notify that piece of memory is texture PC/Mac/Linux: copy texture to video memory

Much more control, much faster streaming on console

Page 33: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

EDRam

Xbox 360 only 10mb of super fast GPU memory Benefit: super fast Downside: super small Full HD with anti-aliasing requires two render

passes Much more complex with deferred shading

Page 34: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Shaders

DirectX on 360: HLSL OpenGL on PS3: Cg Need to write all shaders twice? Nope: languages are 90% same Can make everything without touching

differences

Page 35: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

GLSL shaders

GLSL is different Still very similar Required on Wii U and iOS We modified Cg shaders by hand

Page 36: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

No shaders on Wii

Wii was technically a Gamecube Technology from time of Napoleon No shaders Instead the ultimate puzzle fun: TEV stages!

Page 37: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

TEV stages

Repeat this 16 times:

out = a*(1 - c) + b*c + d Set what a/b/c/d/out are per stage Can switch states to:

if(a.r > b.r) out = c; else out = d; Can do surprisingly much Difficult puzzle for advanced stuff!

Page 38: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

PS4 and Xbox One

Boring hardware Just really fast PCs Awesomenauts port outsourced to Abstraction I don't know API details

Page 39: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Ronitechrenderingstructure

Page 40: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Inspired by Ogre

Basic structure inspired by Ogre engine Object oriented C++ graphics engine Extremely neat class design Great engine, good low level access Few tools for modern standards Used for De Blob,

Snowball Earth,

Proun,

Cello Fortress

Page 41: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Renderable

Core object for rendering Functions like these:

setPosition setScale setParallax setTexture setTextureWrap setBlendMode setColour

Page 42: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Flexible for GPU types

Basic structure not based on shaders Properties can be implemented in various ways Shaders of course used on most platforms Looks exact same on Wii without shaders!

setTexture setColour setColourCombineMode //add, multiply, blend, etc setSecondaryTexture setSecondaryTextureOperation

Page 43: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Inherited to provide geometry

virtual void getVertices(Vector2*& vertices,

Vector2*& textureCoordinates0,

Vector2*& textureCoordinates1,

unsigned int& count,

bool& isTriStrip) = 0;

Implemented by various shape/geometry types: Rectangle Circle RenderText ParticleSystem Terrain

Page 44: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Automatic registration

SceneManager keeps track of all Renderables Renderable registers itself automaticallyRenderable::Renderable()

{

SceneManager::get()->addRenderable(this);

}

Renderable::~Renderable()

{

SceneManager::get()->removeRenderable(this);

}

Page 45: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Rendering order

Everything has alpha in a 2D game Must render back to front Order by parallax and depth

Page 46: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Viewports

Viewport defines part of screen to render to Viewport has a camera Viewport has a RenderGroup Automatically renders all Renderables in that

RenderGroup

Page 47: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Flexible Viewports

Not just for splitscreen...

Page 48: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Flexible Viewports

...also for overlays and such

Page 49: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Performance

Page 50: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Performance

Videocards insanely fast Can draw 1000 objects per frame at 60fps Our main performance bottlenecks:

CPU in general Fillrate

Page 51: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Fillrate

Number of pixels drawn per frame or second 1920x1080 screen: 2073600 pixels Need to draw them all every frame No problem for modern videocard

Page 52: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Overdraw

Drawing the same pixel several times Transparent objects like glass or smoke Rare in 3D games, super common in 2D games Quickly 10x overdraw or more Video! Video?

Page 53: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Modifying art assets

Page 54: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Rendering background at low res Background in Awesomenauts is blurred Improves visual focus and clarity Looks really good Can render background very low-res! Massive overdraw reduction

Page 55: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Multi-threading

Page 56: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Modern consoles

Modern consoles have many CPU cores Newest generation is simple: just a bunch of

cores Previous generation more complex: SPUs on

PS3 How to use these efficiently? Limited time to spend because small indie

studio

Page 57: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Basic multi-threading approach

Don't use multi-threading Ignore the other cores Ignore the SPUs Ignore compute shaders Fine for most games (not for AAA of course)

Page 58: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

GPU timing

GPU is like an extra thread Runs any commands you feed it Commands go into queue, fire-and-forget How is the timing of that?

Page 59: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

What I thought (wrong!)

Page 60: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

What it is

Page 61: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Must analyse

No use optimising GPU if CPU bound And other way around Must accurately measure before optimising!

Page 62: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

PS3 performance trouble

PS3 heavily reliant on SPUs Main cores are slow Couldn't get good framerate on just one core

Page 63: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

What to multithread?

Multithreading gameplay too difficult No heavy fluids/physics/lighting More doable: split renderer to separate thread

Page 64: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Multithreading renderer

Cross-thread GL/DX calls not allowed Must split gameplay and renderer Gameplay updates for next frame while

rendering previous frame Must keep copies of all objects

Page 65: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Awesomenauts threading model

This all happens on CPU! GPU not shown here

Page 66: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Tools

Page 67: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Video!

Video?

Page 68: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Character animation Art in Photoshop Animate in After Effects Mostle deformation/skeletal, some frame-to-

frame

Page 69: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer
Page 70: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

In-engine animation

Mostly special effects Particles Squash/rotate/skew Recolours Everything animated In-game Animation and Particle editors

Page 71: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

The power of recolours

Video! VIDEO!

Page 72: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

GPU compatibility

Page 73: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

PC videocards vary a lot

Several types (Nvidia, AMD, Intel) New types every year Many driver versions New versions of OpenGL / DirectX Random feature differences Random rare bugs Must support them all!

Page 74: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

2D relatively simply here

No need for advanced stuff like compute shaders

Can just skip most difficult compatibility topics

Page 75: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Testing

Test on varied PCs Ask friends to test Closed beta close to launch

Page 76: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

In-house testing

Ultimate test-case: very old Intel cards Suck at everything If these run, almost everything will Intel GMA 950, 2005

Page 77: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Our approach

Fix issues Work around weird bugs Add LOW graphics quality for super bad cards Result: Awesomenauts runs on REALLY crappy

Netbooks

Page 78: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

NPOT

Non-power-of-two textures Supported for ages Except by old Intel cards Only do 1024x512, 64x64, 128x256, etc Rescaled ALL textures for SD Half resolution, power-of-two, very little video

memory 1gb to 400mb

Page 79: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Render textures

Not supported on old Intel cards Game significantly uglier Still wanted to support such cards

Page 80: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Ati x900

Old videocards Lie about their features Had to recognise by name and make special

shaders for Proun

Page 81: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Asus laptops

Certain series only Cannot initialise OpenGL at all Needed to add DirectX option to PC Also fixes for people with broken drivers

Page 82: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Wrapping it up

Page 83: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Ronimo looking for interns

September: C++ programmer on Awesomenauts

February: New positions in February C++ coder, 2D art, game/level design

Minimum 4 months, no research thesis projects

Page 84: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Conclusion

Console development is just normal C++ With special secret libraries Very high technical requirements through

certification Big challenge: keep as much code multiplatform

as possible

Page 85: Developing Ronimo's multiplatform graphics engine Joost van Dongen Co-founder Lead programmer

Questions?

Development blog:

www.joostvandongen.com

?