Early Access Update V0.8.7.2
[h3]This update mostly includes optimizations made to performance, but also contains further other small fixes.[/h3]
NB: This is one of many optimization updates planned over the next year and in NO way reflects the final performance state of the game.
It's time for round 2 of the new regular update schedule!
This update might be boring for some, but I have decided to focus on optimization for this patch as some users have reported suboptimal FPS when playing on lower end devices such as Steam Deck as well as older i5 laptops using Intel GPU chipsets and lower RAM.
Of course, this is not a perfect optimization, and I still have a long way to go to truly reach the FPS goals I require to support the widest range of devices, but it's certainly a step in the right direction and I look forward to collecting more data on performance as a result to see how I can further increase framerate. A lot of the notes below may not make sense to people not working with Unity, but I've included them anyways as I generally always write my change notes as I go to keep me sane whether they are worth sharing or not. So here they are! I hope that this update helps improve performance even just a little bit for those affected. To benchmark I managed to get myself an old dying laptop from 2016 with a half dying screen and overly full hard drive to test with and managed to move from completely unplayable to at least enjoyable. No Steam Deck to test with currently, but hopefully this should help still. Let me know how it goes!
Please Note: Each of the following optimizations are merely "micro-optimizations" and generally only gain small amounts of frames or cycle milliseconds. There is no one-cure-fix-all way to optimize a game such as this, but by continuing to add as many individual improvements as possible to the CPU and rendering thread no matter how small, the performance will increase. This is certainly not the last optimization update, but just some necessary changes that needed to be done this week.
It is only worth noting, that a lot of the optimizations have been made to graphics settings below Ultra, so players already playing on the maximum setting won't be affected by those. Thus, I have split the notes into optimizations applied to the game overall and into a list of those which apply to certain graphic settings below Ultra.
In some cases, changes were less about optimizing the lower settings but also making sure that lower settings looked better while retaining the performance boost (such as lowering the shadow settings)
Lastly, I have also included a list of other non-optimization related fixes included in this update for a small value add.
I'll be back next week with a new content update that focuses on a vehicle garage for customizing your trucks performance and appearance. Thank you all for your patience!
[h3]General game optimizations:[/h3]
1. Switched scripting backend from Mono to IL2CPP.
2. Changed all non-terrain/tree meshes used in extremely high volumes such as brown rocks and wooden items/pickups to use GPU instancing instead of static batching.
3. Added GPU instancing to skinned mesh renderers such as enemies as well as animals that appear multiple times on screen at once.
4. Improved texture compression ratio without affecting texture appearance by compressing all uncompressed textures to lighten the load on the GPU VRAM as well as build size and memory usage.
5. Added aggressive dynamic culling for engine parts inside the truck/vehicle that can't be seen unless viewing the truck from the bottom or if the hood is open due to explosion or upcoming repair mechanics. The internal parts of the truck are now only rendered when they can be seen to save a fairly high amount of GPU draw calls, and many smaller parts that do not need to be separate have been batched into a single mesh.
6. Added simple culling to smaller parts of the vehicle such as wipers and internal blinkers etc that can be seen but only when close to the vehicle, saving on draw calls when not near the vehicle.
7. Optimized radio station sample rate decreasing the audio file size by 400% without affecting the audio quality.
8. Removed unused items from scene memory in all scenes.
9. Removed double buffering skinned motion vectors on unimportant skinned mesh renderers.
10. Set certain unimportant skinned mesh renderers to not update skinning when off-screen.
11. Ensured all skinned mesh renderers adhere to the global bone skinning quality settings.
12. Increased the threshold of certain items adherence to camera per-layer culling distances.
13. Removed unnecessary ContentSizeFitter components on U.I. text labels.
14. Leader hideout and additional nature zone in that region no longer exists within the scene memory and is now part of the game's asynchronous loader level streaming for a smaller memory footprint during general gameplay within the main reserve.
15. Removed all unused packages from project manifest.
16. Re-mapped all mesh occluder/occludee status settings with more discernment and rebaked all occlusion culling for each level.
17. Optimized rendering footprint of campfire, lantern and other "non-important" light sources by changing their render mode. The main skydome day/night cycle now uses the important rendering mode as the main pixel light while all secondary lights do not unless they are significant such as flashlights etc.
18. Set physics system broad phase type to use box pruning algorithm.
19. Set physics system to reuse collision callbacks so the garbage collector should reuse only a single instance of a Collision type for all collision callbacks.
20. Increased level of animation culling for items such as animated flags in ostrich racing when not visible.
21. Optimized size of specular/metallic/occlusion maps used in some complicated textures.
22. Identified all meshes with read/write enabled this storing twice as much memory and disabled the parameter.
23. Disabled all unnecessary model import parameters such as blend shapes, lightmap UVS and any other parameters not being used.
24. Deleted some rocks that were below the terrain and thus permanently invisible.
25. Optimized braai model's internal grill geometry with manual batching of separate meshes.
26. Optimized player trigger system algorithm slightly.
27. Increased GPU Async upload buffer size from 4 to 16.
28. Moved rigid body based calculations out of Update() methods into FixedUpdate() methods.
29. Changed all use of OverlapSphere to use the Non Allocative OverlapSphereNonAlloc version of the API.
30. Optimized certain shaders to use property hashing instead of string parameters for parameter manipulation.
31. Optimized screen space shader based antialiasing algorithm code.
32. Optimized internal algorithm for rendering ADS scope overlay for carbine weapon.
33. Enabled sprite packing atlases for UI sprites.
34. Optimized the usage of OnCollisionStay() on player rigidbody walker, player is now also better at walking up slopes as a result.
35. Pre-cached all animal NavMesh wander positions to prevent CPU spikes caused by NavMesh position sampling.
36. Optimized memory used in the on-screen damage indicators assigning frequently to the garbage collector, optimized to use non-allocative algorithms.
37. Optimized triangle count as well as LOD distances for R4 weapon pickup, as well as when held by poachers as the poly count was quite high and the weapon did not have LOD's even though all other weapon pickups did.
38. Stripped project of unused shaders.
39. Disabled terrain unified heightmap collisions.
40. Removed unused canvas elements from lootchest/tutorial overlays.
41. Created new LOD's for certain high poly meshes that did not already have a level of detail system.
42. Removed shadows from certain models already enshrouded by other shadows that did not to be casting shadows themselves.
43. Removed all graphic ray casting from U.I. elements that do not require clicking such as health/ammo/crosshair and HUD elements.
44. Manually batched some grouped meshes that were too small individually for GPU skinning, and too numerous for effective static batching into single meshes.
45. Bloom is now off by default for new installations but can be enabled at any time.
46. Replaced some uncommonly used material shaders with other common shared shaders.
47. Optimized file size and memory footprint of nature sfx ambience from 6.4mb to 1.0mb.
48. Optimized background tension music loop from 1.0mb to 76kb.
49. Optimized bulk of action/drums music tracks from 53mb to 20mb for all 5 tracks total.
50. Optimized remaining musical soundtrack pieces from 30mb to 4.6mb for the remaining bulk of ingame soundtrack music in total.
51. Optimized compression algorithm for animal sounds.
52. Adjusted bone quality for smaller animals such as birds & insects.
53. Reduced the amount of MeshColliders overall in place of primitive colliders that function the same relevant to each individual objects needs. Bullet decals are still projected directly onto the mesh, so it doesn't matter how accurate the collider is in order to align the decals onto the mesh.
54. Added more aggressive culling distance threshold to some much smaller objects.
55. Recalculated some LOD Bounds on certain meshes.
56. Optimized "Aim Assist" for GamePads to not use memory allocative algorithms such as OverlapSphere and use static fixed-length collider arrays.
57. Optimized "Sun Shafts" screen effect rendering algorithm.
58. Made some small optimizations to the relief terrain shader system codebase.
59. Minor optimizations to pickup trigger volume.
60. Removed possibility of duplicate yellow glow "Loot" overlays on items would lead to increased vertex count on meshes. (And also, sometimes result in a glowing ghost left behind after an item has been picked up in rare cases)
61. For weapon pickups with complicated LOD systems, the "Loot" overlay will now use the lowest LOD to prevent doubling the vertex count for detailed meshes.
62. Optimized the loot over system triggering algorithm to not retrigger the instantiation of meshes every frame during movement.
63. Removed root motion and root bone for any skinned mesh renderers using a generic rig that did not need it.
64. Optimized instantiation of 'yield return new WaitForSeconds();' instances in coroutines.
65. Converted all radio mission briefings to mono to save memory, especially since they were not recorded in stereo to begin with.
66. Converted numerous SFX clips to mono for the same reason as above.
67. Also converted all poacher vocals to mono since they were also not recorded in stereo and doing so reduces the memory footprint by roughly 4x.
68. Various other small code refactorings.
69. Removed deprecated key binding data structures, references and storage methods leftover from previous input system.
70. Finally, as a result of all the optimizations performed, I am happy to report that the game build size has gone down from 7.7GB to 5.9GB which of course lessens memory consumption as well as general storage space and download speed.
[h3]Lower graphic setting option optimizations:[/h3]
1. Shadow quality now also adjusts screen space ambient occlusion quality.
2. Texture quality settings other than Ultra now disables near-imperceptible lens distortion post processing effect.
3. Texture quality settings below High disable post processing vignette for an extra frame per second.
4. Environment detail settings now set the max pixel light count respectively. 1 for low, 2 for medium, 3 for high, 4 for very high & ultra.
5. Lower environment detail settings now optimize terrain rendering better via a higher pixel error value.
6. Birds flying in the sky, dragonflies and other smaller details are now disabled on low environment detail settings.
7. Vegetation wind is now disabled on low environment detail settings.
8. Low quality shadow settings now affect the shadow projection close/stable fit setting internally.
9. LOD bias is now lower when using low environment detail settings.
10. Shadow from weapons cast onto arm now only happens during Ultra shadow settings, mostly as it looks quite bad when shadow quality is low, as well as for performance reasons.
11. Removed an almost imperceptible light flicker script found on campfires as the fire light sources still look great without and it removes unnecessary scripting oscillation on the intensity.
12. Shadow quality now sets shadow projection to a close fit instead of stable fit when on the lowest setting.
13. Environment detail setting now affects the detail level of the vehicle internals, but not the exterior.
14. Lowered physics engine solver iteration count when using the lowest bone skinning weights setting, will increase performance but might possibly create some weird ragdolls at times.
15. Changed bone quality from low/medium/high to low/medium/high/ultra with the last 3 being the same as the original 3 with low now being the new lowest, use only in extreme cases if physics calculations is too demanding for your system. As per the previous point, low might cause weird ragdoll behavior in fallen enemies, but otherwise can help performance.
16. Player radio (Weapon #1) will use a lower poly model when playing below Ultra texture quality, as the model is quite severely detailed so assumed to only be best used on high end systems, and since there isn't specifically a weapon geometry graphic setting its been tied to texture settings for now.
[h3]Main menu optimizations:[/h3]
1. Optimized terrain pixel error threshold used for settings preview.
2. Cleaned up unused objects from main menu memory.
3. Removed all objects not visible between character selection screen and settings menu.
4. Baked occlusion culling for menu scene.
5. Slightly Optimized triangle count on player models and removed unnecessary items for the campfire such as holsters, backpacks etc.
6. Disabled the Relief terrain shader light application for self-shadowed direction.
7. Disabled imperceptible light flickering script that was using almost unnecessary CPU cycles.
8. Better animation culling for animated elements featured off-screen for the settings menu when not visible.
9. Decreased camera render distance, usually needed for horizon rendering in-game but not needed for the menu.
10. Removed ragdoll physics internal systems from the example enemy shown next to ostrich in the graphics options menu so as not to use unnecessary physics resources even for kinematic rigid bodies not in use.
11. Added additional GPU instancing where possible/applicable.
12. Integrated better separation of character selection screen vs graphics preview menu detail meshed.
13. Disabled unnecessary collision geometry.
14. Cameras no longer render/clear a solid color behind the skydome since you never see it.
15. Selected a faster antialiasing algorithm for the character selection screen.
16. Removed third party scion post processing shader set entirely from main menu.
17. Removed unnecessary entity interaction scripts from small animals and birds as well as other small destructible objects seen within the menu.
18. Removed any additional unnecessary shaders left over from previous "Film" menu found in V0.8.7.2 and below.
19. Removed many unused components found in the tertiary cameras used for submenus such as scores & mods.
20. Removed duplicate nature sounds audio sources found inside the menu setup.
21. Optimized scene hierarchy to avoid over nesting of prefabs and empty transforms within the settings menu example scene.
22. Removed duplicate Event Systems from the scene.
[h3]Other game & bug fixes:[/h3]
1. Made further small improvements to enemy behavior.
2. Fixed an issue that would cause the player to shoot up in the air when pressing against the giraffe collider.
3. Fixed chromatic aberration & reflections turning on when resetting defaults, even though the new default factory settings the game came with had dictated the chromatic aberration & reflections to be off as default.
4. All graphics settings now go backwards from Ultra->High->Medium->Low and then wrap round back to Ultra, as opposed to the starting on Ultra and wrapping round immediately to lowest then increasing back to Ultra when switching as it was before, which allows you to slowly tweak lower until you are happy. Later on I will add arrows to choose which direction you wish to go.
5. Fixed a rock that was rotating on its axis on different LOD's found near the camp.
6. Added further input agnostic tooltips (I.E., press "Fire" or press "Aim" instead of displaying the keycode or controller button) for better support of different controller schemes without needing to display device specific glyphs.
7. Fixed some NavMesh issues that could cause the leader to run through cactuses in the hideout hostage mission fight.
8. Clarified description of Character #4 special abilities, that the damage boost applied only to silenced SMGs as well as silenced rifles, not silenced SMGs and rifles IE only to silenced weapons.
9. Fixed Y position in menu of secret hidden time of day slider that was overlapping other elements when activated via the cheat code.
10. Improved appearance of satellite dish rendering material found above caravan in camp.
11. Fixed missing collision in Mission 6/Warehouse.
12. Increased warehouse lighting moodiness.
13. Adjusted nature ambience for less ear-piercing crickets and audio fatigue after long hours of play.
14. Fixed a weird running issue for Legendary Volstruis caused by an unaccounted collider on the cigar causing it to collide with itself while running.
15. Further decreased overly loud end-level-stats sound.
16. Fixed issue causing option labels to not always reset when resetting graphics option.
17. Decreased chance of terrain flickering caused by camera near clip plane issues.
18. Improved animal pathfinding system to prevent them from freezing up sometimes when trying to calculate their next path.
19. Fixed issue with mouse rotation inside vehicle not adhering to the mouse sensitivity settings if mouse sensitivity is changed in game.
20. Added a new "HUD Scale" option in the menu to increase or decrease the size of HUD elements such as Ammo/Armor/Health & more so that users on smaller screens such as Steam Deck can adjust the HUD to be better visible, or just to individual player preference on any screen.
21. Various other small tweaks & fixes.
The next few updates are going back to focusing on new content, but I'll be releasing another update focused update again after this, as well as adding a few optimizations to each update following this one in the update cycle road to V0.8.8
As always, I'm excited to hear your thoughts, and happy hunting!