SlideShare a Scribd company logo
1 of 25
Download to read offline
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

Adding Real-time Features to PHP Applications
Adding Real-time Features to PHP ApplicationsAdding Real-time Features to PHP Applications
Adding Real-time Features to PHP ApplicationsRonny López
 
12 Lessons Learnt in Boot Time Reduction
12 Lessons Learnt in Boot Time Reduction12 Lessons Learnt in Boot Time Reduction
12 Lessons Learnt in Boot Time Reductionandrewmurraympc
 
Introduction to Django (GDays 2014)
Introduction to Django (GDays 2014) Introduction to Django (GDays 2014)
Introduction to Django (GDays 2014) Edem Kumodzi
 
Evaluation Question 6 - Gabriel Kelly AS Media
Evaluation Question 6 - Gabriel Kelly AS MediaEvaluation Question 6 - Gabriel Kelly AS Media
Evaluation Question 6 - Gabriel Kelly AS MediaTheMightyGabes
 
Holberton JAMF Software - Intro
Holberton JAMF Software - IntroHolberton JAMF Software - Intro
Holberton JAMF Software - IntroDaniel Alzugaray
 
Devops With Boxfuse and Shippable
Devops With Boxfuse and ShippableDevops With Boxfuse and Shippable
Devops With Boxfuse and ShippableAndrew Schwabe
 
Game Programming 10 - Localization
Game Programming 10 - LocalizationGame Programming 10 - Localization
Game Programming 10 - LocalizationNick Pruehs
 
CNIT 127 Ch 16: Fault Injection and 17: The Art of Fuzzing
CNIT 127 Ch 16: Fault Injection and 17: The Art of FuzzingCNIT 127 Ch 16: Fault Injection and 17: The Art of Fuzzing
CNIT 127 Ch 16: Fault Injection and 17: The Art of FuzzingSam Bowne
 
Switching from Puppet to Ansible
Switching from Puppet to AnsibleSwitching from Puppet to Ansible
Switching from Puppet to AnsibleDennis Rowe
 
Introduction to operating system, system calls and interrupts
Introduction to operating system, system calls and interruptsIntroduction to operating system, system calls and interrupts
Introduction to operating system, system calls and interruptsShivam Mitra
 
Practical Malware Analysis: Ch 9: OllyDbg
Practical Malware Analysis: Ch 9: OllyDbgPractical Malware Analysis: Ch 9: OllyDbg
Practical Malware Analysis: Ch 9: OllyDbgSam Bowne
 
CNIT 126 Ch 9: OllyDbg
CNIT 126 Ch 9: OllyDbgCNIT 126 Ch 9: OllyDbg
CNIT 126 Ch 9: OllyDbgSam Bowne
 
[Wroclaw #8] IPMI appsec - an express train to hell
[Wroclaw #8] IPMI appsec - an express train to hell[Wroclaw #8] IPMI appsec - an express train to hell
[Wroclaw #8] IPMI appsec - an express train to hellOWASP
 
Home Arcade setup (NoVA Hackers)
Home Arcade setup (NoVA Hackers)Home Arcade setup (NoVA Hackers)
Home Arcade setup (NoVA Hackers)Chris Gates
 
Automated Acceptance Testing from Scratch
Automated Acceptance Testing from ScratchAutomated Acceptance Testing from Scratch
Automated Acceptance Testing from ScratchExcella
 

What's hot (17)

Adding Real-time Features to PHP Applications
Adding Real-time Features to PHP ApplicationsAdding Real-time Features to PHP Applications
Adding Real-time Features to PHP Applications
 
Automated testing 101
Automated testing 101Automated testing 101
Automated testing 101
 
12 Lessons Learnt in Boot Time Reduction
12 Lessons Learnt in Boot Time Reduction12 Lessons Learnt in Boot Time Reduction
12 Lessons Learnt in Boot Time Reduction
 
Introduction to Django (GDays 2014)
Introduction to Django (GDays 2014) Introduction to Django (GDays 2014)
Introduction to Django (GDays 2014)
 
Evaluation Question 6 - Gabriel Kelly AS Media
Evaluation Question 6 - Gabriel Kelly AS MediaEvaluation Question 6 - Gabriel Kelly AS Media
Evaluation Question 6 - Gabriel Kelly AS Media
 
Holberton JAMF Software - Intro
Holberton JAMF Software - IntroHolberton JAMF Software - Intro
Holberton JAMF Software - Intro
 
Devops With Boxfuse and Shippable
Devops With Boxfuse and ShippableDevops With Boxfuse and Shippable
Devops With Boxfuse and Shippable
 
Game Programming 10 - Localization
Game Programming 10 - LocalizationGame Programming 10 - Localization
Game Programming 10 - Localization
 
CNIT 127 Ch 16: Fault Injection and 17: The Art of Fuzzing
CNIT 127 Ch 16: Fault Injection and 17: The Art of FuzzingCNIT 127 Ch 16: Fault Injection and 17: The Art of Fuzzing
CNIT 127 Ch 16: Fault Injection and 17: The Art of Fuzzing
 
Switching from Puppet to Ansible
Switching from Puppet to AnsibleSwitching from Puppet to Ansible
Switching from Puppet to Ansible
 
Introduction to operating system, system calls and interrupts
Introduction to operating system, system calls and interruptsIntroduction to operating system, system calls and interrupts
Introduction to operating system, system calls and interrupts
 
Practical Malware Analysis: Ch 9: OllyDbg
Practical Malware Analysis: Ch 9: OllyDbgPractical Malware Analysis: Ch 9: OllyDbg
Practical Malware Analysis: Ch 9: OllyDbg
 
CNIT 126 Ch 9: OllyDbg
CNIT 126 Ch 9: OllyDbgCNIT 126 Ch 9: OllyDbg
CNIT 126 Ch 9: OllyDbg
 
Captain Strike Post-mortem
Captain Strike Post-mortemCaptain Strike Post-mortem
Captain Strike Post-mortem
 
[Wroclaw #8] IPMI appsec - an express train to hell
[Wroclaw #8] IPMI appsec - an express train to hell[Wroclaw #8] IPMI appsec - an express train to hell
[Wroclaw #8] IPMI appsec - an express train to hell
 
Home Arcade setup (NoVA Hackers)
Home Arcade setup (NoVA Hackers)Home Arcade setup (NoVA Hackers)
Home Arcade setup (NoVA Hackers)
 
Automated Acceptance Testing from Scratch
Automated Acceptance Testing from ScratchAutomated Acceptance Testing from Scratch
Automated Acceptance Testing from Scratch
 

Viewers also liked

Universidad fermin toro diapositivas
Universidad fermin toro diapositivasUniversidad fermin toro diapositivas
Universidad fermin toro diapositivasMaria Carrera
 
UP newsletter 2015
UP newsletter 2015UP newsletter 2015
UP newsletter 2015Syed Aqleem
 
The Unusual Rendering Pipeline of Sigils - Battle for Raios
The Unusual Rendering Pipeline of Sigils - Battle for RaiosThe Unusual Rendering Pipeline of Sigils - Battle for Raios
The Unusual Rendering Pipeline of Sigils - Battle for RaiosDietmar Hauser
 
Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...
Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...
Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...Together We're Better
 
An Introduction to Accounting Theory
An Introduction to Accounting TheoryAn Introduction to Accounting Theory
An Introduction to Accounting TheoryArthik Davianti
 

Viewers also liked (10)

Universidad fermin toro diapositivas
Universidad fermin toro diapositivasUniversidad fermin toro diapositivas
Universidad fermin toro diapositivas
 
Slide sa sito 2016
Slide sa sito 2016Slide sa sito 2016
Slide sa sito 2016
 
UP newsletter 2015
UP newsletter 2015UP newsletter 2015
UP newsletter 2015
 
Gallup Report
Gallup ReportGallup Report
Gallup Report
 
Tipos de células
Tipos de célulasTipos de células
Tipos de células
 
Cuprins
CuprinsCuprins
Cuprins
 
Martin et al AMP 2016
Martin et al AMP 2016Martin et al AMP 2016
Martin et al AMP 2016
 
The Unusual Rendering Pipeline of Sigils - Battle for Raios
The Unusual Rendering Pipeline of Sigils - Battle for RaiosThe Unusual Rendering Pipeline of Sigils - Battle for Raios
The Unusual Rendering Pipeline of Sigils - Battle for Raios
 
Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...
Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...
Giving Unchained: could the blockchain transform charity? (Charities Aid Foun...
 
An Introduction to Accounting Theory
An Introduction to Accounting TheoryAn Introduction to Accounting Theory
An Introduction to Accounting Theory
 

Similar to Handling Many Platforms with a Small Development Team

August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchHoward Greenberg
 
Build automation best practices
Build automation best practicesBuild automation best practices
Build automation best practicesCode Mastery
 
2020 oct zowe quarterly webinar series
2020 oct zowe quarterly webinar series2020 oct zowe quarterly webinar series
2020 oct zowe quarterly webinar seriesOpen Mainframe Project
 
Putting Compilers to Work
Putting Compilers to WorkPutting Compilers to Work
Putting Compilers to WorkSingleStore
 
Wilko Nienhaus - continuous delivery release the right thing, done right, at ...
Wilko Nienhaus - continuous delivery release the right thing, done right, at ...Wilko Nienhaus - continuous delivery release the right thing, done right, at ...
Wilko Nienhaus - continuous delivery release the right thing, done right, at ...DevConFu
 
Continuous Development: Supporting a Release Model
Continuous Development: Supporting a Release ModelContinuous Development: Supporting a Release Model
Continuous Development: Supporting a Release ModelPerforce
 
'Intro to Infrastructure as Code' - DevOps Belfast
'Intro to Infrastructure as Code' - DevOps Belfast'Intro to Infrastructure as Code' - DevOps Belfast
'Intro to Infrastructure as Code' - DevOps BelfastJohn Fitzpatrick
 
Reverse Engineering Presentation.pdf
Reverse Engineering Presentation.pdfReverse Engineering Presentation.pdf
Reverse Engineering Presentation.pdfAbdelrahmanShaban3
 
Austin Python Learners Meetup - Everything you need to know about programming...
Austin Python Learners Meetup - Everything you need to know about programming...Austin Python Learners Meetup - Everything you need to know about programming...
Austin Python Learners Meetup - Everything you need to know about programming...Danny Mulligan
 
Fuzzing and You: Automating Whitebox Testing
Fuzzing and You: Automating Whitebox TestingFuzzing and You: Automating Whitebox Testing
Fuzzing and You: Automating Whitebox TestingNetSPI
 
REX about installing Kubernetes on Premise
REX about installing Kubernetes on PremiseREX about installing Kubernetes on Premise
REX about installing Kubernetes on PremiseAnaël CHARDAN
 
Production Ready WordPress - WC Utrecht 2017
Production Ready WordPress  - WC Utrecht 2017Production Ready WordPress  - WC Utrecht 2017
Production Ready WordPress - WC Utrecht 2017Edmund Turbin
 
The Hard Problems of Continuous Deployment
The Hard Problems of Continuous DeploymentThe Hard Problems of Continuous Deployment
The Hard Problems of Continuous DeploymentTimothy Fitz
 
CPSeis &amp; GeoCraft
CPSeis &amp; GeoCraftCPSeis &amp; GeoCraft
CPSeis &amp; GeoCraftbillmenger
 
What we talk about when we talk about DevOps
What we talk about when we talk about DevOpsWhat we talk about when we talk about DevOps
What we talk about when we talk about DevOpsRicard Clau
 
Import Tools for InduSoft Web Studio - PanelMate, PanelView, and FactoryTalk
Import Tools for InduSoft Web Studio - PanelMate, PanelView, and FactoryTalkImport Tools for InduSoft Web Studio - PanelMate, PanelView, and FactoryTalk
Import Tools for InduSoft Web Studio - PanelMate, PanelView, and FactoryTalkAVEVA
 
Production Ready WordPress #WPLDN
Production Ready WordPress #WPLDNProduction Ready WordPress #WPLDN
Production Ready WordPress #WPLDNEdmund Turbin
 
Smart Platform Infrastructure with AWS
Smart Platform Infrastructure with AWSSmart Platform Infrastructure with AWS
Smart Platform Infrastructure with AWSJames Huston
 
Supersize Your Production Pipe
Supersize Your Production PipeSupersize Your Production Pipe
Supersize Your Production Pipeslantsixgames
 

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

August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
 
Build automation best practices
Build automation best practicesBuild automation best practices
Build automation best practices
 
2020 oct zowe quarterly webinar series
2020 oct zowe quarterly webinar series2020 oct zowe quarterly webinar series
2020 oct zowe quarterly webinar series
 
Putting Compilers to Work
Putting Compilers to WorkPutting Compilers to Work
Putting Compilers to Work
 
Wilko Nienhaus - continuous delivery release the right thing, done right, at ...
Wilko Nienhaus - continuous delivery release the right thing, done right, at ...Wilko Nienhaus - continuous delivery release the right thing, done right, at ...
Wilko Nienhaus - continuous delivery release the right thing, done right, at ...
 
Continuous Development: Supporting a Release Model
Continuous Development: Supporting a Release ModelContinuous Development: Supporting a Release Model
Continuous Development: Supporting a Release Model
 
'Intro to Infrastructure as Code' - DevOps Belfast
'Intro to Infrastructure as Code' - DevOps Belfast'Intro to Infrastructure as Code' - DevOps Belfast
'Intro to Infrastructure as Code' - DevOps Belfast
 
From Web to Mobile with Stage 3D
From Web to Mobile with Stage 3DFrom Web to Mobile with Stage 3D
From Web to Mobile with Stage 3D
 
Reverse Engineering Presentation.pdf
Reverse Engineering Presentation.pdfReverse Engineering Presentation.pdf
Reverse Engineering Presentation.pdf
 
Austin Python Learners Meetup - Everything you need to know about programming...
Austin Python Learners Meetup - Everything you need to know about programming...Austin Python Learners Meetup - Everything you need to know about programming...
Austin Python Learners Meetup - Everything you need to know about programming...
 
Fuzzing and You: Automating Whitebox Testing
Fuzzing and You: Automating Whitebox TestingFuzzing and You: Automating Whitebox Testing
Fuzzing and You: Automating Whitebox Testing
 
REX about installing Kubernetes on Premise
REX about installing Kubernetes on PremiseREX about installing Kubernetes on Premise
REX about installing Kubernetes on Premise
 
Production Ready WordPress - WC Utrecht 2017
Production Ready WordPress  - WC Utrecht 2017Production Ready WordPress  - WC Utrecht 2017
Production Ready WordPress - WC Utrecht 2017
 
The Hard Problems of Continuous Deployment
The Hard Problems of Continuous DeploymentThe Hard Problems of Continuous Deployment
The Hard Problems of Continuous Deployment
 
CPSeis &amp; GeoCraft
CPSeis &amp; GeoCraftCPSeis &amp; GeoCraft
CPSeis &amp; GeoCraft
 
What we talk about when we talk about DevOps
What we talk about when we talk about DevOpsWhat we talk about when we talk about DevOps
What we talk about when we talk about DevOps
 
Import Tools for InduSoft Web Studio - PanelMate, PanelView, and FactoryTalk
Import Tools for InduSoft Web Studio - PanelMate, PanelView, and FactoryTalkImport Tools for InduSoft Web Studio - PanelMate, PanelView, and FactoryTalk
Import Tools for InduSoft Web Studio - PanelMate, PanelView, and FactoryTalk
 
Production Ready WordPress #WPLDN
Production Ready WordPress #WPLDNProduction Ready WordPress #WPLDN
Production Ready WordPress #WPLDN
 
Smart Platform Infrastructure with AWS
Smart Platform Infrastructure with AWSSmart Platform Infrastructure with AWS
Smart Platform Infrastructure with AWS
 
Supersize Your Production Pipe
Supersize Your Production PipeSupersize Your Production Pipe
Supersize Your Production Pipe
 

More from Dietmar Hauser

The Case Against Human Readability
The Case Against Human ReadabilityThe Case Against Human Readability
The Case Against Human ReadabilityDietmar Hauser
 
More Intuitive Programming Through Better Code Completion
More Intuitive Programming Through Better Code CompletionMore Intuitive Programming Through Better Code Completion
More Intuitive Programming Through Better Code CompletionDietmar Hauser
 
Going Rogue - 8 Months On My Own
Going Rogue - 8 Months On My OwnGoing Rogue - 8 Months On My Own
Going Rogue - 8 Months On My OwnDietmar Hauser
 
The Rocky Road to KISS Rock City
The Rocky Road to KISS Rock CityThe Rocky Road to KISS Rock City
The Rocky Road to KISS Rock CityDietmar Hauser
 
A Half Life in Game Development
A Half Life in Game DevelopmentA Half Life in Game Development
A Half Life in Game DevelopmentDietmar Hauser
 
Toolchain Independent Distributed Compilation
Toolchain Independent Distributed CompilationToolchain Independent Distributed Compilation
Toolchain Independent Distributed CompilationDietmar Hauser
 
The Difficulty of Going Mobile
The Difficulty of Going MobileThe Difficulty of Going Mobile
The Difficulty of Going MobileDietmar Hauser
 

More from Dietmar Hauser (11)

The Case Against Human Readability
The Case Against Human ReadabilityThe Case Against Human Readability
The Case Against Human Readability
 
More Intuitive Programming Through Better Code Completion
More Intuitive Programming Through Better Code CompletionMore Intuitive Programming Through Better Code Completion
More Intuitive Programming Through Better Code Completion
 
Data Compression 2020
Data Compression 2020Data Compression 2020
Data Compression 2020
 
The Abstraction Trap
The Abstraction TrapThe Abstraction Trap
The Abstraction Trap
 
The Settlers Returns
The Settlers ReturnsThe Settlers Returns
The Settlers Returns
 
Going Rogue - 8 Months On My Own
Going Rogue - 8 Months On My OwnGoing Rogue - 8 Months On My Own
Going Rogue - 8 Months On My Own
 
The Rocky Road to KISS Rock City
The Rocky Road to KISS Rock CityThe Rocky Road to KISS Rock City
The Rocky Road to KISS Rock City
 
A Half Life in Game Development
A Half Life in Game DevelopmentA Half Life in Game Development
A Half Life in Game Development
 
Devil Dentist
Devil DentistDevil Dentist
Devil Dentist
 
Toolchain Independent Distributed Compilation
Toolchain Independent Distributed CompilationToolchain Independent Distributed Compilation
Toolchain Independent Distributed Compilation
 
The Difficulty of Going Mobile
The Difficulty of Going MobileThe Difficulty of Going Mobile
The Difficulty of Going Mobile
 

Recently uploaded

eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolsosttopstonverter
 
Santander Stream Processing with Apache Flink
Santander Stream Processing with Apache FlinkSantander Stream Processing with Apache Flink
Santander Stream Processing with Apache Flinkconfluent
 
Strategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsStrategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsJean Silva
 
Transform your Corporate Strategy Office - Harness OnePlan’s Strategic Portfo...
Transform your Corporate Strategy Office - Harness OnePlan’s Strategic Portfo...Transform your Corporate Strategy Office - Harness OnePlan’s Strategic Portfo...
Transform your Corporate Strategy Office - Harness OnePlan’s Strategic Portfo...OnePlan Solutions
 
VictoriaMetrics Q1 Meet Up '24 - Community & News Update
VictoriaMetrics Q1 Meet Up '24 - Community & News UpdateVictoriaMetrics Q1 Meet Up '24 - Community & News Update
VictoriaMetrics Q1 Meet Up '24 - Community & News UpdateVictoriaMetrics
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slidesvaideheekore1
 
Advantages of Cargo Cloud Solutions.pptx
Advantages of Cargo Cloud Solutions.pptxAdvantages of Cargo Cloud Solutions.pptx
Advantages of Cargo Cloud Solutions.pptxRTS corp
 
AmsterdamJUG April 2024 - Going serverless with Quarkus GraalVM native images...
AmsterdamJUG April 2024 - Going serverless with Quarkus GraalVM native images...AmsterdamJUG April 2024 - Going serverless with Quarkus GraalVM native images...
AmsterdamJUG April 2024 - Going serverless with Quarkus GraalVM native images...Bert Jan Schrijver
 
[ CNCF Q1 2024 ] Intro to Continuous Profiling and Grafana Pyroscope.pdf
[ CNCF Q1 2024 ] Intro to Continuous Profiling and Grafana Pyroscope.pdf[ CNCF Q1 2024 ] Intro to Continuous Profiling and Grafana Pyroscope.pdf
[ CNCF Q1 2024 ] Intro to Continuous Profiling and Grafana Pyroscope.pdfSteve Caron
 
Understanding Plagiarism: Causes, Consequences and Prevention.pptx
Understanding Plagiarism: Causes, Consequences and Prevention.pptxUnderstanding Plagiarism: Causes, Consequences and Prevention.pptx
Understanding Plagiarism: Causes, Consequences and Prevention.pptxSasikiranMarri
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shardsChristopher Curtin
 
What are the core components of Azure Data Engineer courses.docx
What are the core components of Azure Data Engineer courses.docxWhat are the core components of Azure Data Engineer courses.docx
What are the core components of Azure Data Engineer courses.docxkzayra69
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldRoberto Pérez Alcolea
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...Bert Jan Schrijver
 
The Ultimate Guide to Performance Testing in Low-Code, No-Code Environments (...
The Ultimate Guide to Performance Testing in Low-Code, No-Code Environments (...The Ultimate Guide to Performance Testing in Low-Code, No-Code Environments (...
The Ultimate Guide to Performance Testing in Low-Code, No-Code Environments (...kalichargn70th171
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...OnePlan Solutions
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?Alexandre Beguel
 
Pros and Cons of Selenium In Automation Testing_ A Comprehensive Assessment.pdf
Pros and Cons of Selenium In Automation Testing_ A Comprehensive Assessment.pdfPros and Cons of Selenium In Automation Testing_ A Comprehensive Assessment.pdf
Pros and Cons of Selenium In Automation Testing_ A Comprehensive Assessment.pdfkalichargn70th171
 
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdfAndrey Devyatkin
 
Effectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorEffectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorTier1 app
 

Recently uploaded (20)

eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration tools
 
Santander Stream Processing with Apache Flink
Santander Stream Processing with Apache FlinkSantander Stream Processing with Apache Flink
Santander Stream Processing with Apache Flink
 
Strategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsStrategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero results
 
Transform your Corporate Strategy Office - Harness OnePlan’s Strategic Portfo...
Transform your Corporate Strategy Office - Harness OnePlan’s Strategic Portfo...Transform your Corporate Strategy Office - Harness OnePlan’s Strategic Portfo...
Transform your Corporate Strategy Office - Harness OnePlan’s Strategic Portfo...
 
VictoriaMetrics Q1 Meet Up '24 - Community & News Update
VictoriaMetrics Q1 Meet Up '24 - Community & News UpdateVictoriaMetrics Q1 Meet Up '24 - Community & News Update
VictoriaMetrics Q1 Meet Up '24 - Community & News Update
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slides
 
Advantages of Cargo Cloud Solutions.pptx
Advantages of Cargo Cloud Solutions.pptxAdvantages of Cargo Cloud Solutions.pptx
Advantages of Cargo Cloud Solutions.pptx
 
AmsterdamJUG April 2024 - Going serverless with Quarkus GraalVM native images...
AmsterdamJUG April 2024 - Going serverless with Quarkus GraalVM native images...AmsterdamJUG April 2024 - Going serverless with Quarkus GraalVM native images...
AmsterdamJUG April 2024 - Going serverless with Quarkus GraalVM native images...
 
[ CNCF Q1 2024 ] Intro to Continuous Profiling and Grafana Pyroscope.pdf
[ CNCF Q1 2024 ] Intro to Continuous Profiling and Grafana Pyroscope.pdf[ CNCF Q1 2024 ] Intro to Continuous Profiling and Grafana Pyroscope.pdf
[ CNCF Q1 2024 ] Intro to Continuous Profiling and Grafana Pyroscope.pdf
 
Understanding Plagiarism: Causes, Consequences and Prevention.pptx
Understanding Plagiarism: Causes, Consequences and Prevention.pptxUnderstanding Plagiarism: Causes, Consequences and Prevention.pptx
Understanding Plagiarism: Causes, Consequences and Prevention.pptx
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards
 
What are the core components of Azure Data Engineer courses.docx
What are the core components of Azure Data Engineer courses.docxWhat are the core components of Azure Data Engineer courses.docx
What are the core components of Azure Data Engineer courses.docx
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
 
The Ultimate Guide to Performance Testing in Low-Code, No-Code Environments (...
The Ultimate Guide to Performance Testing in Low-Code, No-Code Environments (...The Ultimate Guide to Performance Testing in Low-Code, No-Code Environments (...
The Ultimate Guide to Performance Testing in Low-Code, No-Code Environments (...
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?
 
Pros and Cons of Selenium In Automation Testing_ A Comprehensive Assessment.pdf
Pros and Cons of Selenium In Automation Testing_ A Comprehensive Assessment.pdfPros and Cons of Selenium In Automation Testing_ A Comprehensive Assessment.pdf
Pros and Cons of Selenium In Automation Testing_ A Comprehensive Assessment.pdf
 
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
 
Effectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorEffectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryError
 

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