© Melvin Rother 2020
Ornament Express
Genre
VR Puzzle Game
Team Size
18 People
Roles
QA Lead, Graphics Programmer, Build Engineer
Platform
Windows (OpenXR)
Unreal Engine 5
Duration
1 Year
“Investigate strange oddities in Ornament Express, where you’re hired to recover your client’s belongings from an eccentric thief and his train of stolen artifacts. Explore a cabinet of curiosities throughout the train, visit carts holding odd puzzles, odder objects, and find hidden away secrets.” Ornament Express is a VR escape room game developed during Y3. You were hired to recover your client’s belongings from an eccentric thief and his train filled with stolen artefacts. Explore a cabinet of curiosities throughout the train, visit carts holding odd puzzles and even stranger objects and uncover the hidden secrets of the Ornament Express!
What did I work on?
- QA: Bi-weekly smoke tests
- Performance Profiling & Optimisation (90FPS / 11,1 ms target)
- DevOps: Automated Testing & Delivery Pipelines to Steam using Jenkins
- DevOps: Steamworks Depot & Branch Management
- DevOps: Error Monitoring using Sentry
- Gameplay: Fire System for flammable objects
- Gameplay: Several in-game items like the bouncy ball, apple and more
- Simple Anti-Cheat Measures (Fade-to-black when the players head enters walls etc.)
- Cel-Shading for forward-rendered VR
Gameplay: The Fire System
The fire system is an event-based gameplay system I developed during pre-production that allows fire to spread from object to object. It enables developers to specify the burn duration, customize particle effects upon ignition, and even implement custom logic by binding it to various events (delegates). Any actor within the game can easily become flammable, as this system is entirely contained within a custom component.
I focused heavily on ease of use for our designers, ensuring that they would never need to modify or even examine the logic within the component. I also documented how to use the plugin in our Confluence knowledge base.
You can see an example from our trailer on the right, where the lit pipe ignites the detective’s hat, much to our players’ chagrin.
Gameplay: Interactables
During development, I not only worked on systems and puzzles integral to progressing within the game, but I also created several small interactables designed purely to enhance the interactivity of VR. I developed items like the Bouncy Ball and the Apple, which are purely for the game’s ‘juice’—intended to make the player laugh, fill the small world of our train cart with interesting things to explore, and sometimes give the player a ‘You can do that?’ moment.
Some of these interactables are also part of the game’s achievements—but you didn’t hear that from me.
Frame Times, Q4 of Development
No Data Found
Performance Optimisation
In VR games, performance is crucial. Low or unstable frame rates significantly increase the risk of motion sickness in players. Therefore, it is usually recommended to maintain frame rates close to either 90 FPS (11ms per frame) or 72 FPS (13.88ms per frame). This also means that lag spikes and frame rate drops must be minimized. I was responsible for overseeing performance testing and ensuring that our game met these expectations. Using Unreal Insights, I regularly profiled the game and implemented numerous targeted optimizations to achieve this goal, with the most impactful occurring during the last quarter of the project.
At that point, we were finally able to test our game on target hardware, and as shown in the graph to the left, our frame times were nearing 30ms on average. Using Unreal Insights, I quickly realized that we were GPU-bound. I optimized the Cel-Shading material we were using to drastically reduce the number of shader instructions, reducing shader complexity and thereby improving performance. This optimization saved us an average of 16.97ms per frame.
Below, you can see the shading complexity of the Nature Cart, our main level, and the corresponding frame times before and after this specific fix. Note that the semi-transparent red hands rendered in the scene are editor-only assets used solely in development and are not present in the actual game, which is why they were explicitly not optimized.