As promised in last week’s devblog, I focused on the last performance issues caused by skins over the weekend and first half of the week. I implemented fully asynchronous texture loading from PNG including texture compression via DXT and mip map creation. This means that everything that has to be done when a new skin was downloaded and the texture cache is created is now running in a thread without any impact of the game frame rate. All of the heavy lifting was implemented in native code to make it crunch through the skin textures fast enough even when a bunch of skins have to be processed simultaneously. The result is that skin loading now has next to no impact on the game performance, as you can see on these screenshots from before and after the optimizations.
I’m pretty proud of the API I wrapped around this since it’s just as easy to use as Unity’s WWW class but without the massive frame rate drops that came from blocking the main thread. If you’ve played with skins disabled up until now I highly recommend giving them another try this week.
Aside from skins one of the biggest performance issues related to entities being streamed in and out of the world was the client side method to get all entities that belong to a certain network group. This is used to destroy all entities that belong to a certain network group when that group is left. I sat down and rewrote this so we have a clean and efficient way to do this sort of query. This eliminates a 30ms spike for every network cell that is left, of which there can be around 15 at once.
We’ve tested a new configuration for the server flooding protections on the official servers over the week and after some tweaking it looks like we’ve found something that’s more secure in case of a DOS attack while simultaneously reducing the amount of false positives. This new configuration will go live to all servers with this week’s update.
I’ve increased the number of entities to send per server frame when someone spawns or respawns. This generally speeds up the time spent in the “receiving data” step of the loading screen.
I’ve been chugging along at getting the grounds around rocket factory to a polished level. Most of the area I’ve been working on is now fully dressed, and I’ve been hard at work at placing the overgrowth, vertex painting the ground meshes, and adding various other dressing props. I’m very pleased with how this part of the level turned out and I’ll spend the remaining time this week on getting everything as polished as possible before handing the map over to Vince, next week. All that’s left is to create LOD and collision models, bug testing. and to add loot spawns. As long as nothing unexpected happens, we should be on track to release this area in the next forced wipe.
Hapis work continues, and we’re still on schedule for a big update in July.
I’m also taking a look at our lighting again, as it seems to have deteriorated lately, just like our wonderful neon-grass. Likewise, I am hopeful that I can bring in some proper lush trees before the wipe too, so that we can finally say goodbye to this age of pine trees.
Also, Buck and I will be working on giving Hapis Island a bit of backstory. This will include naming all of the things on the island, which will in turn be visible on the in-game map. This is something that we want to translate on to procmaps as well in the near-future.
But more on all that later, as none of this is relevant to today’s patch!
I’ve finished up on the Tier 3 Workbench. LODs and gibs all done, so it’s ready for implementation. I know a few of you on Reddit have wondered about the workbenches, so I wanted to let you all know that we now have all three tiers of the workbenches done! Here are a couple of screenshots of it in engine.
I’ve spent quite a lot of time doing listening tests with random intensity fluctuations this week and fixing issues as I come across them. This has mostly been really small granular changes (like extending the length of a note to fill a spot that feels off when drums aren’t there). There’s a little bit more of this to do still
I’ve found some occasional sync issues with clips that fade in part way through playing and am exploring options for fixing that now. It’s looking like I’m going to have to rejig the playback portion of the new music system a bit. I’ve got a couple different approaches in mind that I think will work well, and will actually give us sample-accurate timing on all music clip playback.
There’s been a couple smaller improvements this week too. Separate menu and in-game volume sliders are working now, and the music volume sliders have a much more sensible max volume so having them turned all the way up will actually let the music sit nicely with the rest of the game audio instead of drowning everything out.
I’ve seen a good number of people asking when this is going to be done, and I was hoping to have it wrapped up already, but I really want to make sure this all kicks ass before I push it out. You guys will have to wait a little longer still, but I think it’ll be worth it.
I’ve done another round of smaller mix tweaks and sound polish this week. Inventory UI sounds are probably where you’ll notice it the most this time around, although I’ve smoothed out levels of qutie a few other bits as well.
I spent some time working through my backlog of raw recordings and getting stuff library-ready this week too.
I’m back working on Rust after doing some work on another project. This week I’ve been working on the third-person player animations. I added a bit of arm sway when the player runs. I also made the player lower his gun to a more natural position when walking (assuming the player has not fired his gun recently). I also tweaked the player’s walk animation so it looks more distinct from the running animation.