Even more performance 🚀
Moonlight XR released recently, and I have to give it to them, their performance is excellent, so I needed to catch up! I ripped apart the rendering pipeline and optimized just about everything. Now performance simply isn't an issue until you start pushing beyond 4K at 120 FPS with AI 3D and passthrough enabled. This should be especially good news for Quest 2 users, although we will have to see how it performs across more devices.
A new native OpenXR renderer
- Added a native, single-pass OpenXR rendering path that sends the decoder's video texture directly to the headset compositor, avoiding several expensive copies and intermediate rendering passes
- Improved decoder-thread throughput, MediaCodec latency, GLES texture uploads, and asynchronous depth capture
- Added support for HDR, brightness, contrast, gamma, and native runtime sharpening on the optimized rendering path
- Added extended refresh-rate options, including 144Hz, 165Hz, 200Hz, and 207Hz where supported by the headset
- Added more detailed performance statistics to help identify whether a limit comes from the app, video decoder, or AI depth inference
ZipDepth AI 3D
I discovered a new depth model called ZipDepth, a mobile-optimized model trained using Depth Anything V2 Large. It is both faster and higher quality than MiDaS, and inference is blisteringly fast. On Quest 3 it can now update depth at around 30Hz instead of the previous 20Hz target.
Because its performance and visuals are so much better, the Android APK now includes only ZipDepth-384-GPU. The old MiDaS, Depth Anything, CPU, and experimental models have been removed from the APK for now, reducing its size from roughly 214MB to 63MB. I still plan to keep a broader model selection in the Linux version.
ZipDepth is also loaded and warmed up asynchronously while the app is starting, so its GPU delegate no longer compiles over the first few seconds of an active stream.
There are still gains to be had on the AI inference front, but getting much further may mean training a new model—and that is a story for another day.
Ambient lighting and menu cleanup
- Added ambient screen lighting with Off, Static, Slow, and Live modes, plus selectable static colours
- Reorganized the settings menu into clearer Display, Stream, Control, AI 3D, and Picture tabs
- Simplified Android's AI 3D controls around its single supported ZipDepth configuration while retaining GPU priority, update cap, separation, convergence, and cursor tuning
- Moved Stats into a compact top toolbar toggle and standardized button sizing across the menu
Sorry, still no Linux build
The app has been thoroughly reworked, and I can't in good conscience push a Linux build out the door without giving it the same level of testing. The shared performance improvements should benefit the Linux build too, and I will be working on a build to come soon.