As the our project's deadline approached, the team spent the last few days of development on a set of three main goals:
Have the game fully playable, start to finish
Playtest and fix as many bugs as possible
Optimize and package for Oculus Quest 2
Optimization
For this step, we looked for and took note of areas where performance was particularly poor, usually dropping below ~50 fps. For these areas we tried to figure out which elements were causing the issues, and either optimize or remove them entirely if possible.
The team had already tried to keep optimization for the target platform in mind throughout most of development, making heavy use of level streaming for each area in the game. We also tried to use minimal dynamic lights.
Despite taking measures like this, getting a desirable performance on the Oculus was tougher than I think we anticipated.
Unreal's "Shader Complexity view" in the editor was very useful for identifying elements that were having a big impact on performance. Some of the worst offenders tended to be translucent particle effects, such as the fire in the village level. When playing through this area, the framerate dipped far below 15 fps at times, which in VR was basically unplayable.
As it turned out, there were far more particle emitters being used than were necessary. I removed basically all of the emitters that were only creating 'dust' effects, and combined multiple fire emitters into singular, larger ones. I also ended up editing the fire particle effect itself, removing the smoke and light elements.
This change alone tripled the framerate in the village, now averaging around 45 - 50 fps. While it's still below our target of 60 fps, it's comparably far more acceptable.
Across the rest of the game, we discovered that most of the textures being used for the game's models, especially those imported from substance painter, were far too large. On average many of the models had textures averaging 2048x2048 pixels.
Luckily, Unreal has a feature to limit a texture's resolution in-game, so we spent some time going through the most frequently used textures and reducing them to a maximum scale of about 512x512. For elements that were constantly on-screen such as the player's hands, this had a performance increase across the entire game.
Another area that had consistently low performance was the temple, especially the boss arena. We had used a lot of imported materials from an asset pack: Initially we tried reducing the size of the textures used throughout the level, but the impact was minimal. In the end, some of the materials themselves turned out to be the issue, using performance-heavy functions and combining a large number of textures. The floor material in particular was quite bad for this, so we looked for cheaper materials to use instead.
The material we settled on for the boss arena ended up almost doubling the framerate (from ~35 to ~60 fps), and we felt it looked more appropriate as well.
Packaging Issues
When it came to finally packaging the game for the Oculus, we started to encounter some big problems. Not only did it take far longer than expected to set up and install the necessary software to begin packaging the game, we couldn't get the packaged version to run on the Quest 2.
Within a few seconds of loading in, the game would instantly crash. We tried packaging to the Quest 1 as well, and strangely enough were able to load in to the main menu. However, as soon as the player tried to load into the tutorial, the game again would crash.
With not much time left, there wasn't much we could do to find a solution, or even understand what the issue really was. We tried various different build settings with Unreal, but nothing made any difference.
In the end, we didn't have enough time left to solve the problem. We submitted the non-packaged version of the game instead.
For future projects, I think we definitely need to make packaging the game something we perform regularly throughout the development process, as early as possible. This way we can hopefully find these kinds of issues in advance, and have the required time to troubleshoot and fix them.
Lost Fixes & Changes
Unfortunately, due to some of the issues with the packaging process, and some lack of communication as a result of fatigue, there were a number of small changes or bugfixes I made that weren't included in the submitted version of the project. The changes were uploaded to the github, but not pulled by the rest of the team.
Some of these changes included:
Fixing an issue with the Destructible Crates where an item wasn't spawned correctly
Addition of a note in the ice-cave, establishing some background information on the area
Some fixes to the Golem boss, mainly removing an issue with the player collision pushing the boss
Fixing an issue where the Goblin's spit-ball wouldn't collide with the player character
Fixing an issue where the particle effect for the jump pads in the Golem fight would be visible before being active
I'm a little bit annoyed that these changes didn't make it in, mainly due to being worried how it might affect the marks of the whole team. I definitely could've better communicated that these changes needed to be on the uploaded build to the rest of the team, but I think we were all extremely fatigued anyway due to the amount of stress and work we had been doing. My main takeaway has been to make much more time in future for these final parts of development.
Overall Reflection on Working as a Team
Despite the time pressure and crunch we ended up experiencing towards the very end of development, I can't stress how positive it was to work alongside the rest of this team. The sheer amount of work put in by everyone has been astounding, and even if I have my issues with how the finished project came together, I can't fault anyone for lack of effort. If anything, I think we made too much work for ourselves, as the whole team was super passionate about the game and wanted to get as many of our ideas realized as possible.
In retrospect, even from the start of the project I think our scope was too big, especially when we were targeting a platform none of us had any experience developing for.
For myself, I think I initially took some time to adjust to working within the group, and I feel I definitely could've communicated things better at those early stages of development. As the project progressed though, I started to feel a lot more comfortable talking and discussing ideas more frequently with other team members, and by the end I feel like I've improved a lot in this regard.
I'd love to have more opportunities to work with everyone on the team again, especially after everything I think we've learned from the experience.
Comments