Documentation
Since I already covered the making-of of my previous work in the according documentations at the assignments of Deutsche Pop, I will only give a brief summary of the first semesters.
The detailed part on the work for the major project starts in February 2022.
The current state of the project is at the bottom of the page.
The first idea
November 2018 - February 2019
During my previous studies, I had the chance to experiment with a VR headset. I used Sketchup to "sculpt" a (very low-poly) palace and used the Unreal Engine to animate a camera for a cutscene and to explore the building in virtual reality.
Creating assets part 1 - environment
December 2020 to March 2021
Since I learned how to use Blender in Character and 3D Design I decided to go out on a mission: Using the upcoming semester assignments to revive the game idea I had before. I sculpted the ruins and the cave in Blender and added plants from MegaScans to fill the scene.
Creating assets part 2 - the dragon
December 2020 - March 2021
The dragon was also modelled in Blender. I used a tutorial to learn how to rig and animate him as well as give him amber-coloured glowing eyes that stare right into your soul.
Game mechanics part 1 - core mechanics and ritual
May - July 2021
During the technical artist course, I implemented the previous sculpted assets into a new Unreal Engine project and used the templates to create a first-person adventure. Using the node system I created different classes for objects and interactions. The voice lines for the player character were also recorded at this time.
For the VFX assessment, I scripted a ritual that is used to open the portal to the "other world".
Creating assets part 3 - desert camp and player
May - July 2021
Since the previously created cave asset was created to look good only from the front I added some structures to close the cave as well as sculpted the front of the cave and the ritual place with a fire bowl and engraved obelisks. To get a custom player character I used MetaHuman. For the campsite, I used premade assets of the public domain by MegaScans as well as some other placeholders for vehicles and tents.
Organising, Texting and Modelling
First week of major project - February 2022
I used the first week of the trimester to lay out a plan of my goals and how to achieve them.
I scripted the basic storyline that would be explorable in the vertical slice I planned to build and wrote all of the dialogues that would occur between the player and the other characters. (Images are censored because I don't want to spoiler my future playtesters).
Since the prototype had a lot of texture and performance issues I will need to retopologize all of my self created assets as well as create the ones that will replace the external ones. I started doing that on the first map and also made a new desert landscape from scratch which - in my opinion - has turned out to be a big glow-up compared to the old one.
I need to ensure that the game will work on other computers (which it currently doesn't due to performance issues), so I set up a date for the first playtesting and structured my work to fix this issue beforehand.
Additionally, I tracked down Eric Oehler, who created the font I want to use in my game back in 1996. I wrote to him about my project and my desire to purchase a commercial license. He was very nice and excited and gave me his blessing to use the font however I want.
Before
After
Dialog System, GUI and first Test round
Second week of major project - March 2022
I continued retopologising the old assets, a task which I will continue to do alongside in the next weeks and therefore not mention anymore. Additionally, the User Interface got a facelift and I added a Pause Menu and achievements.
To give the player a starting point to explore I sculpted two tents which I placed at the beginning of the level. Then I started scripting the dialogue system, one of the main new features of the major project. This took quite a lot of time since I wanted the player to have different opportunities to change the story and explore the world.
The new features needed to be tested so I initialised a discord server and invited my friends as playtesters. It was great to hear that they were able to play the game on their computers, however, they really tried everything out and found a lot of bugs and issues! I managed to resolve about half of them right away, but I still need to take care of the more complex ones in the following week(s).
more Dialogs and camp Assets
Third week of major project - March 2022
To make full use of the dialogue system I started to create, I wrote additional lines which resulted in accidentally creating two more NPCs, which the player will talk to via a radio unit. I updated the charts I made to keep everything in order and communicate with the voice actors. They are now holding on to over 100 paragraphs.
To fill the camp with life, I created a collection of camp furniture and chests to scatter among the tents.
I had had a lot of issues in the past, using videos in my game as they tend to mess with the texture streaming pool. So I wanted to test the limits as early as possible. Therefore I created a scene in Blender of an open book with pictures and animated the pages in after effects to create a previsualisation of the intro cinematic.
I started to build a quest system and added a quest log, which is designed like the book in the intro sequence. Sadly, updating the quests and displaying them in the quest log widget doesn't work as intended yet. Additionally, I experimented with the game instance blueprint to store a bunch of variables which will help me unlock and organise the different story elements later in the game.
Bugfixing, optimising and first recording
Fourth week of major project - March 2022
After releasing the last version to my playtesters they found a lot of bugs so instead of adding new features this week I concentrated on fixing and optimizing the old ones.
Additionally, I created a few more assets to scatter around in the camp and used the MegaScans Library for further decoration. Since these assets are free for commercial use and optimised to work with the Unreal Engine this was an easy way for me to add more life and atmosphere to the scene without spending many hours on details that aren't relevant to the story. A list of all the external assets I used in the game is stated here.
During the week I met with Franca and Fabian for the first time in the recording studio of Deutsche Pop and we recorded the first two dialogues.
In class, we discussed different ideas of player feedback and UI possibilities. This brought up the idea of adding collectable documents to the game and also featuring the book I created for the intro cinematic and quest overview more and incorporating it as the player's journal.
We also talked about risk and rewards and how to indicate if the player does something wrong. Since my game is story-driven and it is said that everything has consequences, letting the player die would logically also end the game. To prevent that, I decided to use a different system to punish the player. The health value will be multiplied by the player's speed. This means, that if the player will be careless and takes damage he will be slowed down which can be quite annoying. On the gif on the left, you can see four different states compared. The blue bar indicates the player's life / speed in percent and is only displayed for testing the mechanics.
Puzzles!
Fifth week of major project - March 2022
I really wanted to include a puzzle for the quest where the player has to decipher the obelisks in the desert. As I was brainstorming I got a lot of ideas for puzzle interactions, although none of them seem to fit the desert. So while I still don't know what to do for this riddle, was inspired and motivated and thus, created a few other puzzles to challenge the player in the cave. To provide more space for them, I added two more segments to the cave environment and created a small circular temple which sits on a lake.
There the player will have the task to rotate some lenses so that they reflect the sunlight correctly. The blueprint on the right shows how the puzzle checks for rotation. I created two elements to turn - the lens stand and the lens itself - and both need to be in the right rotation to be checked as successful. However, since it is possible to turn the whole lens 180 degrees there are two possible solutions of how to reflect the light. This is why there are two paths that will check the rotation and can lead to the puzzle-solved event.
If lighting the temple up correctly, a wooden panel on the floor will open up, revealing another lense which will then enlightens the ongoing path and two dragon statues at the end of the cave. One of them shall be battered and destroyed, the other one still in pretty good condition and - wait... has its shadow just moved...?
To give the player hints when the lenses are rotated correctly and add more realism to the environment I needed sound effects. I installed Audacity and although I have never used the software before, I got the hang of it after a while and was pleasantly surprised by how many different sound effects I can create from the same original file. I also took the occasion to edit the last week's recorded voice lines and implemented them.
Additional Tabea send me her first demos for the music tracks in the game which I really liked. We discussed some changes I suggested and I added the provisional music to the game which really adds to the exotic scene and atmosphere.
Freedom and Collectables
Sixth week of major project - March 2022
The dialogue system got updated so the new voice lines will play automatically but the player still has the opportunity to skip the dialogue if he wants to. Speaking of giving the player freedom: To avoid the player falling out of the destined path, I had set up blocking volumes everywhere. This however bothered me, since I wanted to embrace that open-world feeling where the player should be able to do whatever he wants. So I deleted them and added water in two cave sections where the player could fall without getting hurt and swim back to the beginning if he hasn't finished the challenge. This way the player has the illusion of getting anywhere without actually letting him skip the puzzles needed to move on.
I also included a function to give fall damage based on the height of the player if he would hit a surface that is not water. To do that I have set up physical materials, which I then continued to use to play different footstep sounds based on the surface the player is walking on. The player blueprint is really starting to get crowded now, so I might need to create more functions to organise it.
After a poll on the playtester's discord server, I redesigned the player's journal. While the old design was aesthetically pleasing, it was also hard to read and not functional for what I wanted to add next: collectables! I spend the first two days of the week doing some research on dragon trivia and created some files that the player would be able to collect throughout the game. The dragon facts have been shortened and slightly altered but are based on real myths and legends. That's why I included photographs and illustrations of the public domain to enhance the files. The used resources can be found here.
Characters part 1 - Failure and Success
Seventh week of major project - April 2022
This week I concentrated on the human characters in the story. I used the MetaHuman Creator (1) to model and compose the NPC characters. While it offers many possibilities to change the details of the person itself there are only three clothing options you can choose from. I wanted to alter the character to fit better into the desert environment.
Until now, the MetaHumans are Unreal Engine optimised and only available to use in the Engine. However, you can technically export the assets from the unreal engine and then modify it, so I tried that.
I wish that the MetaHumans would have a human base model and then added the clothing on top, but sadly they are set up differently. The MetaHumans are separated into different body parts, having a clothing top instead of a torso so to fit this scheme I needed to combine my shirt with parts of the naked base body model and import it back into the engine as a "sweater". Sadly, the armature broke when exporting and importing the file. Another problem occurred, as the torso I created was not only without animations but also disappears from the viewport when getting too close to the character.
I then tried another approach. Instead of exchanging a part of the original character I used the MetaHuman body parts to create a whole body in Blender. I set up the materials and changed the clothing mesh. I planned on animating the character in Mixamo (2) but faced another problem: the face of the MetaHuman contained fourteen materials, a detailed face rig and grooming assets to simulate hair. All of this would have been lost using this method so I tried to animate the character without the head, planning on stitching them back together in the Engine. The problem was, that Mixamo can't rig the character properly without a reference for the chin bone.
I was willing to lose a lot of detail if the character would then at least look the way I anticipated and so I tried Mixamo with a full-body model. However, the animations still seemed to be off and were very unsettling to look at. (And the materials didn't export correctly too, but that's a minor problem compared to the loss of detail and uncanny animations.)
I took a step back and decided to animate the MetaHuman as is and try to modify the clothing later. After a few trials and errors, I managed to convert the Mixamo animations with the help of a tool (3) and then retarget them to the MetaHuman body skeleton. I set up an animation blueprint for the character which determined what animations should be played. There are different pools where the animations are chosen from randomly. I used variables to set apart the states so different animations will play depending on if the character is standing there idle, talking with the player (more hand and head gestures) or standing idle after a quest including physical work (stretching, shoulder-rubbing).
One of my playtesters reported a very sincere bug to me; he was not able to insert an item in the last puzzle, making it impossible to complete. I came across the same issues a few times randomly and I thought that I managed to fix them before shipping. The crystals needed for the puzzle were controlled by variables. So I could confirm that the item was picked up, as I could call the variable at this moment, but I had no chance of accessing the item status during the further play. Since I had no idea why and how the bug appeared, I decided to build a working inventory system so I would be able to observe when and how the crystals would disappear / become invalid. However, instead of observing and understanding the issue the bug simply became obsolete since - well, I had a working inventory system now, which made using the items work in a different way.
Another feedback I got, was that the player was not able to move out of the ritual fire due to fire damage (as the health is linked to the movement speed). That is very inconvenient, so I made some adaptions to the damage system, added fall damage depending on the dropped height and made a quick animation to let the player pass out and wake up in his tent if he loses too much health.
(1) MetaHuman Creator. (2021). [Cloud-based creation tool for human characters]. Epic Games. https://www.unrealengine.com/en-US/metahuman-creator
(2) Mixamo. (2008). [Animation Online Service]. Adobe. https://www.mixamo.com
(3) Mixamo Converter. (2019). [Retargeting Animations Tool]. Terribilis Studio. https://terribilisstudio.fr/?section=MC
Preparing the Exhibition
Eight week of major project - April 2022
After the presentation on the weekend, I immediately started to do work on the assets needed for the exhibition.
At first, I was unhappy with my ideas for the poster, but after a feedback round in class, I got on the right track and made one I like. Since the dragon is not fully animated yet and not in the current game state, I used 3 different picture sets, two screenshots of the game and one rendered image out of Blender. I used Photoshop to combine them, added many adjustment layers and painted over some elements to create a seamless environment scene.
For the trailer, it was kind of like the other way round. I had a clear vision of how I wanted it to look, but the execution let me face a few problems and the result is not as polished as I wished it would be. After laying out the shotlist I started working on the sequences. I placed rails and cinematic cameras in my level and added custom events to trigger the movable objects in the game when the camera would be near them. I recorded gameplay footage and composed it in After Effects. Although I am happy with the idea of the trailer and most parts of it, I think that the dragon placeholder and the eye animation break the moment. I will try to focus on the dragon next to get a chance of implementing him in the game before the trailer deadline so I can re-do this part in the trailer and improve the overall look. I also am still thinking about if I should add a voiceover.
After creating the poster and the first version of the trailer I continued to work on the game. I originally had planned to render cinematics for the two endings. However, I thought it might be more fun for the player if he would still have some control, so I build another level (based on a copy of the desert level). Since I already had all the assets this was very easy and quick. The difficult part was learning how to set up movement for the NPC since I wanted him to welcome and escort the player. I managed to evolve its animation state machine and added movement, but sadly he still turns without any animation which looks bad. Also, as the character turns the hair system gets messed up and it looks like the NPC has a splinter stuck in its head.
Since I was already giving the player more freedom than in a cinematic I decided spontaneously to split the dialogue tree one more time to provide an additional ending.
Characters Part 2 - The Dragon
Ninth week of major project - April 2022
I finally brought up enough courage to tackle the dragon. I started with changing the base mesh and adding the horns, claws, etc so everything is one object. Then I remade some parts of the rig and sculpted shape keys for some poses to take care of some visual glitches.
I decided to start with animating the walk cycle and after that make my way to the more complicated animations like flying or adding emotions to the face. To construct a working walk animation I studied videos of cats to establish which legs are on the floor at what time. After many different tries I got the result you can see on the right.
To get an overview I made a diagram about the animations I would like to have for the dragon. Then I just worked my way along it to create each one after another. The diagram will also help me later to create the animation state machine since I just need to copy the layout and insert the animations.
As I tried to animate the different body states of the dragon I faced some problems with its anatomy. The dragon didn't look good sitting down as his shoulders sunk into the body and the wing membranes attached to the behind legs were all crumpled up. I tried solving these issues with shape keys as I have in the other animations before but it didn't work out and wasn't working together with the animation. So I decided to leave the sitting animation out for now.
I baked the normals out of Blender to give the low-poly dragon mesh some scales and texture. I used different UV Maps for the normals, wounds or scale displacement. I then recreated the thirteen different materials in the unreal engine and adapted them, so the dragon who was once grey now fits better into the sandstone caves. I added some moss to the body and mixed two materials so the claws appear chipped. I gave the wings some subsurface function so the sun can shine through and animated the eyes so a fire is burning within them and they emit light.
After browsing through a dozen different tutorials and Reddit posts and a lot of trial and error I finally was able to tick all the right parameters in the import and export settings to get the animations and the shape keys from Blender into the Unreal Engine: the dragon was alive!
Second recording session and new UI
Tenth week of major project - April 2022
Franca and I started the week in the recording studio of Deutsche Pop and we created more voice lines for the player character and the dialogue with the antagonist.
Additionally, I brought some props to create sound effects like glass clinging for the light crystals, paper scribbles for the player's journal or scraping on stone, which I plan on using for the dragon's movement.
It took a lot of time editing all of the sound files. Because I have recorded and edited sounds of different days, different persons and different sources they all had different audio levels which I had to manually match to each other in the game. As I had made functions in the past that mute the music during dialogues using different mixes, the audio settings in the menu didn't work very well for the player and messed up the sound class mixes in the game.
Speaking of the menu: after Tabea send me the final version of the title track I decided that the menu has become outdated a long time ago. I used a video background and big buttons that are each different images. Redesigning the menus would bring a lot of advantages: first, by using the player's journal background I animated in unreal I could save performance since I could scrap the video texture. Second, by modernising the design and properly implementing text instead of images of text, the menu would look a lot better while letting me make adjustments easier in the future. And third, the design would be consistent in the game.
I used the recorded voiceover to complete my trailer and submitted my contributions to the bachelor exhibition.
Dragon and Lore
Eleventh week of major project - May 2022
I implemented the recorded lines and sound effects. They added up to contribute to the whole atmosphere: Scribble sounds indicate that a quest is updated or flipping through the player's journal plays a paper sound.
Since we had recorded a lot of pain and damage sounds last week I updated the damage system to adapt to the damage amount and health status of the player. The player screams when dying in the ritual fire, groans when hurting its foot and yelps when dropping from a high place.
Since I was very unhappy with my previous dragon dialogue I started again, this time resulting in a hopefully funny and exciting story for the player to unravel. The third and last recording session will take place next week, so I made sure to prepare as much of the dialogue system beforehand so I can implement it all before the exhibition.
To match the new menu design and the player's journal I updated the design of the ending screen, added a few more achievements and drew illustrations for the three different endings.
I learned how to set up and control post-process materials to add some special effects to one of my endings. This was surprisingly quick and easy.
What was surprisingly hard on the other hand was letting the dragon face the player character. I found a tutorial using an inbuilt function of the unreal engine for this. This worked great for the human character who now looks always in the player's direction (without turning its head like an owl). However, the same technique didn't work on the dragon. I think this is because the dragon skeleton has the wrong hierarchies in the unreal engine. The skeleton consists of non-hierarchical deform bones, parented target and mechanical bones and a bone control rig. While this is great for animation in Blender, the skeleton behaved completely different in the engine. I had not cared about this issue before, since I spent multiple days trying to get the animated dragon into the engine, including the correct animations, shape keys, etc. I was just happy that they worked, but now I had to face this problem. I figured there would be three possible ways to solve this issue:
1. After doing backups, I could parent the deform bones in Blender and export a new dragon skeleton containing only these. If this works, this would be the best looking option and opens a lot of possibilities for the future. If it doesn't work, I could lose all my previous imported animations, forcing me to load the backup and continue with solution 2 or 3. This approach would take the most time.
2. Instead of letting the head turn towards the player I could turn the whole dragon. This quick solution, however, may look not very good.
3. I could set up barriers or place the dragon at another position so the player will approach him from the front instead of sideways.
I decided to go with solution number one. The good thing was that the animations didn't break. I still needed to re-do the shape keys and edit some parts of it but I needed to do that anyway since I have created some additional animations for the dragon. Sadly, the "Look At" - function I used on the human NPC still didn't work. Unreal took the side of the dragon's head for the forward vector so while he was following the player, the head was always turned 90 degrees too much or flipped over if the base mesh was rotated in a different way. I tried reimporting the dragon with other axis settings or removing the 90 degrees with calculations. But everything I tried made things worse.
Then I stumbled across a tutorial from 2014 (4). The person in the video used other functions and calculations to get the same effect I was looking for. This approach didn't work either, but I learned a few things about how to calculate rotation and distances to players which finally, after three days and four times starting over, has led to me coming up with a custom solution. It is a more complicated setup compared to the effect used on the human NPC, but at least it works, adding more realism to the dragon's behavior and letting the player immerse in the dialogue.
I also animated the intro cinematic for the game.
(4) RATSGAME. (2014, December 28). UE4 Character Look At Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=lO31ivCC1KU
Dragon Update and Bugfixing
Twelfth week of major project - May 2022
As mentioned in week 5 I wanted to let the player "decipher" the obelisks by providing some kind of puzzle or riddle. While this has led to creating puzzles for a lot of other situations, the obelisk riddle was still pending. I finally decided to go with a jigsaw puzzle of the cuneiform. Using the same textures that are used in-game in the obelisk material I created a stone tablet and broke it into puzzle pieces.
On Tuesday was the third and last recording session where the dragon dialogue was recorded. I wished that I would have been able to let the dragon voice lines be played in the threedimensional environment instead of spawning them as 2D sounds. This would have granted me the possibility to add reverb settings and a cave attenuation to them to make them stand out and improve the impression. Sadly, no matter what I tried, I was not able not make it work.
But at least I could add sound effects to him. I used skeleton notifies in the animations that would trigger a sound effect. This way the footstep sound would play in the right moment whenever the walk animation will put a paw on the ground, whatever the movement speed would be.
After the dragon got the ability to speak I wanted to give him the ability to move around in his cave. Just as with the Look-At-Function described in the previous week I was not able to use the NPC walk function of the human NPC for the dragon.
But I was able to adapt it and add different parameters and settings. I created a Target Point Actor that I could place in the level and use to set the different movement modes of the dragon. This way I could give him the order to fly to an array of targets and he would change animations and movement modes automatically between walking and flying depending on the target point parameters.
While the dragon flew in and out of the cave as I wanted, he still seem to get stuck at some points. At first, I thought this was due to bad pathfinding and collision so I set up different Agent settings for the NavMesh as you can see in the picture: blue marks the area where the dragon would be able to navigate and green marks the pathfinding options for a human NPC. However, the dragon still got stuck even in areas where he technically should be able to walk. After surveying the movement function updating while the dragon moved I figured out that the dragon would not consider his move finished although already reaching the target. This has led to him walking in place for a few seconds until focussing on the next target point. By adding a function that updates the dragon location and overriding the "success"-node of the MoveTo function I was able to solve this problem. While still turning abruptly and not smooth, I am quite satisfied with how the overall movement possibilities turned out.
Every time I got stuck on one of the above-mentioned problems, I took some time off and continued with an easier task, adding more detail to the world. I implemented more sounds in the environment, tweaked some details in the GUI, added interactions to the camping lanterns and created an animated radio material that changed the display.
Since I had not been able to get face animations into my project I thought about other ways to display the NPCs that you can talk to via the radio. I used the MetaHuman I designed for Dr. Kanwar to make a few still images of facial expressions and also created a display for the office you can call. Based on who you call the display will change accordingly, displaying the antagonist with three different moods.
The more details I added to the levels the more idea I got of what else I could add. It was time to slow myself down as I had to wrap the game up and focus on the important thing: performance and bugfixing.
Optimisation, Profiling, Finalising
Last week of major project - May 2022
Let us start the last week of the major project with some good news and some bad news. The good news: I had a pretty decent looking game that was running on Windows and included even more features than I had imagined being able to provide at the beginning of this journey. The bad news, while the game runs well on most computers of my colleagues, some testers only got very little FPS, making the game unplayable.
Precautions I took to improve performance:
- making LODs for my assets (MegaScans already had them)
- made sure that all textures are power of two and not too big (most are 1k or 2k, the only exception is the metahuman and the dragon but I think that is reasonable)
- set up culling distance volumes to blend out the elements that are not in view sight of the player
- replacing all event tick functions with custom timers to ensure they check things only when necessary and at a slower rate
I uploaded 6 different versions of the last build, each with different settings that should lower the graphic and improve the framerate. Sadly, although they differed in lag situations none of these versions was playable. I had used console commands at the beginning of the game to e.g. lower resolution and shadow quality and force the MetaHuman NPC on a LOD with fewer vertices. While the performance has not become better, now everything looked worse and the grooming assets of the NPC went crazy.
One of the testers told me that the game was using the full capacity of his RAM. He has 8GB, just like the other person who faced performance issues. All the other testers that have been able to play the game had 16GB or more. I thought that this might be the bottleneck, however, running the same version on my computer cranked up the GPU instead, while memory use was pretty low. I wondered if this might be due to a lack of graphic setting specifications in the project, leading to every machine the game runs on trying to get the best result and thereby overloading itself.
I needed to find out who the culprit was, which needed so much computing power in my levels. I couldn't quite get behind the analysing and debugging tools of the unreal engine as they seemed very overwhelming for me. A former tutor gave me the contact to Matthias, who took his time explaining the profiling tools to me and told me what to look out for. Together we found out, that it is most likely the GPU that takes too long. I downloaded a plugin (5) for the Engine that looked more user-friendly than the included GPU profiler. There I was able to survey what the Engine needed to do to render a single frame. I noticed that the elements in the game were rendered by material in nearby groups. By merging actors together I was able to decrease the draw calls, as e.g. the engine now needed one draw call to render the stones in the desert instead of 60.
I have to admit, this was just a drop in the ocean and did not improve much. I was probably wasting my time focusing on this so I tried other things. I tested different scalability settings via the console inside a simulated game. For most parts, the highest setting didn't seem to make any visual difference from the one before. So why include epic settings if the textures I scaled down for performance weren't even able to achieve these? I made a more detailed graphic setting menu where the player would be able to control the quality of the different elements.
The optimisation view modes in the Engine showed that all of the translucent materials were very complex, as well as the desert landscape material. I disabled translucency, the animated sand waves and glitter to let the testers try if this improves performance. Because god rays, magic glowing crystals and water are sure a performance killer! Sadly, replacing them with opaque material for a test build did not improve performance either. I slowly but surely run out of ideas about what I could do to increase the framerate of my game. Maybe it was not a single thing that was hidden somewhere that took up all the draw calls but the entirety of everything together.
It's the plants. And probably a couple of other things as well, but disabling the foliage actor has increased performance by 5 ms. After deleting all the plants on the bottom of the lakes I set the water to opaque instead of translucent and experimented with a few things in the water shader until the shader complexity was green while the water still looked good. This way I was able to save another 2 to 4 ms. I tried the same for the light crystals and god rays but there was no way to optimise them without looking ugly. At least the light crystals I was able to improve a bit, although the difference in the shader complexity is hard to notice (but it's there!)
Since the shader complexity view mode painted the whole desert red, I needed to change the landscape material. I got rid of the animated wind simulation I included in the material, as well as replaced the glittering grains of sand with a simple metallic and roughness parameter. I am not digging the new look of the desert, however, if this saves my performance problems it is definitely worth it.
So I shipped another update. On my computer, the standalone version of the game currently runs with 60 to 70 fps in the desert levels and 40 to 50 fps in the cave level.
When setting the graphic to low, even Franca was able to play the desert level with 25 fps on her 7-year-old laptop. The cave level was still unplayable for her. While this is far from great, it is at least a success compared to previous versions!
One last idea was still in my mind and I set the light component of the light crystals to stationary instead of movable to enable at least partially baked lighting. Since The crystals should make a sound and light up as the player is near them there was no way to prebuild this lighting situation. However, not all of them are near walkable areas and while I had made a function that some of them should light themselves without the player they did exactly that. By which I mean, they dynamically lighted themselves up together at the beginning of the level as it started loading! By moving this function to the construction event I was able to let them be active right from construction. Which henceforth meant that I would be able to bake at least some of them into the lightmaps and therefore might be able to save a few milliseconds performance more.
Since the cave level was performing the worst out of the three levels I created I asked friends and family to test the different graphic settings at the same spot so I could make a statistic. While not perfectly accurate, since each setup has different weaknesses, I hoped to get a feeling of how many players I would potentially lose due to bad performance. You can see the results of my survey on the right. While performance in the cave is still not good, I am happy that the majority of my testers reported that the newest performance update was working for them so I did manage to make some progress.
I ended the week by making a playthrough video that includes all story endings, achievements, and collectibles.
(5) RenderDoc. (2014). [Graphic debugger plugin for the Unreal Engine]. Baldur Karlsson. https://renderdoc.org/
Epilogue
ATOTW is my passion project and I will keep working on it.
See you soon with new updates...