Napalm, small stashes, and lots of optimisation. We're wiping this week, too.
1 October 2015
Wow! You guys rekt that thing. I watched many encounters of the heli being completely owned without taking a single life. Turns out there was a bug making it super easy to be taken down. The chopper had 100% penetration values set, this means any bullets would go right through it like a laser beam damaging every hitbox inside it, so you could simply shoot from under it and the main rotor and engine would be destroyed! This is now fixed. Even that isn’t enough, though. So I’ve made the following balance changes and fixes
- Door guns fire slightly faster.
- Door guns do slightly more damage.
- Larger gap between door gun bursts.
- 2.5x health for the tail rotor and engine.
- Smoke on the weakspots appear when they are at 50% health instead of after one shot.
- You can no longer use tool cupboards to prevent rocket strafes.
- Loot crates are actually unlootable until their flames go out.
Also, this :
Some clever players figured out they could constantly circle around a piece of cover indefinitely and solo the helicopter. Welp that’s over. Now when you deal a significant chunk of damage to the helicopter it’ll blanket the area the damage came from in napalm, forcing you to move. I hope this makes it so it takes several players in multiple positions to take out the helicopter.
Another change I made was the ability to harvest the helicopter gibs! They’ll provide you with some metal fragments and high quality metal, but be careful they’re hot! You should wait about 8 minutes before attempting to harvest them.
Everyone in reddit is all up in arms about the bow changes I introduced (without trying them I might add) so let me fill you all in on what I changed and why:
- Bow repeat rate is slightly slower.
- Bow has a little more aim sway.
- Headshots with the bow score 120% damage instead of 300% damage.
- Crossbow fires arrows with a much faster velocity (50% bonus instead of 20%).
- HV arrows are ‘thinner’ vs wood arrows (need to be more accurate with them).
I did these changes because the bow had some of the highest DPS in the game, was the easiest weapon to obtain, and you could one shot a fully armed player with it. This was wrong. And, believe it or not, Rust is not ruined because of this change. Some people said their go to strategy was hunting fully geared players with a bow. Well you can still do that, you just have to hit them twice instead of once, so if you’re good it shouldn’t be a problem. And if that’s too hard for you then I guess you were getting lucky, which is exactly why I made these changes. It’s still just as deadly in every other way, and will take out a naked with one shot center mass.
I’ve added this back into the game. It’s a very small storage container for early players who can’t yet build a base, but still want to keep their stuff safe. It’s a default blueprint too! Place it on terrain and put your stuff in it. There is a menu option to bury it. Once buried, it is completely invisible to everyone (including you) it’s only revealed if someone is within 2 meters of it and looks directly at it for several seconds.
I have one or two more tasks relating to endgamers, and then I think it’s about time to give the early game a lot more love. I’ll be doing what I can in this department.
You know how you're all bitching about optimization? 'When are we gonna optimize the game? I wish the game was optimized. You should take a week off and optimize the game.' Well that's what we've been doing, so don't bitch and moan that you don't have anything new to play with.
I've been continuing my work on reducing the amount of garbage we create. I've mainly been focusing on the server for this, but these benefits apply to the client too.
To send network messages between the client and server we use protocol buffers. We use this library, which we found to be the cleanest and fastest available at the time. It does create a lot of garbage though. By this I mean it creates a lot of new classes without reusing them. So I've been going through and finding different ways to do things, changed a few classes to structs, pooling a bunch of objects, avoiding foreach, avoiding new byte's, avoiding creating BinaryWriters where possible. And the tl;dr is, it's now totally garbage free writing, and reading only creates new objects when reading a string (I couldn't get past that).
This saves us from between a few kb's up to a few mb's of garbage every FRAME. This makes garbage collection a lot rarer, which means that the server doesn't stop responding every 20 seconds for 1.5 seconds while it collects it all.
Another server performance issue were saves. Every 5 minutes the server saves its state, so if it crashes or restarts it can carry on pretty much where it stopped off. This is fine in the early days of a server, but once you approach having 200,000 entities, it starts to take a long time. Between 4 and 5 seconds generally.
During this 5 seconds you're running along as a player, other objects are stopped in place (helicopter, plane), and then when the server starts to respond again you're zapped back to where you were 5 seconds ago. Fucking terrible.
So with a bunch of caching, the pooling mentioned above, and some cunning, I got this down in my tests from 5 seconds, to 0.1 seconds. Which is still a little blip - so the auto saves are now every 10 minutes instead of every 5.
This is something we’ve been planning to do for a very long time but never have. Creating and destroying objects is a fairly expensive operation in game development in general and especially so in Unity. Not only does instantiating an object lead to relatively huge memory allocations, which have to be garbage collected when the object is destroyed, but it’s also simply a pretty slow operation in itself.
In this first iteration I added support for effects, decals, dynamic decor, building blocks and sounds. All of those have been spamming objects under the assumption that one day it won’t matter too much since we’re going to pool those instantiates and get rid of the overhead of those systems all at once.
What this means for you is less stuttering since fewer garbage collections have to be done and higher frame rates since the slow instantiate operations don’t have to be done at all as long as the pool contains game objects that can be recycled.
Since the game is finally in a pretty good state in terms of memory allocations things that used to be fairly minor compared to the big problem areas are now turning into the new, albeit less extreme, problem areas. Grass is such a system, and since Unity just recently added new overloads to rebuild meshes with a low memory overhead, I was able to significantly reduce the dynamic memory allocations when rebuilding grass meshes. Together with prefab pooling in the other systems this really made a difference.
There was a problem with the cliff mesh LOD setup that caused them to be rendered at full quality at any distance. This probably affected performance in a negative way fairly significantly for some of you and is now fixed.
- Fixed arrows being almost impossible to fire through window bars.
- Fixed crash in status console command.
- Fixed building stability issues caused by collider batching.
- Fixed entity collision event not resolving batched colliders.
- Fixed water level test for entities with zero bounds.
- Fixed terrain alpha cutoff range being too far away.
- Added pooling support to all LOD components.
- Added AssetPool (memory pool that’s optimized for Unity assets).
- Updated CraggyIsland (dev test map).
After weeks of mostly focusing on optimizations and back end work I’m hoping to return to working on some new map related features this month.
I revisited the holo sight model as it had some issues with the dents looking a bit off. It’s almost ready to go in game as I just need to tweak the texture a bit more.
I added some more wear-and-tear to the red dot add-on model. It's almost ready, too.
I made the rail pieces that the add-ons will act as an intermediary between the add-on and the guns they’re attached to.
I’ll finish up the textures for the holo sight/red dot and start working on the low-poly versions of the flashlight/laser-sight/silencer add-ons.
I’m back from vacation this week, and I had some gate related tasks to take care of. There’s nothing to show for this really, as most of the work I have done the last four days has been pretty invisible, but will pay off in the future.
It involved redoing things that already existed, such as animations for gates and player building doors, having them use bespoke animations as opposed to the procedural ones used so far. We also have all doors and gates sharing a same hierarchy and pool of anims, which will pave the way to easy updates and skins for them in the future. After this some more gibs, small tasks here and there. Expect the gates and doors animation stuff in for next patch.
Unfortunately I'm not pushing the dungeon branch into main for this patch as the dungeons will still need some love when Andre’s terrain features arrive. It is very likely to be for the next wipe cycle.
I have a few leads regarding gates skins I can explore, as well as player building block skins (think wallpapers). These things should give me some buffer until I’m back working on dungeons.
More progress on the AK47. There’s some still some tweaks to do but here it is so far (there’s an extra mag in the shot, but ignore that).
The extra UV space is super awesome and it will benefit people who are making there own skins for the AK that’s already in the game. I’ll create a tutorial on how to transfer old skins onto the new mesh, but nevertheless I’m excited to see new skins you guys decide to come up with. I’ve also started the LODs for the female character considering all that I’m doing now is tweaking texture maps.
Finalise the texture for the female and transfer the LODs over to the new AK.
Unity uses a linear scale for volume, but humans perceive sound volumes in a logarithmic scale, so if you take a sound in unity and turn the volume down half way, it doesn’t actually sound like it’s been turned down half way. This is a little lame because the volume sliders in the editor are dominated by louder levels. It’s a lot lame because when we fade sounds in and out, they spend less time at the lower volumes, which makes the fades sound too abrupt. I spent some time this week fixing that. Transitions between different ambiences will sound smoother now, and so will all of the distance crossfades. The helicopter propellers will probably be the easiest place to hear this change right now.
I’ve started adding pooling to the sound system and fixed some bugs that arose from recycling sound objects. All the prefabs that we spawn to play sounds should be pooled now. There’s still some room for improvement here so I’ll be trying to reduce the sound system’s GC contributions more next week.
- Finished up a first pass at wooden and metal door impact sounds
- Finished a first pass at thunder sounds
- Increased the distance the rocket flight sound is audible from
- Toned down the heartbeat that plays when you’re wounded
- Made some tweaks to the bush rustling sounds
- Adjusted the gunshot and explosion volume ducking a little bit
- Re-setup third-person reload sounds
- Made the reverb tail wander calm down shortly after the shot so it doesn’t sound so bouncy and ridiculous if there’s more than one or two gunshots going off at once
- Made a few small tweaks to our audio mixer
- Started working on open/close sounds for the large compound gates (fun!)
- Started working on bullet ricochet sounds
Next week I’ll be spending a bit of time reducing GC in the sound system and finishing up the sounds I started working on this week. I also want to spend some time exploring Unity’s Native Audio Plugin SDK.
Eat my (customizable) shorts!
More gaudy, obnoxious clothing. Also, possibly some new computer hardware for me. That’d be cool.
Tried some sniper scope ideas this week, experimenting with some more unique looking scopes like retro fitted telescope, glass bottle (bit of game logic with this one; I'm not sure 100% would work, but it looks cool), and mounted magnifying lenses. There's also some designs that just have a cool look to them but are made from more DIY type parts: copper piping, pipe clips, cloth binding, etc. I tried to keep the attachment point pretty simple, with either a simple metal plate or just a bolt so you could stick them onto any gun and have some sort of believable way they'd stick on, letting you make some crazy p250 silenced sniper beast gun or something similar
Add-ons, add-ons, add-ons!
I just got back from vacation, but I had a little bit of time to work on something Vince asked me to look into: creating some skins for our gate model to give it a little more personality. We want these skins to be able to work on either the stone or the wood gate, so these probably aren’t going to work since the frame of the stone and wood gates are different, but I’m going to continue on focusing on just the doors and the design of the locking mechanism while borrowing some elements from these initial designs.
After I’m done with the gate skins, I really want to get back to the abandoned military tunnels.
A SavasIsland_koth update I made some time ago goes live this patch. The most notable change is that you can no longer build right over the construction hut, and that there is now a way for hill owners to clear existing building parts, thanks to a new rapid-spawn C4 platform that defenders can and should build around and fortify. Hopefully this means hill bases will stop growing out of control like a uncontrollable tumour.
I also made an updated map because some people are still really confused by the map:
It is worth noting that you can get good and bad loot boxes everywhere, but it is far more rare to find a metal crate on the beach than in the dome. Likewise, the only place to get exotic ammo is in the central ammo farm.
Spent the weekend trying to find ways to speed up local reflections and the last few days cleaning up and preparing for the merge. It’s finally time to give up endless tweaking and drop it on the build.
So to recap, here’s a list of changes introduced with Water 2.5:
- Local reflections on all water surfaces.
- Rivers using new water shader.
- Fixed a bunch of long-standing bugs.
- Cleaned runtime memory allocations.
Fixing any bugs that may show up due to new water code. Likely some more water tweaks. Native code updates to get rid of some Unity 5.2 warnings.
I've been looking into reworking the male character model. I've mostly been balancing out proportions on the body and everything's still really loose while we iterate. This is the progress, from left-to-right.
Added server side collider batching to work around the Unity collider limit
Added prefab pooling to effects, decals, dynamic decor, building blocks and sounds
Added pooling support to all LOD components
Bean can & f1 grenades - Added hold state & anim while aiming
Added correct AI obstacle shapes to building pieces
Added deploy volume that uses the newly added unified entity OBB
Fixed effects dying when target object was removed
Fixed some effects not being recycled
Fixed ragdolls not inheriting effects (blood disappear on death)
Fixed arrows being almost impossible to fire through window bars
Fixed cliffs never switching to lower LODs
Fixed being able to loot a corpse from far away
Rocket Launcher - Fixed snapping when going to ironsight, added dryfire sounds
Made bow viewable, fixed popping on idle loop, improved transition when cancelling shot
Salvaged sword - fixed snapping on hit reactions
Fixed query throttle not working
Fixed crash in status console command
Fixed building stability issues caused by collider batching
Fixed entity collision event not resolving batched colliders
Fixed water level test for entities with zero bounds
Fixed terrain alpha cutoff range being too far away
Roof blocks are cheaper
Roof blocks are tougher
NPCs die of starvation more
Completely reworked entity visibility queries, fixing various issues along the way
Server time warnings show whether it was caused by a garbage collection
Server console show garbage collection count
Optimized dynamic memory allocations when refreshing grass meshes
Objects created by the protobuffer system use a pool
Protobuffers write directly to the network stream, instead of creating a byte
Increased calorie consumption
Hammer - smoothed out anim speeds
SMG - dryfire fix
Sound volumes use a scale that is closer to how humans hear
Set up third person reload sounds again
Toned down wounded heartbeat sound
Gunshots and explosions duck other sounds slightly
Rocket flight is audible from farther away
First pass at silenced gunshots
New thunder sounds
New door impact sounds
New tree impact sounds
Bush rustle sound tweaks
Calmed reverb tail wander on gunshots and explosions down a touch
Sound templates are pooled
Arrows, spears and sign world models gibs
Auto saves are every 10 minutes instead of every 5
Developer 1 only works if you're a developer/admin
Errors/Exceptions are highlighted red in the server console
Errors/Exceptions on server log the stacktrace too
Improved gib performance
Impact effects now get the exact terrain material at impact (sand, dirt, …)
Fireballs use better sound balancing (client side performance)
Run the garbage collector in the loading screen (join, respawn)
Clamp AF between 1 and 16 (fixes silent errors)
Updated CraggyIsland (dev test map)
If you want to follow this project you can sign up to the mailing list.
We'll only update you about this project, we won't spam you about other stuff or sell your email address.