Building Outer Wonders for multiple platforms

Building Outer Wonders for multiple platforms

#outer-wonders #technology

Hi! In our latest blog post, we outlined the tasks we would start working on to publish the playable demo ofOuter Wonders on itch.io on April 2nd. We also mentioned that we want this demo to support 2 platforms: Windows and Linux. This week's blog post explains how we will make it possible!

Challenges of building a game for multiple platforms

Making a game for multiple platforms requires the gameplay mechanics and technology to be able to handle numerous cases:

  • hardware-wise: multiple screen sizes and resolutions, various input methods (game controller, keyboard, mouse, touch screen), and hardware specifications (CPU, RAM, graphics card, etc.);
  • software-wise: this is probably less known, but the game has to support various operating system versions (Windows 10, Windows 8, Windows 7, Ubuntu 20.04, Ubuntu 18.04, etc.), as well as various system component versions (DirectX, OpenGL, Vulkan, etc.), all of which are connected to the hardware specifications.

Supporting various hardware requires designing the game's mechanics properly, as well optimizing and testing thoroughly on each of the target platforms. But Outer Wonders is such a simple game that it is quite naturally fit for running on various platforms.

When it comes to the software aspects, though, the challenges are all about technology. In order for a game to run on a given platform, the game has to use the features provided by this platform. However, the diversity of platforms creates a diversity of features.

For example, a game released on Steam will most likely use Steam's own achievement and saving features. If the game is released for a console, it will probably use this console's saving features instead.

Overall, we could say each platform speaks its own language. However, we aim to make a single game that can run on all of these platforms! It is therefore necessary to speak all of these languages somehow, although implement this is very time-consuming.

Short comic illustrating the challenge of getting a game to communicate with various platforms. In this comic, the game, depicted as Bibi asks a Windows computer to create a window but the computer does not react to this request. Bibi starts thinking, and then says "CreateWindowA", causing the Windows computer to react properly by opening the requested Window. Right after that, Bibi says the same formula to a Linux-powered computer, which does not understand the request.

Getting a game to run on multiple platforms

If you are to support multiple platforms, then it is best to consider it soon in the project. There are multiple tools for this, such as SDL2, that allow developers to use a single language for all platforms, but in order to so, you have to use this language from the very beginning, otherwise you will have to switch languages during the making of the game. Such tools, referred to as abstraction layers, are used as middlemen to translate requests expressed in this common language to each of the platform-specific languages.

Diagram showing how to communicate with a platform using an abstraction layer. In this diagram, the game, depicted as Bibi again, requests the creation of a window again, but using an abstraction layer this time. The abstraction layer then asks each platform to create a window using the platform-specific language, using the CreateWindowA function on Windows, and the wl_egl_window_create function on Linux.

In some situations, this may not be enough, though. Even if the core features necessary for all games (graphics, sound, etc.) are exposed by abstraction layers most of the time, some other features are still absent from these tools; in such situations, it is often necessary to deal with the nitty-gritty yourself, which means creating a new abstraction layer for the missing feature, by speaking each of the platform-specific languages directly.

We had to resort to this for some minor features of Outer Wonders, such as retrieving the list of languages spoken by the user, which is necessary to display the game's interface in a suitable language automatically (this means that, if your system's language is set to french, the game's interface will be automatically shown in french without having to go to the game's settings!).

The outcome

As of today, we are able to run Outer Wonders on many different Windows-powered computers, including those running… Windows Vista. Yes, you've read that correctly. Here's a screenshot of the game running on a Windows Vista-powered computer dating from 2007.

Screenshot of a Windows Vista Service Pack 2 system running Outer Wonders.

It turns out that, on Windows, Outer Wonders speaks a language that Windows Vista could already understand back when it was released (for instance, the game can use Direct3D 11 for rendering), making it compatible with this operating system.

We've also worked on Linux support. We still have a bit of work left to do here, but testing on Ubuntu showed that we already have basic support implemented for such systems.

Screenshot of an Ubuntu 20.04 system running Outer Wonders.

And this concludes this blog post! Follow us on Twitter, Facebook and Instagram to read our news and play weekly puzzles! Subscribe to our RSS feed to keep informed about our latest blog posts. A Discord community server is also on the way.

See you soon!