As 2019 comes to a close – I’m sure that many of our fans are excited for an update about Citra Android development. It’s no secret that we have been hard at work on the Android port and we are just as excited about it as you are! While work has slowed a little bit around the Holidays, we’ve actually made great progress in 2019, and we are still on track for a release in early 2020.
As a sneak peak, here’s some of the work we’ve already done for Android
- While the 3DS also uses ARM, there’s some complications that arise when you try to run an unmodified 3DS game on an Android device, so we recompile the game on the fly with our new ARM64 backend for Dynarmic, Citra’s Just-in-Time (JIT) CPU compiler. This has hugely improved performance, and special thanks to Sachin-v for his hard work on this!
- As a second general improvement to the CPU JIT we just wrote, we changed how the JIT accesses memory using a technique known as fastmem, which allows this new JIT to directly access memory. This is a very solid FPS improvement across the board for all games.
- Mobile CPUs aren’t near as powerful as a desktop CPUs, so we need to take advantage of multiple cores. We added work-in-progress multi-core support to run GPU emulation on another core, just like Dolphin’s dual core mode or yuzu’s async gpu option.
- It’s hard to play on a tiny mobile screen without physical buttons, so we added Gamepad Support
In addition to all those, we worked on other things for Android that we decided we could bring to Citra Desktop before we release Android
- We added support for caching shaders to disk, which will reduce in-game stuttering. This issue is much more severe on Android, as mobile GPUs are more limited than their PC counterparts.
- We have mostly completed an OpenGL ES 3 backend, which has fixed most graphical issues with games.
- We found some issues with how the frames were displayed on Android, and finally took the plunge to fixing a long standing issue in Citra with VSync. We ripped out a lot of old code and redesigned how we display the final image so that it will work properly with VSync and actually improved performance a bit with it too!
So why not release what we have?
While we’ve made significant progress in 2019, the current app simply does not work as well as we would like to warrant an official release. You’d likely find that unofficial Citra Android ports floating around the internet run pretty well, so why not release already! The truth is these ports have taken some leaked changes from our Android development (such as our new JIT backend and graphical fixes), added further hacks, and have not complied with GPL. It’s no coincidence that the unofficial ports have gotten so much better while the Citra team has been investing in Android. Consider their work a preview of what’s to come 😊
As a consequence, we’ve had to be a little stricter than we want to be, and are developing the app behind closed doors. We apologize for anyone who wants to contribute to Android right now, we’d love to work with you, but sadly releasing what we have too soon just leads to us competing with our own work in unofficial ports! As soon as the Android app is ready, all of the code will also be public and we look forward to collaborating with everyone who wants to contribute. In the meantime, all of the improvements made to Citra Desktop will be in Citra Android as well, so contributing to the Desktop is still very important if you want to make the Android version even better!
We believe it’s important to release a polished app from day one, and we think you’ll agree when you try it out.
So what is left before a release?
While our app is in pretty good shape already, it’s missing a few things that make it not quite right for primetime. Our goals before a release in early 2020:
- Full speed emulation for the most played games on medium to high end Android devices, with many games at least “playable” on lower end devices. Nothing’s more frustrating than audio pops and slow downs, which really kill the experience, so we have been hard at work to smooth out any slowdowns.
- Test out various improvements and continue ongoing work on asynchronous shader compiling, multi-core, New Nintendo 3DS support, optimized shader decompiler, GL state tracking, faster format reinterpret, and more. Essentially, we have good direction on how to improve performance and removing stutter, we just need to keep working at it until we finally get the smooth playing experience we all want.
- Further polish and refinements to the Android UX.
While our goals have been lofty, the list of remaining work is actually pretty short! If all goes well, we may be releasing an app sooner than expected!
Happy New Year!
- The Citra Team