Want to update the thread to mention the progress:
Part Instancing
We’ve been going through the rollout, discovering a few small bugs and fixing them along the way. It’s really close as far as we know - it’s currently disabled, but we’ll try to enable it in the coming weeks on desktop. Didn’t quite make RDC US, but will definitely make RDC EU
Inter-cluster instancing
We’ve implemented a feature that allows merging objects from different clusters into a single draw call dynamically. This is live of desktop as of right now and currently means that any Mesh/CSG parts that are clones of each other and are in the view will be rendered with a single draw call regardless of where they are. This also opens up opportunities for significant optimization of transparent part rendering - with part instancing and this combined, we’re seeing less overhead for transparent parts which is awesome.
Part instancing and levels with really high part count
The initial release of part instancing uses “dynamic” instance data submission - the data for each part that describes the visual appearance of the part is uploaded to GPU every frame. This works fine for levels with reasonable number of parts that are visible - e.g. 10-20k - but starts hitting performance issues for really aggressive scenes e.g. 100k visible parts. We’re working on a change that, on a per-cluster basis, caches the part instance data in GPU buffers and updates those. These updates should be much faster than the reclustering operations that could happen in the previous system, which hopefully should make the new system work well even on levels with millions of blocks.
We’ve enabled part instancing again on desktop (PC & Mac) and in Studio. We don’t have any known bugs and performance should be good in all cases - the issues I’ve mentioned with levels with millions of blocks have been addressed. Don’t hesitate to let us know if you find any rendering issues or performance problems with the new system.
We’re planning to roll this system out to consoles and mobile in the coming weeks, with the exception of Android where instancing isn’t currently active unless your phone has Vulkan support. We have a plan to ship mesh/CSG instancing on GLES3 Android devices, but it’s likely that part instancing will only be active on Vulkan devices on that platform for the remainder of this year.
This sentence is now false We’ll take a look at both issues. FWIW as a work around for special meshes disappearing, you should be able to increase the size of the part they’re attached to until the bug stops happening… edit oops I got it wrong, we don’t actually use part size for this… I think there might not be a good workaround for this, so we’ll probably need to disable this.
If you have a link to one of these games we could take a look as well to see if we need to improve anything on our side - we’re going through final phases of polishing performance anyway.
I’ve had to severely cut down on place that suffered from these issues, but I’ll try to setup a demo that reflects the issues we had been facing prior to the introduction of a custom LoD system.
This is an internal inefficiency that we need to correct; we aren’t rendering objects with transparency=1 but we are inefficiently distributing them across entities right now. We’ll take a look at improving this.