SlideShare a Scribd company logo
Handling Many Platforms with a
Small Development Team
Dietmar Hauser
Head of Console Technology, Sproing
About Sproing
• Based in Vienna, Austria
• Work for hire on all platforms
• Independent for over 10 years!
• More than 50 titles shipped!
What the publisher wants
• An awesome game that sells very well
• Sell it on as many platforms as possible
• Get it delivered on time or earlier
• Spend as little money as possible
What we have
• A small team
– 1-n Designers, Artists, Producers
– 1-10 Programmers
• Many platforms
– 2-n Consoles / PC / Phones / Tablets…
• A tight schedule
– And all platforms finished at the same time
Solutions
• Spend more money
– By extending time and/or growing team
– Very risky for everyone involved
– Results in death marches and bankruptcies
• Develop all platforms simultaneously
– Pretty difficult, but possible
– Everything needs to be shared between
platforms as much as possible
Problems with sharing
• Different platform capabilities
– Several asset fidelities required
– Gameplay differences (i.e. controls)
– Code performance differences
• Different APIs
– No good standards (not even POSIX)
– „Close to the metal“ APIs
Sharing Code
• Share only what can be shared well
• Don‘t force abstraction
– Can get too complicated
– Hides actual behaviour
– Hides bugs / performance problems
• Seperate what doesn‘t fit together
Examples
• Easy to abstract
– File I/O, Memory, Network, Threading,…
– Textures, Meshes,…
• Tricky, but possible
– Rendering, Controls,…
– Save Data, DLC,…
• Very tricky, almost impossible
– Peripherals like Kinect, Move, Wiimote,…
– Unique platform features
Ways to abstract code
• Preprocessor directives
– Most obvious and basic way
– Unused code is discarded
– Hard to read  Error prone
#if PLATFORM_A
DoStuffPlatformA();
#elif PLATFORM_B
DoStuffPlatformB();
#else
#error Unsupported Platform
#endif
Ways to abstract code
• Pointer to Implementation (PIMPL)
– Common, clean and useful
– A lot to type and virtual function call overhead
class Foo {
void DoIt() { impl->DoIt(); }
FooImpl* impl;
};
class FooImpl {
virtual void DoIt() = 0;
};
#if PLATFORM_A
class FooImplA {
virtual void DoIt() { DoItPlatformA(); }
};
#endif
Ways to abstract code
• Templated PIMPL
– Similar functionality to classic PIMPL
– Less to type, less overhead
template <class FooImpl>
class FooBase {
void DoIt() { impl->DoIt(); }
FooImpl* impl;
};
#if PLATFORM_A
class FooImplA {
void DoIt() { DoItPlatformA(); }
};
typedef FooBase<FooImplA> Foo;
#endif
Ways to abstract code
• Master header files
– Platform specifics can be exposed
– Least to type, zero overhead
– Danger of code multiplication
// Foo.h
#if PLATFORM_A
#include „FooA.h“
#elif PLATFORM_B
#include „FooB.h“
#else
#error Unsupported Platform
#endif
Ways to abstract code
• There are many many other ways…
– .inl files
– More complex class hierarchies
• No best way, so mix and match
• Don‘t be afraid to change it while you can
Compiling & Linking
• Each platform has a different toolchain
– Luckily, they‘re all command line tools
– Accept the same source code (mostly)
– Need different parameters
– Print different diagnostics
• Some platforms have a VS integration
– Which is usually pretty bad…
Compiling & Linking
• Use a build tool
– Make, omake, jam, ant, scons,…
• Or roll your own VS integration
– This is what we did…
– … and it‘s simpler than you might think
Introducing ClWarrior
• Lets Visual Studio compile all platforms
– Replaces cl.exe, link.exe and lib.exe
– Translates arguments
– Translates diagnostics
• Very straightforward for new employees
– Code on windows
– Change platform to anything
– Build!
ClWarrior Challenges
• Visual Studio dependency check fails
– Because it relies on a proprietary file (.idb)
– So we wrote our own (it‘s pretty simple)
– And hooked it up using an Add In
• Adding new platforms is not supported
– Except for smart phones…
– „WCE.VCPlatform.config“ can be hijacked
• Debugging still needs the platform tool
– Unfortunate, but acceptable
Keeping the code alive
• There are a lot of code configurations
– We use Debug, Release and Master
– With 4 platforms that‘s 12 builds
• Checking all of them is difficult
– Build is broken very often
– Everyone gets frustrated
– Code commits slow down
Solutions
• Continous Integration (CI)
– All code is built all the time
– Broken builds get reported immediately
– And hopefully fixed immediately
• Unit Tests
– Can be run automatically
– Can detect regressions
– Are very useful when porting to new platforms
More Solutions
• Static Code Analysis
– Can also be run automatically
– Can detect a lot of potential and real bugs
– But can be difficult to set up
• Production QA
– Ensures quality during production
– Problems are uncovered at an early
– Can prepare for final QA
– Usually an overall cost reduction
Assets
• Dependent on the platform combination
• Start with the highest fidelity assets
– Scaling down is easier than scaling up
• Split assets at the latest possible time
– Most changes affect all versions
• Leverage automated downscaling
– Textures are obvious candidates
Asset Conversion
• Automate it!
– Everything is else is too error prone!
– The build tools mentioned earlier can help
– We use a selfmade rule based system
• Speed it up!
– To decrease iteration time
– Easiest way is to do it on one machine and
distribute it to everyone else‘s
Surviving Certification
• Learn, implement and test the
requirements early
• Make sure everyone in the team is aware
of the requirements
– Most of them are actually NOT technical
• Take advantage of pre-cert passes
Certification Tips
• Never stall the render thread
– File I/O is usually to blame
• Make sure your game can be paused at
any time
– And resumed, of course…
• Watch out for memory fragmentation
– Everything will work ok until the end
This is it…
Questions?

More Related Content

What's hot (17)

PDF
Adding Real-time Features to PHP Applications
Ronny López
 
PPT
Automated testing 101
Tabitha Chapman
 
PDF
12 Lessons Learnt in Boot Time Reduction
andrewmurraympc
 
PDF
Introduction to Django (GDays 2014)
Edem Kumodzi
 
PPTX
Evaluation Question 6 - Gabriel Kelly AS Media
TheMightyGabes
 
PPTX
Holberton JAMF Software - Intro
Daniel Alzugaray
 
PPTX
Devops With Boxfuse and Shippable
Andrew Schwabe
 
PDF
Game Programming 10 - Localization
Nick Pruehs
 
PDF
CNIT 127 Ch 16: Fault Injection and 17: The Art of Fuzzing
Sam Bowne
 
PDF
Switching from Puppet to Ansible
Dennis Rowe
 
PPTX
Introduction to operating system, system calls and interrupts
Shivam Mitra
 
PDF
Practical Malware Analysis: Ch 9: OllyDbg
Sam Bowne
 
PDF
CNIT 126 Ch 9: OllyDbg
Sam Bowne
 
PPTX
Captain Strike Post-mortem
JOY Entertainment
 
PPTX
[Wroclaw #8] IPMI appsec - an express train to hell
OWASP
 
PPTX
Home Arcade setup (NoVA Hackers)
Chris Gates
 
PPTX
Automated Acceptance Testing from Scratch
Excella
 
Adding Real-time Features to PHP Applications
Ronny López
 
Automated testing 101
Tabitha Chapman
 
12 Lessons Learnt in Boot Time Reduction
andrewmurraympc
 
Introduction to Django (GDays 2014)
Edem Kumodzi
 
Evaluation Question 6 - Gabriel Kelly AS Media
TheMightyGabes
 
Holberton JAMF Software - Intro
Daniel Alzugaray
 
Devops With Boxfuse and Shippable
Andrew Schwabe
 
Game Programming 10 - Localization
Nick Pruehs
 
CNIT 127 Ch 16: Fault Injection and 17: The Art of Fuzzing
Sam Bowne
 
Switching from Puppet to Ansible
Dennis Rowe
 
Introduction to operating system, system calls and interrupts
Shivam Mitra
 
Practical Malware Analysis: Ch 9: OllyDbg
Sam Bowne
 
CNIT 126 Ch 9: OllyDbg
Sam Bowne
 
Captain Strike Post-mortem
JOY Entertainment
 
[Wroclaw #8] IPMI appsec - an express train to hell
OWASP
 
Home Arcade setup (NoVA Hackers)
Chris Gates
 
Automated Acceptance Testing from Scratch
Excella
 

Viewers also liked (10)

PPTX
Universidad fermin toro diapositivas
Maria Carrera
 
PPT
Slide sa sito 2016
Daniele Marongiu
 
PDF
UP newsletter 2015
Syed Aqleem
 
PDF
Gallup Report
Janessa Pritchett
 
PPTX
Tipos de células
jeffersonandrey702
 
PDF
Cuprins
Gabriel Ciornea
 
PDF
Martin et al AMP 2016
Robert M Wiseman
 
PPT
The Unusual Rendering Pipeline of Sigils - Battle for Raios
Dietmar Hauser
 
PDF
Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...
Together We're Better
 
PPTX
An Introduction to Accounting Theory
Arthik Davianti
 
Universidad fermin toro diapositivas
Maria Carrera
 
Slide sa sito 2016
Daniele Marongiu
 
UP newsletter 2015
Syed Aqleem
 
Gallup Report
Janessa Pritchett
 
Tipos de células
jeffersonandrey702
 
Martin et al AMP 2016
Robert M Wiseman
 
The Unusual Rendering Pipeline of Sigils - Battle for Raios
Dietmar Hauser
 
Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...
Together We're Better
 
An Introduction to Accounting Theory
Arthik Davianti
 
Ad

Similar to Handling Many Platforms with a Small Development Team (20)

ODP
Preventing Complexity in Game Programming
Yaser Zhian
 
PDF
Making A Game Engine Is Easier Than You Think
Gorm Lai
 
PPTX
SynapseIndia dotnet debugging development process
Synapseindiappsdevelopment
 
PPTX
Being a game developer with the skills you have
Johan Lindfors
 
PPT
Synapseindia dot net development about programming
Synapseindiappsdevelopment
 
PPT
Programming
fika sweety
 
PPTX
From Web to Mobile with Stage 3D
Jean-Philippe Doiron
 
PPT
3.1 teams and processes
Sayed Ahmed
 
PDF
Embedded Solutions 2010 : Challenges In Porting and Abstraction , by Mapusoft
New-Tech Magazine
 
PPTX
A Tale Of Ten SDKs: Cross-Platform Development Best Practices - Unite LA
Unity Technologies
 
PDF
[Game] Programming I Didn't Learn in School
💻 Anton Gerdelan
 
PDF
The Next Mainstream Programming Language: A Game Developer's Perspective
kfrdbs
 
PPT
Brewing Your Own Game Engie eng
Coconut Island
 
PPTX
Game Studio
MarinaOpera
 
PPTX
Pc54
guestd9aa5
 
PDF
C++ Restrictions for Game Programming.
Richard Taylor
 
PPT
Tim Popl
mchaar
 
PPT
The Next Mainstream Programming Language: A Game Developer’s Perspective
guest4fd7a2
 
PPT
Rhapsody Software
Bill Duncan
 
PDF
Minko - Creating cross-platform 3D apps with Minko
Minko3D
 
Preventing Complexity in Game Programming
Yaser Zhian
 
Making A Game Engine Is Easier Than You Think
Gorm Lai
 
SynapseIndia dotnet debugging development process
Synapseindiappsdevelopment
 
Being a game developer with the skills you have
Johan Lindfors
 
Synapseindia dot net development about programming
Synapseindiappsdevelopment
 
Programming
fika sweety
 
From Web to Mobile with Stage 3D
Jean-Philippe Doiron
 
3.1 teams and processes
Sayed Ahmed
 
Embedded Solutions 2010 : Challenges In Porting and Abstraction , by Mapusoft
New-Tech Magazine
 
A Tale Of Ten SDKs: Cross-Platform Development Best Practices - Unite LA
Unity Technologies
 
[Game] Programming I Didn't Learn in School
💻 Anton Gerdelan
 
The Next Mainstream Programming Language: A Game Developer's Perspective
kfrdbs
 
Brewing Your Own Game Engie eng
Coconut Island
 
Game Studio
MarinaOpera
 
C++ Restrictions for Game Programming.
Richard Taylor
 
Tim Popl
mchaar
 
The Next Mainstream Programming Language: A Game Developer’s Perspective
guest4fd7a2
 
Rhapsody Software
Bill Duncan
 
Minko - Creating cross-platform 3D apps with Minko
Minko3D
 
Ad

More from Dietmar Hauser (12)

PPTX
Expedition to Mount Competence !i!i!i!i!
Dietmar Hauser
 
PPTX
The Case Against Human Readability
Dietmar Hauser
 
PPTX
More Intuitive Programming Through Better Code Completion
Dietmar Hauser
 
PPTX
Data Compression 2020
Dietmar Hauser
 
PPTX
The Abstraction Trap
Dietmar Hauser
 
PPTX
The Settlers Returns
Dietmar Hauser
 
PPTX
Going Rogue - 8 Months On My Own
Dietmar Hauser
 
PPTX
The Rocky Road to KISS Rock City
Dietmar Hauser
 
PPTX
A Half Life in Game Development
Dietmar Hauser
 
PPTX
Devil Dentist
Dietmar Hauser
 
PPT
Toolchain Independent Distributed Compilation
Dietmar Hauser
 
PPT
The Difficulty of Going Mobile
Dietmar Hauser
 
Expedition to Mount Competence !i!i!i!i!
Dietmar Hauser
 
The Case Against Human Readability
Dietmar Hauser
 
More Intuitive Programming Through Better Code Completion
Dietmar Hauser
 
Data Compression 2020
Dietmar Hauser
 
The Abstraction Trap
Dietmar Hauser
 
The Settlers Returns
Dietmar Hauser
 
Going Rogue - 8 Months On My Own
Dietmar Hauser
 
The Rocky Road to KISS Rock City
Dietmar Hauser
 
A Half Life in Game Development
Dietmar Hauser
 
Devil Dentist
Dietmar Hauser
 
Toolchain Independent Distributed Compilation
Dietmar Hauser
 
The Difficulty of Going Mobile
Dietmar Hauser
 

Recently uploaded (20)

PDF
Everything you need to know about pricing & licensing Microsoft 365 Copilot f...
Q-Advise
 
PDF
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
PDF
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
PDF
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
PPTX
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
PPTX
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
PDF
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
PPTX
Agentic Automation Journey Series Day 2 – Prompt Engineering for UiPath Agents
klpathrudu
 
PDF
Technical-Careers-Roadmap-in-Software-Market.pdf
Hussein Ali
 
PPTX
Finding Your License Details in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PPTX
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
PDF
IObit Driver Booster Pro 12.4.0.585 Crack Free Download
henryc1122g
 
PDF
IDM Crack with Internet Download Manager 6.42 Build 43 with Patch Latest 2025
bashirkhan333g
 
PDF
NEW-Viral>Wondershare Filmora 14.5.18.12900 Crack Free
sherryg1122g
 
PPTX
Build a Custom Agent for Agentic Testing.pptx
klpathrudu
 
PDF
NSF Converter Simplified: From Complexity to Clarity
Johnsena Crook
 
PPTX
Customise Your Correlation Table in IBM SPSS Statistics.pptx
Version 1 Analytics
 
PPTX
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PPTX
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
PDF
Simplify React app login with asgardeo-sdk
vaibhav289687
 
Everything you need to know about pricing & licensing Microsoft 365 Copilot f...
Q-Advise
 
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
Agentic Automation Journey Series Day 2 – Prompt Engineering for UiPath Agents
klpathrudu
 
Technical-Careers-Roadmap-in-Software-Market.pdf
Hussein Ali
 
Finding Your License Details in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
IObit Driver Booster Pro 12.4.0.585 Crack Free Download
henryc1122g
 
IDM Crack with Internet Download Manager 6.42 Build 43 with Patch Latest 2025
bashirkhan333g
 
NEW-Viral>Wondershare Filmora 14.5.18.12900 Crack Free
sherryg1122g
 
Build a Custom Agent for Agentic Testing.pptx
klpathrudu
 
NSF Converter Simplified: From Complexity to Clarity
Johnsena Crook
 
Customise Your Correlation Table in IBM SPSS Statistics.pptx
Version 1 Analytics
 
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
Simplify React app login with asgardeo-sdk
vaibhav289687
 

Handling Many Platforms with a Small Development Team

  • 1. Handling Many Platforms with a Small Development Team Dietmar Hauser Head of Console Technology, Sproing
  • 2. About Sproing • Based in Vienna, Austria • Work for hire on all platforms • Independent for over 10 years! • More than 50 titles shipped!
  • 3. What the publisher wants • An awesome game that sells very well • Sell it on as many platforms as possible • Get it delivered on time or earlier • Spend as little money as possible
  • 4. What we have • A small team – 1-n Designers, Artists, Producers – 1-10 Programmers • Many platforms – 2-n Consoles / PC / Phones / Tablets… • A tight schedule – And all platforms finished at the same time
  • 5. Solutions • Spend more money – By extending time and/or growing team – Very risky for everyone involved – Results in death marches and bankruptcies • Develop all platforms simultaneously – Pretty difficult, but possible – Everything needs to be shared between platforms as much as possible
  • 6. Problems with sharing • Different platform capabilities – Several asset fidelities required – Gameplay differences (i.e. controls) – Code performance differences • Different APIs – No good standards (not even POSIX) – „Close to the metal“ APIs
  • 7. Sharing Code • Share only what can be shared well • Don‘t force abstraction – Can get too complicated – Hides actual behaviour – Hides bugs / performance problems • Seperate what doesn‘t fit together
  • 8. Examples • Easy to abstract – File I/O, Memory, Network, Threading,… – Textures, Meshes,… • Tricky, but possible – Rendering, Controls,… – Save Data, DLC,… • Very tricky, almost impossible – Peripherals like Kinect, Move, Wiimote,… – Unique platform features
  • 9. Ways to abstract code • Preprocessor directives – Most obvious and basic way – Unused code is discarded – Hard to read  Error prone #if PLATFORM_A DoStuffPlatformA(); #elif PLATFORM_B DoStuffPlatformB(); #else #error Unsupported Platform #endif
  • 10. Ways to abstract code • Pointer to Implementation (PIMPL) – Common, clean and useful – A lot to type and virtual function call overhead class Foo { void DoIt() { impl->DoIt(); } FooImpl* impl; }; class FooImpl { virtual void DoIt() = 0; }; #if PLATFORM_A class FooImplA { virtual void DoIt() { DoItPlatformA(); } }; #endif
  • 11. Ways to abstract code • Templated PIMPL – Similar functionality to classic PIMPL – Less to type, less overhead template <class FooImpl> class FooBase { void DoIt() { impl->DoIt(); } FooImpl* impl; }; #if PLATFORM_A class FooImplA { void DoIt() { DoItPlatformA(); } }; typedef FooBase<FooImplA> Foo; #endif
  • 12. Ways to abstract code • Master header files – Platform specifics can be exposed – Least to type, zero overhead – Danger of code multiplication // Foo.h #if PLATFORM_A #include „FooA.h“ #elif PLATFORM_B #include „FooB.h“ #else #error Unsupported Platform #endif
  • 13. Ways to abstract code • There are many many other ways… – .inl files – More complex class hierarchies • No best way, so mix and match • Don‘t be afraid to change it while you can
  • 14. Compiling & Linking • Each platform has a different toolchain – Luckily, they‘re all command line tools – Accept the same source code (mostly) – Need different parameters – Print different diagnostics • Some platforms have a VS integration – Which is usually pretty bad…
  • 15. Compiling & Linking • Use a build tool – Make, omake, jam, ant, scons,… • Or roll your own VS integration – This is what we did… – … and it‘s simpler than you might think
  • 16. Introducing ClWarrior • Lets Visual Studio compile all platforms – Replaces cl.exe, link.exe and lib.exe – Translates arguments – Translates diagnostics • Very straightforward for new employees – Code on windows – Change platform to anything – Build!
  • 17. ClWarrior Challenges • Visual Studio dependency check fails – Because it relies on a proprietary file (.idb) – So we wrote our own (it‘s pretty simple) – And hooked it up using an Add In • Adding new platforms is not supported – Except for smart phones… – „WCE.VCPlatform.config“ can be hijacked • Debugging still needs the platform tool – Unfortunate, but acceptable
  • 18. Keeping the code alive • There are a lot of code configurations – We use Debug, Release and Master – With 4 platforms that‘s 12 builds • Checking all of them is difficult – Build is broken very often – Everyone gets frustrated – Code commits slow down
  • 19. Solutions • Continous Integration (CI) – All code is built all the time – Broken builds get reported immediately – And hopefully fixed immediately • Unit Tests – Can be run automatically – Can detect regressions – Are very useful when porting to new platforms
  • 20. More Solutions • Static Code Analysis – Can also be run automatically – Can detect a lot of potential and real bugs – But can be difficult to set up • Production QA – Ensures quality during production – Problems are uncovered at an early – Can prepare for final QA – Usually an overall cost reduction
  • 21. Assets • Dependent on the platform combination • Start with the highest fidelity assets – Scaling down is easier than scaling up • Split assets at the latest possible time – Most changes affect all versions • Leverage automated downscaling – Textures are obvious candidates
  • 22. Asset Conversion • Automate it! – Everything is else is too error prone! – The build tools mentioned earlier can help – We use a selfmade rule based system • Speed it up! – To decrease iteration time – Easiest way is to do it on one machine and distribute it to everyone else‘s
  • 23. Surviving Certification • Learn, implement and test the requirements early • Make sure everyone in the team is aware of the requirements – Most of them are actually NOT technical • Take advantage of pre-cert passes
  • 24. Certification Tips • Never stall the render thread – File I/O is usually to blame • Make sure your game can be paused at any time – And resumed, of course… • Watch out for memory fragmentation – Everything will work ok until the end