as game developers and linux users, we from BrutalHack support as many platforms as possible in our projects (applications and games). Seeing that many developers struggle with this topic on reddit and twitter, we decided to share our knowledge on this topic.
"Cross-platform development is expensive"
This is a common misconception in game development and we want to give you insights on how to support multiple platforms (desktop, mobile and console) without large costs and why people believe elsewise.
In the second half we offer testing advice and recommend cheap hardware.
Ports are Dangerous
Most developer develop their game for a single system and begin "porting" it when it is nearly finished. This introduces new requirements at the end of development. A (not so) secret knowledge of software engineers and project managers is that late requirements can destroy any project.
Many games have fell into this pithole after announcing a linux release. Gauntlet, Divinity: Original Sin and Contagion are recent examples of games which had problems completing their linux versions due to various reasons. After all, these studios have years of windows experience but cross-platform is completely new terrain for them.
We want to help you avoid these traps and help you begin your successful cross-platform journey :)
The Cross-Platform Mindset
When you plan to develop a cross-platform game, you should use a game engine which can cross-compile to your target platforms. Furthermore, you must pay attention to a some points.:
- Aspect Ratio – You will encounter anything from 4:3 to 21:9
- Screen Size – Smartphones, tablets and desktops. 4 inches to 40+ inches.
These two points can easily be covered by emulating different screen sizes.
- Audio & Video Codecs – The supported codecs differ by platform.
- Platform-Specific Social Features – The interfaces and functionality differ by platform.
Thanks to Valves SteamPlay, it has become more common to release for the three common desktop platforms. While it's out of question, that Windows has the largest market share, OSX und Linux users prefer to buy games for their platform to support the development.
The input methods are nearly identical among the three platforms. However you must pay close attention to the compatibility of third party plugins and frameworks. Apart from that, the important differences to test are:
- Filesystems differ by platform. Even the path syntax is unique for windows.
- Windows – case-insensitive, home directory: C:\Users\Dude\
- OS X – case-insensitive, home directory: /Users/Dude/
- Ubuntu/SteamOS – case-sensitive, home directory: /home/Dude/
- GPU Drivers – Intel, AMD and nVidia drivers differ by platform. You must test the functionality (e.g. shader model version) and compatibility early (we'll cover testing later). Testing compatibility & performance too late can result in a case like the Linux version of "Middle-earth: Shadows of Mordor", which only supports nVidia GPUs.
- Does your game integrate into the platforms' window managers correctly? (minimize, fullscreen)
On mobile you will face other input methods, which you must bring together with the desktop input. This category has the most versatile display types you will see. Here are the special differences between mobile platforms:
- The filesystems on Android and iOS are case-sensitive in comparison to Windows Phone.
- The filesystem access rights differ greatly by platform.
- Windows Phone 8.1 only supports shader model 2
- The popular Unity asset "Spine" does not support Windows Phone. The problem and solution are known by the developer and it seems he doesn't intend to fix it. Always check assets for platform compatibilities!
- In Unity we recommend using the Mono compiler for Windows Phone, instead of the Microsoft compiler for maximum compatibility.
Disclaimer: Everything regarding the console devkits is under NDA. Thus we cannot tell you if we ever had any console devkits. All information we are giving you here is publicly available. We will decline any questions about devkits. Sorry :)
The current console generation has hardware similar to desktop computers, but an app-ecosystem similar to mobile devices. We will talk about devkits in the testing section below.
The console platforms have the following differences:
- The consoles support different shader languages:
- Xbox One: HLSL (Direct X 11)
- PlayStation 4: PlayStation Shader Language (GNM, GNMX)
- Wii U: ??? (GX2)
Unity only: GLSL shaders cannot be cross-compiled
- Games usually run in a sandbox, which limits your filesystem access rights
- Don't forget unique periphery, such as Wii controllers
Devices are expensive. Especially as an indie developer, buying all possible systems is just not possible when you start. However, if you follow the tips we gave you above, you only need a minimal testing environment at first.
If you are not developing native cross-platform multiplayer (floating point synchronisation), you only have to make sure that your game starts properly on all systems at first.
If you use Unity, Java or other cross-platform environments, you can assume that the cross-compilation / virtual machine will keep your game logic consistent across the supported platforms (unless you are doing something very exotic).
It's good practice to randomly choose which system you test a new feature on, because the platform should not matter for testing game logic.
Before releasing any version of your game, you should definitely test it on each target platform. It's quite embarassing to forget a small dependency which makes your game crash.
Minimal Testing Environment
Disclaimer: We are located in germany, so all prices are based on german retail prices (updated october 2015).
Let's assume that we are developing a game with Unity 5, which takes care of many cross-platform issues (e.g. different texture formats).
Our potential target platforms are:
- Desktop – Windows, OS X, Ubuntu/SteamOS (Linux)
- Mobile – iOS, Android, Windows Phone 8.1
- Consoles – Xbox One, Playstation 4, Wii U
We want to reduce the amount of devices which we have to buy, but still be able to playtest our game properly. By using the tips from above we will recommend you an initial testing environment for less than 200€ (Hardware listed in the next sections).
These platforms are somewhat similar. If you follow our advice from above, you can use your development machine for testing at first. You can install linux on your Windows (or OS X) computer to test your game on a case-sensitive and a case-insensitive system. You should also make sure that your game runs on Windows (or OS X) and Ubuntu Window Managers correctly (minimizing, fullscreen).
These platforms offer similar periphery, supporting keyboard/mouse as well as controller input. We recommend buying an Xbox 360 controller due to the "plug'n play" support on Windows & Linux systems. For a Mac, you will need a driver.
Recommended "initial" desktop setup (30€):
- Your development computer (If it runs on low graphics, its enough)
- Xbox 360 Controller (~30€ new)
While mobile devices all share the same touch-based periphery and sensors, their OS differ greatly: File system access differs between iOS, Android and Windows Phone, so you want to test all of your file operations before publishing.
In order to get started, we recommend buying the cheapest touch device available with a qualcomm quad-core cpu and 1GB of RAM.
Recommended "initial" mobile setup (70 - 150€):
- Windows Phone – Microsoft Lumia 532 (We bought one new for 70€)
- Optional: The cheapest Android tablet is the Amazon Fire (75€)
When you are developing a game for consoles, you should be fine with a computer and a controller (Xbox 360 controllers work on Windows and Ubuntu/SteamOS out of the box).
A common topic is the price of console devkits. While Sony and Nintendo keep quiet on prices for PlayStation 4 Devkits, the Xbox One Devkit is available free of charge if Microsoft approves your game idea.
We recommend first applying for a free XBox One Devkit and then grab the other Devkits later (Devkits are usually pricey).
Console manufacturers will expect you to sign a contract along with an NDA. Read these two documents very carefully. The contract might include information on how long you may have a Devkit and other important information about your game's release and publishing!
Complete Test Environment
Before you release your game on all platforms, we have to test it on real hardware. The following setup will cost around 2350€ including Apple OS X and iOS. Of course you can save money by abusing your friends' systems for occasional testing, especially Apple hardware! :)
For comparison, the Windows-only version of our complete desktop setup only saves the 500€ for the Mac Mini.
Recommended "complete" desktop hardware (~ 1630€):
- PC with an AMD A10 CPU with integrated GPU with Dual Boot: Windows 10 & Ubuntu 14.04 (~ 400€ new)
- PC with an Intel CPU + integrated GPU + dedicated nVidia GPU with Dual Boot: Windows 10 & Ubuntu 14.04 (~ 500€ new)
- Mac Mini (MGEM2D/A) (~ 500€ new)
- If you are really rich, get one Mac with an nVidia GPU (1500€+ on ebay) and one with an AMD GPU (~ 2000€ new)
- "Hackintoshs" are illegal. No discussion needed.
- Xbox 360 Controller (~ 30€ new)
- Two Windows 10 licenses for the PCs (~ 200€)
Windows 7 and Windows 8.1 will continue to have a great marketshare, so you should make sure that your game starts and runs on these older OS too.
Recommended "complete" mobile hardware (~ 695 €):
- Windows Phone: Microsoft Lumia 532 (We bought one new for 70€)
- Android: Motorola Moto G first generation (~ 150€ new)
Windows only: You can purchase a Nexus 5 for better driver support (~ 320€)
- The cheapest Android tablet is the Amazon Fire (75€)
- iOS: iPad mini 4 (~ 400€)
By purchasing the Lumia 532, Moto G, the Kindle Fire and the iPad mini 4, you can test on the most important aspect ratios and screen sizes, while also covering all major mobile OS. Keep in mind that most workflows require a Mac to deploy for iOS.
When we first began developing cross-platform software and games, we were surprised by the benefits for our codebase, because cross-platform code contains less assumptions about the underlying operating system. With modern engines like Unity 5 cross-platform development is more accessible than ever before.
Feel free to ask us questions about cross-platform development or linux development in thecomments section below or in social media :)