We’ve done a big write up to explain the changes we’ve made and our logic for it also, to give you an idea of the background work that’s going in to improving the experience for all players as we add more content to the game in the future.
This week also brings the long awaited wind power system, with new wind turbines giving you a third sustainable power source, and a sneak peek at our next improvement to the electricity system, batteries.
We’ve also got an update on Hypatia, our next big free update, and even a look at what is coming next week to Icarus.
Jump in and have a read.
Important Fixes
- Fixes to outposts so they all spawn creatures as intended
- Fixes to voxel mining audio which was causing a machinegun like sound effect that would not stop
- Fix for Deployable Destructible not being cleaned up unless the host / server restarted
- Fixed an issue where Weather effects were played inside caves
- Fixed issues where the Weather effects would appear incorrectly when mounted
- Fixed issues where Ice Borers could not be snapped and deployed
- Fixed issue where minerals and ores would sometimes revert to un-mineable grey chunks
- Frozen ore is now scaled based on ore gained not chance per hit, providing more overall frozen ore
- Fixed issues on Prometheus where Unstuck would place players outside of the map bounds
- Fixed issue where you couldn't upgrade buildings to Scoria Brick
Major Performance Improvements
This weeks update has a number of performance improvements that we’ve been testing out in our experimental build for the past few days. These are focused around reducing stutters and hitches caused by ‘level streaming’ (which is when a map tile is loaded into the world as you move into the area). The key areas include:
Improved load times for a number of in-game objects such as voxels
Changing ‘navmesh’ loading to a background thread
Changing the garbage collector to only run whenever important map tiles are streamed in our out
There’s a couple of core concepts that are tricky to understand, which are important to get the full picture of our improvements this week.
Threading:
Threads are pieces of work that are split up and run on different cores in your CPU at the same time.
Think of of this like queues at a bank. A single threaded game would be like having a single queue for a single bank teller (who represents a CPU core). In this scenario, only one customer can be served at a time (or one piece of work completed in-game on the CPU):
Multi-threading would be having multiple tellers and multiple queues, allowing for you to get through all of the people in the queue faster:
In theory, this means everything would run faster and smoother as the CPU cores could process more work, faster and more efficiently. But in reality, there is a problem on the other side of the bank counter. In order for the teller to process the customers job (the CPU to process the job) they have to go to the banks one and only ledger containing all the customers information (your RAM) in order to read and write the customers data.
In a single teller scenario this is perfectly fine, but once there are multiple tellers trying to do this at the same time, it’s chaos; numbers get overwritten, delays happen, and your bank crashes with weird error messages:
So what’s the solution to this? All modern game engines use a single “main thread” (also known as a “game thread”) to do most of the work. This puts a lot of strain on your CPU as it’s only able to use a single core for this work, resulting in your CPU utilisation showing something like 15% when the game is running poorly. Some work is still done multi-threaded, but it is a case by case basis as not everything is even suitable for it.
To return to the bank analogy, imagine the single queue, single teller setup, but this time we have a special second teller whose job it is to process forms.
- [*]The customers who need a form processed will join the main queue until they get to main teller.
[*]The main teller then sees that the customer is trying to get a form processed. The teller then gets all the information from the ledger that the form needs and attaches it, then sends the customer over to the special teller for that form to get processed.
[*]The main teller then continues processing the main queue while the other customer is getting their form processed at the special teller. The special teller doesn’t need to use the ledger because all of the relevant information to get that form processed has been attached, removing the issues from the original multi-threading scenario.
[*]Once the form has been processed the customer rejoins the main queue to hand the completed form to the main teller who puts the results into the ledger.
This is an example of using ‘worker threads’ to offload work from the main thread.
The main thread has to prepare the data that the worker thread needs to do its work, and when the worker thread is done ,the main thread has to apply the results back to the game.
This is used in a few places in Icarus, PhysX runs on a thread, as do things like voxel updates when you mine them. The important thing to know here is that threading is a tool can solve some problems but not all.
Time Slicing
Another such tool is “Time Slicing”. Time slicing is used to process a little bit of data each frame up to a certain time limit or number of items.
This smooths out a big spike of work over multiple frames, removing hitches at the cost of a slightly higher frame times while the work is going on.
This method is good for processing things that don’t need the results immediately and aren’t suitable to be threaded because they need access to the game data.
Start up times
When a map tile finishes streaming in, all of the objects on that tile need to start up on the same frame.
Icarus has both a lot of objects on its map tiles, and specifically objects that take a long time to start up, the combination of which led to a significant 'hitch'. While there isn’t a good way to reduce the number of objects on the tiles, a lot of the objects have now had their start up times shortened or spread out over multiple frames.
One major example of this is the voxels. There are roughly 800 to 1000 voxels per map tile, so everything they do during startup is magnified massively.
Voxels now have a lot of their setup done in the assets themselves instead of during their startup scripts.
'Loading their resource type' and 'registering with the shelter subsystem' have both been time sliced over multiple frames. Loading the voxel save data has been given a fast path that can quickly find the matching data without the slow search through all of save data.
In the test scenario these changes reduced the tile start up hitch from about 100ms to 18ms.
Navmesh loading
Navmesh (Navigation Mesh) is used by the AI to know where they can and can’t go.
Icarus being an open world game has a lot of navmesh to cover that surface area, as well as having to update that mesh when buildings are built on top of it. A previous engine update now allows us to use async navmesh loading, which is carried out on another thread. This completely removes navmesh loading hitches.
Garbage Collector
When a map tile streams in or out the engine forces a garbage collection.
This is to ensure that all unused objects get removed from memory and keeps the RAM usage as low as it can be. While this is good for reducing memory usage spikes, it takes a long time to complete a collection.
Garbage collection was happening even for distant tiles changing their LoD’s, resulting in a lot more than expected. We’ve disabled the default garbage collection during level streaming in favour of only doing them when streaming out the main level tiles. This massively reduces the amount of hitching during regular gameplay at a very slight memory usage increase from time to time.
Future work
While these changes have a big impact on the number of streaming hitches there are still some remaining, such as removing objects from a tile when it streams out, and high density foliage loading in (on both CPU and GPU). The remaining hitches are currently being worked on and we will have a patch addressing those in future.
New Content: Wind Power
Wind Power is finally in Icarus.
We’ve added the long-awaited Wind Turbine this week, giving you another way to generate electricity to power your Tier 3 and 4 deployables.
The Turbine requires a fair amount of space around the propellor, so these need to be spread out to be activated. When placing these or hovering over them, you’ll be able to see the range required to be free of any obstructions. The range required around these objects can be seen when highlighting over them (this will not be shown if the ‘Show Item Highlights’ setting is off).
The Wind Turbine is a Tier 4 item, crafted at the new Fabricator. Unlike solar panels, wind turbines will work around the clock, and don’t require cleaning such as water wheels do. This makes them the most efficient and easiest system to deploy and use, which is balanced by their lower power output and cost.
Batteries
With Wind Turbines being our third sustainable power source added to Icarus, providing a storage source for power is something we are actively working towards.
The initial implementation of resource networks doesn’t allow for batteries in the traditional sense. The way we developed these systems, is with machines registering themselves on the network and controlling their own on/off state, rather than it processing within the network itself.
To add batteries, we’ll need to modify this system to allow for them to exist and function as intended. This will allow for proper resource flow control, allowing for brownouts and variable energy flow rates.
Once these changes to the network have been made, the priority will be getting batteries added, so keep an eye out for these in the future.
Coming Soon: Hypatia
Now that New Frontiers has been released, our core development focus is shifting to our next major update, Hypatia.
We have a few more bugs that have been discovered in New Frontiers and other areas of the game that we will be working on, but the majority of the team's effort now moves towards this upcoming milestone.
Because of the massive hit Operations have been in New Frontiers (for those still unclear on what these are, this is the new system that allows for full missions to be triggerable from Open World), we have decided to focus our efforts fully on the Open World Operations in Olympus and Styx, rather than wait for the Biolab feature to be completed, which is still in the early stages of development.
This means that Hypatia with the Operations added to Styx and Olympus can be brought to you sooner, and our timelines will adjust to incorporate the Biolab into a future update.
At the same time, expect our regular, weekly updates with bug fixes, new content and quality of life to continue as they always have.
Next Week: New Mount
Speaking of new content, next week will be bringing some new friends to adventure with. New Mounts are coming to Olympus, Styx, and Prometheus as our free Week 92 update.
Support our Project
If you like what we’re doing with Icarus, and want to support our continued development, consider purchasing one of our DLCs for a few dollars, it would mean a lot to us.
https://store.steampowered.com/app/1648532/Icarus_New_Frontiers/
https://store.steampowered.com/bundle/33813/Icarus_Complete_the_Set/
https://store.steampowered.com/bundle/34141/Icarus_Outposts_Bundle/
Changelog v2.0.1.115492
New Content
[expand type=details]
- Unlocking Wind Turbine and adding new UI to show Turbine State
- Removing DNT from Wind Turbine & Damaged Audio Logs
- Adjusting wind turbine recipe and adding 'clear zone' visualistion which can be seen when highlighted, this zone must be kept clear for the turbine to keep running
- Adding first pass turbine audio and event and BP imp
- Adjustments to the wind turbine audio. Removed unnecessary layers and updated sound and spacial
- Added text for the wind turbine item
- Effects of equippable modifiers are now reduced when stacked (1 = 100%, 2 = 50%, 3 = 25%)
- Adjusted Module Stacking to only apply dimishing returns to specific modules
- Added icon and tooltip text to let player know if modules are affected by diminishing stat values when duplicate modules are stacked together
Fixed
[expand type=details]
- Fixed issue where some voxels were not receiving their material after they start being mined
- Shifted a voxel log from Error->Warning
- Fixed Larkwell Martinez Piercing Bolt not colliding with enemies.
- Fixed workshop item name typo.
- Celebrity Chef: Fixed mission pod not being cleaned up on mission abandon.
- Reduced the cost and output of the Wind Turbine. This allows the device to be a lower entry cost to power, while massive power output is better suited to other devices (or careful base design).
- Added missing roat bestiary event and corrected some bestiary data table entries that were not allocated the right sound. Added roat specific Audio Data Table entry
- Remove DNT on rain exposure modifier
- Fixed a few typos in ST_UMG
- Adjusting gasfly ballistic travel sound to be appropriate for faster travel speed
- Fixed bug where Swamp Bird didn't have an animation set for use with corpse eating action. Removed debug print from BTTask_RandomFlight
- Adding cooldown to gasfly explosion to stop double up of sound occasionally playing
- Fix possibility of infinite final hits on voxels when using multi-damage pickaxes. If a fully mined voxel resource tries to clean itself up on tick while remaining reinitialisable, explicitly turn tick off again, as cleanup function is not guaranteed to do this, potentially resulting in the final hit event getting spammed each tick. Also add a check to final hit events to only fire if the previous state was not fully mined
- Adjusting Cold Steel Arrows to be on Par with Steel arrow
- Noxious Crust now provides resource when cleaned
- Fixing workshop bolt sets providing the wrong bolts when consumed
- Adjusting Obsidian sickle stat description to mention crops and not just fruit or veges
- Clay brick building piece recipes have been adjusted to account for size
- Ice Borers no longer fall through the terrain when dropped
- Fixed typo in game mode info pop up
- Added a bone blacklist so the killcam doesnt target specific bones that protrude out of the AI mesh and makes the arrow float in mid air
- Enable custom weather for quests
- PRO_Story_3: Removed extra purple search area
- AI Spawned via BP_AISpawner now have their spawn locations offset by half their capsule height to prevent them from spawning inside the ground
- NPCSplineTrailComponent now correctly removes spline points as they are cleaned up
- forgot to add data structure change for blacklist bones
- Resaving AI Setup DT to fix build validation error
- Fixed New-Game Tutorial Popup string not being picked up by localized content generation
- Fixed duplicate spawn map color preventing creatures from spawning in a small area of the grasslands
- Removed Cave_SW_SML_004 as it was a duplicate version of Cave_SW_SML_003 and Swapped all 004 prefab caves to 003, Prometheus
- Added Tool Action helpers to the B.E.A.S.T meta item and all fertilizer items
- Rock Dog's lava spots now apply correct modifier and spawn when hitting landscape, or anything with the landscape collision profile
- Fixed a bug where if you drag the shield out of the utility slot the backpack stays invisible
- Fixed normals on all Shengong Bows and Axes
- Removed debugging text in 'on focus item'
- Rebalanced Miasmic tools to use Refined Wood in addition to Carbon Fiber
- Rebalanced Cold Steel tools to use variable amounts of Refined Wood per piece
- Rebalanced Obsidian tools to use Refined Wood across all pieces, rather than just the sledehammer. Removed Fur from Obsidian Sledgehammer and replaced with Leather
- Fixed various ammo recipes across the new toolsets not using the correct resources
- Fixed item setups for Acidic Glands, Infected Bark, Noxious Crust, Crystalized Miasma and Distilled Miasmic Coating directing to incorrect drop mesh, added representitive placeholders
- PRO_Story_3: Fixed wrong dialogue line being played when collecting recipe at end of mission
- Switched a number of lava cave voxels over to using the correct BPHV foliage type (conifer -> volcanic)
- Replaced Voxels in CAVE_AlienFossil_MED_001 to Pro_Volcanic_Cave_2, Prometheus
- Disabled shadow casting on slug slime trail
- Fixed bug where client was incorrectly applying slug slime modifier as well as server which was resulting in the modifier never disappearing from the list for clients.
- Slime trail particles are now properly cleaned up when their owning segment is removed.
- Slime trail particles are no longer spawned for dedicated server
- More datatable validation on FLOD Descriptions
- Added additional logic forcing Grasslands Crocodiles to spawn only near water
- Intersecting the slugs slime trail will now only cause a reaction if overlapping actor is a valid AI target
- Slightly increase melee distance of sickle, make some brambles simple collision
- Fixed seams between cliff actors and the landscape, moved deep ore deposit and fixed streched textures on a macro cliff, Purple and Green Quad, Prometheus
- Added new cheat function and dedi server command 'PrintAIDebug' to print useful debug information regarding currently active AI and relevant spawn blockers
- PRO_Story_3: Fixed base pieces being on low durability / destroyed state on reload
- Prometheus: Added descriptions for exploration missions
- Fixing iron window playing the closing animation for opening and closing the windows. Also added more surfaces to my test level
- Match the hit behaviour of new elemental pickaxes to that of existing pickaxes
- Submitting Bear Cub carcass mesh and textures
- Fixed Miasmic Ammo set being named Iron Wood Ammo
- Clamping att resistances to 99%
- Fixed new workshop crossbow bolts having incorrect collision
- Fixed new workshop crossbow bolt break chance to match workshop arrows at 100%
- Reordered workshop crossbow bolts, allowing the advanced bolt options to be unlocked in any order
- Tweaked placement of many workshop items for visual consistency between groups
- Swapped the item name, description, icon and mesh of workshop pickaxes, axes, spears and arrows that did not match their color scheme to their damage type
- Fix an issue where buildings cannot be damaged by weapons (due to prior commit)
- Updating my test level to include more buildable pieces for quick testing
- Addin Roat head shake audio to animation
- General polish pass across Drifter VFX, Effects will now be an appropriate color depending on biome. This fixes VFX for the swamp drifter
- Fixed floating tree in Grasslands & fixed hole in Swamp cave on Green/Yellow Quad, Prometheus
- Reset static mesh locations for geothermal pools and fixed some cliff seams in Red Quad and Purple Quad, Prometheus
- Drifter VFX polish
- Changed IMP Meshes & Removed Sea Grass on Land on Green/Yellow Quad, Prometheus
- Macro Cliff pass, Landscape Sculpting pass and Lava Lake placement, Red Quad and Purple Quad, Prometheus
- Fix issues with the fish finder scanning forever
- Removed all vehicle related code and dependant assets to free up linker library items
- Removed IcarusPhysXVehicle plugin to free up linker library items
- Made a number of assets static
- Made spawn point helper mesh components all editor only so they will be deleted from cooked builds
- Removed overlap checks from environment spline meshes
- Removed actor gathering from actor recorders that aren't using the gathered list
- Optionally removed transform reloads from recorders that don't need them
- Added recorder fast path for actor path names and guids (currently disabled)
- Time sliced shelter modifier initialisation
- Time sliced voxel initialisation
- Multiple tweaks to voxels to get their start up time (when a map tile streams in) as low as possible to reduce hitching
- Enabled async lazy navmesh rebuilds to reduce hitches
- Disabled garbage collection during level streaming to minimise hitches
- Offline processed voxels to reduce the amount of operations they perform on startup
- Disabled pre-loading of quests. This should reduce RAM usage by about 1 gb in some cases
- Added async loading of quests during missions
- Added proper PMs to Mangrove Roots and Fallen trunks
- fixed hands for shengong suit 3rd person
- Fixing snow wolf carcass and bones by creating a snow wolf carcass mat and overriding the relavent functions in the Corpse BP to match the other carcass flow
- Fixed missing materials for brick beams
- Re-enabled GC after main map tiles stream out. Not having this on was causing some bugs due to old actors being reused if the tile was streamed back in before they could be properly deleted. This will cause some hitches, but has been changed from original behaviour to only occur after main map tiles stream out, not just any map tiles streaming out. So it should still be significantly better
- Re-enabled fast actor path name lookups for voxel reloading. This reduces the time for voxels to find and load their data when they stream in. This behaviour is now only disabled for FLOD based voxels (i.e. stone)
- Removed context menu from loadout screen in OEI as it could be used to drop items on the ground directly from the inventory instead of putting them in a dropship for request. This would cause them to not be checked out in a loadout
- Fixed being able to start Prometheus missions /open worlds using the UI on dedicated servers if the launching player doesn't own the New Frontiers DLC
- Fixed Prometheus not appearing at all on the mission / open world screens if the DLC isn't owned (should show up as locked)
- Fixed Redback being unable to be crit and not having an armoured shell
- Slightly increased head crit area on Blueback and Redback
- Prometheus Shadow Geo - fixed mesh in D4 (arctic) to correct shadows
- Fixed walls not being able to be upgraded to Scoria Brick
- Removing streaming setting from some SFX, and adjusting preferences auto streaming setting
- Fixed Ice-Borer not attaching to super cooled ice nodes
- Fixed Scoria Brick wall angle right inverted from being unable to be upgraded to using the hammer
- Added additional validation to building piece lookup table
- Removed spawn overrides from outpost prospects
- Updated Everbark difficulty to use Forest outpost difficulty settings
- Prebuilt structures now save and load their spawned actor references so they can be referenced and interacted with after the first spawn
- Fixing repair hammer not making sound on fortifications. Also adding cooldown to mission update UI sound
- Change Cold Steel frozen ore reward behaviour (roll chance => percent of rewards paid)
- Remove resupply quest start dialogue which caused incorrect dialogue replay on PRO_Story_3 quest reload
- Improved Batdog physics asset.
- Adjusted drop location of Batdog corpse when placed on skinning bench.
- Added new ISlotableItem interface that can be implemented to adjust the actor spawn location when placed in a slot.
- Added an extra ragdoll-blocking collider to skinning bench to prevent corpses falling off right side
- Adding footsteps for mount on lava and slime
- Fixed animals not spawning on three new outpost maps
- Predator birds no longer target alive players/creatures/mounts within active spawn blocker/deterrent radius
- Slightly lowered armor paperdoll so it does not overlap build number
- Fixed visibility bugs with the shield and the backpack being invisible or both visible at the same time
- Missions 2,3,4,5,6 prebuilt structures are now destoryed when you abandon the quest
- Ensure unstuck respects out of bounds checks in Prometheus
- Fix abandoning a quest causing multiple quest dialogues to play. Dialogue trigger suppression is now applied during quest cleanup in all scenarios (previously it was only scoped to end-of-mission cleanup)
- Arctic Outposts: Added Deer to allow easy difficulty more sources of fur
- Desert Outposts: Added Scorpions, added spawn difficulty rules
- Prometheus: Increased likelyhood of Ashen Drake spawns in their areas
- Fixed stone voxels not reloading their mined state correctly
- Weather effects are now correctly attached to camera when sitting on mounts/other seats. Fixed screen damage post process effect overriding weather effect particle visibility when pulsed
- T4 Anvil Bench - adjusted position of output proxies in blueprint to line up correctly with the rack
- Reimport of swamp bird base mesh to fix bind pose with mouth open
- Changed frozen ore processor recipe to output 'Unknown Ore' rather than 'Metal Ore' so it shows the ore is random
- Fixed bug where wind/rain/other weather effects were appearing in caves
- Fixed broken deployable debris not cleaning up correctly
- Updated credits
- Created DMs for Bramble_A bushes in preparation for fixing this bug where brable bushes DMs are incorrect model
- Added proper Bramble DMs to Bramble BPs
- Fix quest dialogue replaying when resuming a prospect. Quest start dialogue entries defined in quest DT are now not played if the quest was reloaded
- Fixed issue where voxels receiving a resource type when loading in could fail
- Fixed Frozen Ore granting Aluminium Ingot instead Aluminium Ore
- PRO_Story_5: Updated tech level required to correctly mention Tier 4
- Adjusting Bounds Mask for Prometheus to Fix out of Bounds Zones
- Fixed the IRD showing an unsheltered warning when placed in a prospect you would never be able to accept a mission from it anyway
- Improved the effectiveness of elemental weapon effects on most creatures, notably Prometheus creatures.
- Arctic creatures typically take double damge from Poison, half damage from Frost. Swamp creatures typically take double damage from Fire, half damage from Poison.
- Lava creatures typically take double damage from Frost, half damage from Fire.
- Desert creatures typically take double damage from Frost.
- Some creatures have additional resistances, or slightly different resistances than the rest of their biome counterparts
- Removed the ability for the Electroshock modifier to stack
- Adjusting tree sap and expoxy item icons so they are visually distinct
- Being wet now increases Electric and Frost damage taken by 50%
- Increased the frequency that swamp water checks to infest you with parasites
- Reverted previous change due to metal ore not being able to be randomized. Added an itemable rowhandle to the processor recipes for when there are random outputs to use as an image
- Fixed Hail weather events incorrectly not filling water reservoir or watering crops
- Switched mobility of cave weather blocking volumes from Static->Stationary to ensure they render correctly onto RT_Shelter
- Pieces of destroyed deployables and buildings now fade out instead of popping when actor is destroyed
- Updated the building upgrade radial menu to show the New Frontiers icon on applicable building tiers
- Joining a Styx/Prometheus prospect will now show the difficulty warning popup and level boost option (was previously only shown when creating a prospect)
- Prometheus: Lava boss now takes +200% damage from Frost, -40% damage from Fire
- Added new higher resolution image for the random ore image
- Changed processorrecipes to take in itemdata to use as an image rather than the outputted item for when we want random outputs
- Frozen ore now shows 'Unknown Ore' when placed in a heat source