The lasts weeks I have been trying and playing with different frameworks, methodologies and alternatives to mobile cross-platform development. In today’s post I would like to share with you my conclusions and… headaches.
So, you know, by definition cross-platform development is never an easy issue. Every platform is very different from each other just because it needs to differentiate from the competitors. So you, as a cross-platform developer, have to deal with it. Period.
Differences between platforms
The platforms I’m going to consider along this article are: iOS, Android, and Windows Phone. From the point of view of the developer there are a bunch of important differences between these platforms:
- Programming language. Every platform uses a different main programming language: Objective-C for iOS, Java for Android and C# for Windows Phone.
- Hardware and Desktop OS requirements. For iOS development you need an Apple Mac computer with OSX. For Windows Phone development you need any computer with Windows OS. For Android development you are not restricted to any desktop OS or computer.
- Programming tools. Every platform has its own preferred programming tools (IDE). Xcode for iOS, Eclipse for Android and Visual Studio for Windows Phone. Obviously, if you want you can use any text editor in any platform but I would not try it…
- Devices capabilities and features. You know, this is one of the main headaches. There are a lot of devices with different capabilities and features (specially in the Android ecosystem). You will probably need to focus on a manageable amount of target devices.
- Mobile OS particularities (user experience). Another big headache. Every mobile OS is completely different from each other from the user experience perspective. That really increases cross-platform development difficulty.
- Screen sizes and resolutions. The most famous cross-platforms development headache…
So, as you can see, there are a lot of important factors to take into account if you are planning to go for cross-platform development. And this is only from the developer perspective. If you are indie, you will also need to take into account strategical and commercial factors. However, this (headache) is out of the scope of this article.
So, my problem statement is:
I need a framework/tool/methodology/strategy/something that allows me to create both mobile games and apps for iOS, Android and Windows Phone, saving a significant amount of time while providing the best user experience.
Easy, huh! 😉
My priority list
So, based on my problem statement, I wrote down a priority list for my requirements. From highest priority to lowest:
- User Experience. I have spent a lot of time creating iOS apps that offer to the user the best iOS user experience. Actually, this is currently my commercial strategy: I create high quality iOS apps and games spending a lot of time on UX design. This is something I don’t want to lose.
- I’m currently developing exclusively for iOS. The first platform I plan to jump into is Android. Later I will go for Windows Phone. So, by now, an iOS-Android solution is ok for me.
- Notice that in my problem statement I used the word “significant” when talking about time saving. I don’t really need to be able to reuse all the code or a high percentage of it. I only need the amount of saved time that makes cross-platform development worthwhile for an indie like me.
- Both games and apps. I need to be able to develop games and apps, with the same solution if possible.
- Cost don’t appear in my problem statement but, obviously, the solution I adopt must be affordable for me.
So, the solution I’m looking for needs to provide a perfect balance among the items in my priority list.
According to my experience, the alternatives that are available currently can be divided into two main groups:
Currently, HTML5 solutions still have performance issues. So, although, performance is not explicitly in my priority list, it is part of the user experience. That’s why I avoided this large group of solutions.
Most OpenGL solutions do not present performance issues, at least for the kind of projects I usually work on. Generally, OpenGL based solutions are a good choice for game development: they allow me to provide a good user experience, they allow cross-platform development both for iOS and Android (and some of them also for Windows Phone) and they allow me to save a significant amount of time.
The problem is that it is very difficult to provide a good user experience when developing apps with OpenGL based solutions (the same problem is also present in the HTML5 based group). It is very time-consuming to reproduce all de nuances of each mobile OS user interface (animations, pixel-level details, shadows, reflections, …)
So, it looks like it is relatively easy to find a good cross-platform solution for game development in the OpenGL based group.
However, it seemed that if I wanted to offer the best user experience when working on apps I would have to develop them natively using the specific tools provided by Apple, Google and Microsoft.
The Mono family
MonoTouch and Mono for Android are “commercial products built on top of Mono, which is an open-source version of the .NET Framework based on the published .NET ECMA standards”. For more details, refer to the official website.
The interesting thing for me is that MonoTouch and Mono for Android provide a C# abstraction layer to create native apps for iOS and Android. The frameworks provide bindings for almost all iOS and Android SDK functionalities. So the created apps looks exactly the same as the ones created with the official SDKs. Therefore, the user experience is the best possible.
On the other hand, “MonoGame is an Open Source, free OpenGL implementation of the XNA Framework for MonoTouch, Mono for Android, Mac OS X, Linux and Windows”.
So, the Mono family provides a powerful framework based on .NET technologies and C# that allows me to create apps for iOS, Android and Windows Phone. That doesn’t mean cross-platform directly, but combined with a good MVC (Model View Controller) design the amount of time saved may be significant, specially for the kind of projects that need a lot of Model logic.
That fits quite well my problem statement: using the Mono family I can create apps an games with the best user experience, I can create apps for iOS, Android and Windows Phone and, if I manage to come up with a software design that decouples the View code from the rest (using the MVC pattern), the amount of time saved may be significant.
EDIT: the CELL·SDK project has been cancelled (probably because of a lack of funds). The theoretical part of this article (the analysis) is still valid. However, now the whole .NET and C# thing isn’t so interesting for me now. I will write a follow up article discussing my new situation regarding cross-platform development.
However, MonoGame is still a low level framework for game development. Here comes CELL·SDK. CELL·SDK is a promising high level game development engine build upon the Mono family. So, you can benefit from all the advantages of the Mono family for app development plus the ability to rapidly create games using CELL·SDK.
The nice thing is that you develop both games and apps using the same development environment: C# and .NET.
So, my choice is Mono family + CELL·SDK. I have never worked with .NET technologies. That is a drawback. However, they look very powerful and quite easy to learn. Actually, I’m very exited with them 🙂
Yes, I know what you are thinking right now. This solution is not free?! No, it isn’t. Actually, it is probably one of the most expensive solutions. That’s why I wouldn’t recommend it to an indie that is starting his way on the mobile app development. However, I think that if you have some business build up around app development and you can invest some time building a workflow around this technologies that fits your needs, it is the best solution possible taking into account my problem statement requirements (specially the user experience one).
So, that’s the solution I’m trying right now 🙂 I’m developing a new app for a client using MonoTouch and Mono for Android.
I’m also working in a new game using CELL·SDK. By the way, I plan to submit it to the “CELL·APP Awards“. Wish me luck! 🙂