Titans of Space for Cardboard - Lessons Learned

Posted Feb 27th, 2015

Warning: long post ahead!

Well, this has been very interesting.

After a good long while of ignoring Cardboard as a legitimate platform, I finally took the time to dig into it. I’ve been receiving many emails over the last year asking if there will be an Android/Dive/Cardboard version of Titans of Space, so I’m recognizing there is some degree of demand for this.

It’s probably a lot easier now than it used to be to put together a Cardboard app built with Unity since there is now a sufficiently robust Cardboard SDK for Unity. I appreciate the to-the-point simplicity it offers, which made things easy to test. Google’s developer console is a pleasure to use as well, with its professional Alpha/Beta/Production staging capabilities. Also, Android is apparently everywhere, so I’m actually completely intimidated by the idea that I’m releasing an app that will potentially be seen by so many people.

I’m still not sure how I’ll monetize all this VR stuff just yet. Titans of Space has always been free and will continue to be on all platforms, but its sequels and add-ons will not be free. However, most of those are still a ways off so I’m experimenting with some simple text advertisements / sponsorships in the loading screen and the end screen after the tour. Nothing too major, but it’s a start.

Now that Titans of Space has been ported for the Cardboard platform, it gives me great pleasure to see it featured in Google’s Cardboard apps collection. I consider this a huge win given the size of the userbase.

Here’s what I learned and observed while porting Titans of Space to Cardboard:

1) Many phones used with Cardboard are quite forgiving of framerate. In this case, I tested with a Nexus 5 phone. It looks like an RGB display to me, so in a Cardboard-compatible headset it feels like it could be DK1 with a much narrower FOV. Without the low-persistence display found in DK2/Gear VR, it’s very blurry when quickly looking around. However, since my framerate was varying between 30 and 60 FPS (depending on whether it was throttling clock speeds), the Nexus 5 display somewhat covers up most of the sub-60 FPS judder. Easy breezy. There’s still a tremendous benefit to keeping a solid 60 FPS for a fluid experience, but at least it’s not the end of the world when it’s not.

2) Because Cardboard works with a ton of different Android devices, each with different display characteristics, it can be a challenge to account for both the black blacks of OLED displays and the dim gray backlight of other displays. The starfield in Titans of Space can look completely different on one device versus another. It’s not bad either way, but I can imagine that this may complicate art and gameplay tuning for some apps out there.

3) The standard Google Cardboard viewer has tiny lenses and a low FOV. For an experience like Titans of Space, this is unfortunate as so much of the experience is about looking around your environment. It’s much harder to notice things in the peripheral vision so that you know to look there. It will be interesting to see what kind of reviews I get. Browsing through the reviews of other apps is incredibly amusing and maddening, and I get the sense that there are many players out there that are happy to assign 1-star ratings for just about anything. The upside is that there are many Cardboard-compatible headsets out there with larger lenses and a more comfortable faciaL interface. Some even have straps!

4) Speaking of straps, since the standard Google Cardboard and many of its variants do not have straps, this changes things. The player will have to hold the headset up with one hand, and if the player isn’t used to holding up their arm this way, it can result in a shaky view and a tired arm for longer experiences. The shaky view can be a little bit of an immersion breaker sometimes. The overall player experience will vary quite drastically depending on the combination of device and headset they choose to use.

5) I’m unaware of any VR-enabled launcher out there for Cardboard, so we cannot rely on the user to be wearing the headset when the app starts. So, it turns out that when your app starts head-tracking, it’s important to immediately render a visible floor under the player and not just have an empty blackness down there. If the player has set their phone down on their desk or lap, they won’t see anything except maybe the vertical divider down the middle, and may cause some players to immediately give up thinking something is wrong with the app.

6) Like Gear VR, Cardboard VR is mobile, which means that care must be taken in orienting the player’s forward direction. Gear VR automatically reorients the view when putting the headset on and IMO this is a wonderful and unappreciated feature, and I would like Cardboard apps to do something similar. Various Android devices means varied sensor capabilities, and of course drift is still not a completely solved problem when relying only on internal sensors. Drift is very much an issue for seated cockpit experiences like Titans of Space, although I suspect this will be addressed in a future Cardboard SDK release. Other than headtracking, Cardboard-compatible headsets only have one input – the magnet switch. If I were making an experience that was completely hands-free from start to finish, then sure, the magnet switch is a perfect way for the user to reset the view. In this case, I need that input as a way of selecting buttons, so I took a cue from Google’s Cardboard demo app, and decided to make tilting on the side result in reorienting the player’s forward direction. For headsets without straps this is super easy to do at any time. For those with straps, I hope they have a controller or a swivel chair…

7) Without a VR launcher, you need an actual app icon now. I probably should hire a graphic artist at some point!

8) Unlike Gear VR, there isn’t going to be a carefully controlled clock-speed for devices running a Cardboard app, and as a result the app’s framerate can vary wildly depending on how the phone wants to throttle heavy demands on its processors. Other than requesting the wake-lock permission to prevent the CPU from going to sleep, the best I could do is warn players in the description than they’re going to need a powerful modern phone for best results. The upside is that you can cram somewhat more complex scenes into a Cardboard, though it will heat up and run the framerate into the ground, depending on the device of course. For short and sweet VR experiences, this free-for-all approach still makes things easier.

9) Out of the box, I didn’t see an implementation of a neck model in the Cardboard SDK for Unity. I might be blind, but I wasn’t feeling my view move around with a virtual neck in-game. I had to implement this myself by hacking the SDK a bit. I hope Google includes this in a future SDK update as that’s a critical feature in my eyes. EDIT: I’ve been informed that simply having a CardboardHead as the parent of the StereoController and setting up the local position of the StereoController as the neck-to-eye offset should do the trick without having to rip into the SDK.

10) Multi-threaded rendering currently does not work with the Cardboard SDK. I’ve been using Unity 4.6.1p5 if that makes any difference to someone reading this.

11) In the Gear VR version, I am making full-use of a 24-bit depth buffer. The Cardboard SDK is hardcoded to use a 16-bit depth buffer, so I needed to change that in the SDK code.

12) Uploading an app larger than 50MB to Google Play requires splitting up the binary into two pieces. Fortunately Unity makes this part easy. Note that a while back, you could only download the first piece (< 50 MB) via Google Play, and your program has to download the rest from Google’s servers. I’m not 100% on this, but I think the requirement to manually download the expansion isn’t necessary anymore, especially for the types of devices required to run a Cardboard app.

13) I finally opened up my old Dodocase viewer that I picked up at the Proto Awards last year, and found it to be a big improvement over the standard Google Cardboard viewer, mainly for two reasons: The magnet switch is way easier to pull and therefore less of a strain to aim at something in VR while pulling the switch, and because it comes with a big black sticker to put where your forehead meets cardboard. Seeing how these subtle differences had a big impact, I’m now quite curious about all the more robust headsets out there. Note that there is a newer Dodocase viewer out now with capacitive touch for the switch! Even so, this has nothing on Gear VR’s superior touchpad and back button.

14) Headtracking latency is still pretty terrible on most devices. However, I will admit that it’s not as bad as I thought it would be on some of the newest phones out there. It think it can be acceptable, especially for someone new to the idea of VR.

15) No Async Timewarp on Cardboard means that head-tracking loading screens are once again uncomfortable. I needed to update my app to delay the start of VR mode until after the loading screen.

16) Access to a pay store is certainly a bonus! See my next post for my first attempt at monetization.

So, working on a Cardboard port of a Gear VR title definitely highlights how different these two mobile VR platforms are. I will admit that with the standard viewer and its low FOV, Cardboard can technically only barely be called VR, but now that there are a growing number of viewers with straps and larger lenses and FOV, I’m starting to warm up to calling it the “rowdy little brother of mobile VR”, or something.

In any case, they both clearly have very different strengths, and their characteristics are evolving very rapidly. Gear VR as a platform seems to me to be a fine piece of engineering and thoughtfulness, and is setting the bar and leading by example. Cardboard as a platform feels like a raw and rapid expansion into an empty segment of the market, creating opportunity along the way.

Hope these observations were helpful, although it’s probably all old news for the many Cardboard devs already out there. This is basically my first time publishing something to an established mobile app store with millions of users.

Wish me luck!