Dev Diary – June 2023

We’re back from the Dev Diary hiatus with a lengthy one! We have some important news about Downtown Club such as choosing early access and dropping Quest 1 support, plus some more development insight that you might find interesting. There’s a lot to read, so buckle up!

What are they talking about?

What’s up?

I have to say I’m doing well right now. On one side, things are chill here at my new home, but on the other side I continue feeling a lot of pressure from the work I’m doing, for a number of reasons that I will explain below. Nothing worrying, just the usual amount of stuff that piles up and makes you want to scream at the wind.

Anyways, this August I’m going to Gamescom in Cologne for my first time! You will find me roaming around the convention Wednesday 23rd and Thursday 24th. Really excited to visit the convention and to meet with fellow VR developers!

Unity for VR is in a bad state right now

Some of you might have noticed me ranting a lot about Unity lately, in regards to VR development in conjunction with URP (Universal Render Pipeline), despite being the engine and the pipeline of choice for all my games. For context, each major Unity version seem to run slower than the previous one when you compile the game for mobile VR using URP, and this is the reason me and other developers are still stuck with Unity 2020. Updating any of our games to Unity 2021 or 2022 makes them run slow to the point they can’t reach 72 fps and also have generally unstable framerate. Unity 2023 is still a beta so it’s out of discussion. Neodori Infinity originally started in Unity 2021 and in fact it was stuttering a lot, unable to reach 72 fps even with its simple graphics. Some time before launching the game, I decided to downgrade it to Unity 2020 and it magically reached smooth 90 fps without changing anything else in the project. As simple as that, but truly a mystery.

This problem has been known for very long in the VR Unity developers community, but it’s also been vastly ignored by Unity staff, which just recently answered vaguely to a small part of the problem by closing the issue labelling it “by design” (ironically, the issue has turned back to “Active” literally as I’m writing this post!). This has been a disheartening battle so far, and my number one cause for lengthy iteration times. Another big reason why I’d love to update is that I’m working with an Apple Silicon computer, and the first native version that supports it is Unity 2021- prior to that, everything runs under Rosetta emulation. Unity 2020 is admittedly an old version and I also fear it will stop being supported somewhat soon, reason why I constantly try the most recent updates of 2021 or 2022, but still with zero success. Every attempt is a considerable waste of time because as you know I’m the only programmer in this team of two, and at this point I think I should quit trying and just stick forever with 2020, hoping for the best. Ironically, it seems like Unity 2019 is even faster than 2020 but maybe that’s a bit too old. Somebody stop me from trying…

Here’s a fun recap of what I tried so far and how it went:

  • Unity 2020 – URP – OpenGL (current setup): performance ok
  • Unity 2020 URP – Vulkan: various shader glitches, random crashes, performance ok
  • Unity 2020 – Builtin pipeline – OpenGL: bad performance
  • Unity 2020 – Builtin pipeline – Vulkan: bad performance, random crashes
  • Unity 2021 – Any pipeline – OpenGL: worse performance
  • Unity 2021 – Any pipeline – Vulkan: crashes often at startup, worse performance
  • Unity 2022 – URP – OpenGL : editor crashes too often, worse performance

It’s worth mentioning that builtin pipeline is not faster for me, because it doesn’t have the SRP Batcher, an automatic tool that can heavily reduce draw calls, and on which I rely a lot for my projects.

Keep in mind this seems to be a big problem just with mobile VR, because these devices are really weak and need to render very fast. Smartphones instead are so powerful today that performance is barely a problem if you optimise a bit, let alone computers and consoles, and you can just get away with 30 fps on those platforms anyways. Right now it feels like Unity doesn’t mind the problem because Quest 3 is coming and it’s more powerful, so who cares if URP became slow and bloated over time? Let’s throw more power at the problem and waste a good chunk of CPU and GPU to circumvent a major issue, instead of using it for pushing the limits of what the hardware can do! Me and my paid Unity subscription will be very happy to be proven wrong.

Neodori Infinity launched with the wrong version

The topic above nicely brings me here, because when Neodori Infinity launched, lots of players were served with the wrong version of the game (0.9.6), which was still compiled with Unity 2021, in fact some of them reported bad framerate. Too bad the version I selected for launch was actually 1.0.0, compiled with Unity 2020 and free of bugs, but for some reason it wasn’t available to most players.

This happened: 0.9.6 was the version I used for AppLab approval. It was an ok version but I still had various things to improve, including downgrading to Unity 2020 to get good performance. When 1.0.0 was almost ready, I started seeing a notice in the developer dashboard about raising the Android API Level to 32. Without thinking too much about that, I applied the change and set version 1.0.0 for launch. Unfortunately, setting the API Level to that value caused a lot of users to be unable to receive the update, because their Quest didn’t have yet the firmware version that could read that API Level… And some were even prompted with an odd message when buying the game, and an even worse reply from the official support. So when users eventually bought the game, they received version 0.9.6 because 1.0.0 wasn’t compatible with their Quest firmware. What a mess.

It took some days to realise what was happening because my tickets to Meta went unanswered, so I have to thank other Quest developers who were experiencing a similar situation with their games. I believe I mistakenly changed the Minimum API Level instead of the Target API Level, but I really cannot remember which of the two were specified in the dashboard notice, I should have paid extra attention. Reverting the API Level back to a lower number fixed the issue, players finally started receiving the correct update, and are now able to buy the game without weird popups. We’ve been lucky that game reviews were still great despite the half-botched launch and the evident performance issues.

Screenshot from the developer dashboard. Guess at which point version 1.0.0 became available to everyone? You can see the crazy difference in framerate.

Downtown Club will launch in Early Access

So, in the last few months a lot of work piled up: Neodori Infinity porting and launch was worth two full months of effort, lots of days have been wasted on Unity performance testing, and in general DTC is revealing far more complex than I thought if I want to achieve my desired quality standards. Going this slow is starting to feel heavy on my shoulders and the thought that DTC is still not out and playable is often creeping me at night. Good times when I thought I could release this by the end of 2021, let’s have an hysterical laugh at it.

The obvious choice right now is to scale down on launch content and features, and release DTC as an Early Access title once we are ready. This also means that launch price will be cheaper, and you’ll get to keep the game once it’s out of Early Access and back to full price. Launch features will be largely the same as originally planned, but without some of the most work-intensive content, which will be added later on with updates. I’ll share more details soon, as well as a preliminary roadmap about the first updates, but please don’t expect a release date just yet.

The Downtown map will feature some wide parking areas.

An update on DTC driving physics

The driving physics in V-Speedway was completely customised by me and I’m always been very firm about not using third party assets for the sake of originality. This was perfectly doable for V-Speedway considering it only has one car and one very simple map, but with DTC I wanted to expand my own system to support a wider variety of cars and a higher complexity of driving. This turned out to be really difficult and the results I got are far from satisfying. I feel like I’m running in circles over a few behaviours and it’s starting to suck too much time from the other work to do.

After melting my brain on this for weeks, for the sake of my sanity I decided to surrender and use a 3rd party asset for car physics in DTC, as many other racing games also do. I feel like I’ve lost a big battle, but this will solve lots of problems in just a bunch of steps and I can’t deny how much of a relief this is. Car physics in DTC will feel radically different from V-Speedway and more realistic than before. I think this is something that players will enjoy, but I will try to keep things accessible for everyone. I’m testing a couple of different systems now, and I’ll post a driving video as soon as I have a good setup.

DTC will NOT support Quest 1

This one was long coming, sorry for that. If I had released DTC last year this would not have happened, but Meta is officially terminating support for Quest 1, and Quest 3 is now around the corner. This is not much about performance, but about staying up to date with SDKs and not having to create a separate build for Quest 1, which will be a major headache to maintain with a game as complex as DTC. We all loved Quest 1, but today the playerbase is negligible compared to Quest 2 and continues to shrinking down each day, it’s no longer worth the effort.

V-Speedway and Neodori Infinity will remain compatible for Quest 1 unless we are completely forced to drop support for it (unlikely to happen).

Racing through the old Downtown area.

Neodori Infinity updates

We don’t have yet set dates for the next major update, but the devs at Strobetano are preparing new content right now! And for the next quality of life update, I’ll add an hint system that will clear some doubts and make it easy to discover all the quirks of the game, plus vibration feedback for the whole game and a due fix to the UI so it won’t cover the road as much as it does right now. Please stay tuned for it!

Wrapping up

That was quite the wall of text! I hope it wasn’t tiring to read as much as it was to write… I hope to be able to share more updates soon, so I’ll be back working right now. Thanks a lot for sticking around and see you soon!

Danjel Ricci “SkyArcher”