Hi, recently some Epic engineers have recommended using Streaming Virtual Textures (SVTs) for most textures and this same advice was echoed a few times during the recent Unreal Fest 2025 presentations. We were told converting textures would result in significant memory savings over the traditional texture streaming and so we are anxious to try it out. I was hoping to have a few questions answered and I am also interested in any guidance you can provide for converting a large project over to use SVTs.
We were told to simply select all textures -> convert to SVT in the editor (with the exception of any textures that are used for Runtime Virtual Texturing (RVT) and VFX). I’ve noticed that this conversion tool will check for all materials that are referenced by the texture, convert the samplers to support SVT, and then proceed to convert any other textures also referenced by this sampler. Since we already have a large number of textures and materials, the dependencies can be quite significant, in fact, it will eventually lock up in a recursive loop (more on that at the end of this post). I wonder if the better strategy would be to go with the manual conversion approach and then deal with the material fallout after, possibly utilizing scripts for bulk changes? Maybe even targeting specific asset classes like characters or props to start.
That leads me to my next question, what’s the best way to deal with the VT pools? We already use a few pools for landscape RVT, since there are only 15 pools total, I assume we should prioritize the most frequent texture formats. What is the recommended tile size? I suppose this probably depends on how they are used. The default is 128x128, but does a smaller granularity make sense for the common use-case, or is this a pretty good starting point?
The recommendation was to not convert RVT textures and VFX, but does it make sense to also exclude UI textures or should those be converted to SVT as well? Are bindless textures supported?
At the recent Unreal Fest 2025, Livestream 2, Day 2, there is a presentation titled Avowed: A GPU Technical Retrospective, in this presentation they mention a race condition with loading materials/textures that used the layered material system. Can you explain more about this? Is this a known issue or are there any fixes? Are there any other pitfalls to look out for? Are there any other types of materials that should avoid SVT, I imagine anything that requires numerous texture samples might be bad candidates because of the extra texture indirection?
Regarding the conversion tool lockup:
To reproduce: Select all textures -> Right click -> Convert to Virtual Texture -> wait for dialog box -> Select Ok -> Editor will lockup during conversion
The render thread will be updating material proxy uniform expressions, this will go through every parameter and eventually inside GetParameterValue it will recursively use the fallback render proxy because the Shadermap is null. I believe the shadermap is null because the main thread is waiting for it to compile. So possibly there is a race condition of needing to complete the compilation of the shader before overflowing the stack. I can workaround the issue by exiting false in GetParameterValue if I detect its iterated over a certain number of times, but that does not seem like an ideal fix.