Three days late, but late is better than never. With the holiday season being over, we’ve been hard at work on trying to get this thing wrapped up. We’ve made some incredible progress over the last two weeks, and while we still have 2 things to finish (I’ll go into more detail later) before we release, we have some very good news, as well as a few surprises for you :) Note: This blog post is a long one, and is two parts (You can only embed 5 videos per post, so make sure to scroll down to the next post when you’re finished reading this one).
The AMD Freeze
It’s done, finished, fixed. All versions of AMD GPUs on any firmware version will no longer get the AMD Freeze. While the code to fix this issue is amazingly simple, the process to track it down and fix it was the most challenging bug we’ve faced, due to the sheer amount of reversing that needed to be done to figure out where the problem was rooted. So what was the problem? If you recall from our last post, we had narrowed down the cause of the problem to contrails.
When contrails are rendered, geometry is sent to the GPU through what is called a vertex buffer. Once the geometry is in the vertex buffer, you can render as many instances of that geometry as you want efficiently instead of constantly sending it to the GPU every frame. One of the things you can do with vertex buffers is specify a start offset in which to start plucking vertices from for the draw calls. This Allows you to store multiple kinds of geometry in the same buffer. You set offset to where the geometry you want to render is in GPU memory and make the draw call, instead of having a separate vertex buffer for each different piece of geometry which would have to be bound/sent to the GPU with every draw call.
The problem was that this offset somehow ended up negative, which doesn’t make any sense. Nvidia seem to ignore this, but amd does not like it one bit. The device driver crashes and the device goes into the hung state. Halo online doesn’t deal with hung devices. When a device is in the hung state only two functions work: CheckDeviceStatus() and Release() therefore, while the game was still rendering, all the draw calls were being ignored, and hence the “freeze”. What’s the solution? Intercept the function that sets the vertex buffer stream offset and make sure that it’s not negative. If it is, set it to 0. Done.
To give you an idea of what unk_1 and those of us testing had to go through, here’s a video of real-time contrail debugging that he had to implement.
One of our testers, Xennma, has a card so freeze-prone, it would freeze immediately on the main menu because of the Valhalla tower beam contrails. Here’s the video of the actual freeze being caught in action by Xennma. As you can see, there’s a negative offset. Once we saw this negative offset, it was game over.
To show you how confident we are that this is 100% fixed, check out this very short clip of Mosh Pit Fiesta Guardian that I took using the flycam. Look at all of those contrails. We had three freeze-prone AMD cards in this game, and not one freeze occurred.
Q: Why haven’t you released yet? What is preventing you from releasing right now?
0.6 is at it’s most stable point yet in terms of crashing or freezing, but there are just 2 things left to do.
- The new updater has made even more progress, but isn’t quite finished, and we still need to rigorously test it.
- As you probably see on every single bi-weekly reddit post, there’s a bug in 0511 that gets mentioned a lot: ‘The dedi connection bug’. This has reared it’s ugly head for some of our testers recently, making it impossible to join testing sessions. We’ve already started troubleshooting this one and have some leads, and we believe this is the last real ‘bug’ that has to be fixed before release.
Misc/Small Bug Fixes and improvements since last post:
-
Fix ‘none’ game variant weapon option
-
Fix 'change gametype’ and 'change team’ h3 ui spinner display values
- Fix crash when render model materials block is empty
-
Improved ragdoll fix: restore death animations, h3 ragdoll backflip
- Add sanity checks in TagInstance::GetGroupTag (was causing crashes)
-
Fix simulation damage aftermath acceleration properly
- Fix incorrect voting time remaining (for real this time)
- Cache http server response - Reduces CPU usage
- Dedicated server cpu/ram optimization (cuts the dedi’s cpu usage in half)
- Added bottomless clip as a player trait
- Updated the forge selection render (picture below)
Since some of us have had some downtime while the updater and dedi bug are being worked on, we’ve added some more bad-ass features.
Gravity, Fog, and Snow have been added to the map modifier and can be completely customized for any map.
You asked, and we delivered. You can now add and customize snow and fog to any map. Gravity is a slider. Snow is a toggle. For fog, you can change the fog visibility, fog density, fog color, and fog brightness.
Here is a short video showing how to customize the lighting, fog and snow using the new forge;
Here’s a video showing how to use and change the gravity settings.
Here are a couple pictures of other examples.
For footage of new gameplay on maps using these new features, continue reading the next post below, which is part 2 of this blog post (Since I can only embed so many videos).