iTranslated by AI
[UE5] How to Adjust Virtual Texture Storage Capacity and Memory Usage
Environment at the time of writing
| Item | Version |
|---|---|
| Unreal Engine | 5.6.1 |
| OS | Windows11 |
| Platform | Windows |
Prerequisites
This article is for the 6th day of Unreal Engine (UE) - Qiita Advent Calendar 2025 - Qiita.
Additionally, I will not discuss performance overhead or behavior such as GPU load or popping measures in this article.
Overview
VirtualTexture is very convenient, isn't it?
If you're not sure what it is, please start by reading the official documentation or the linked articles below.
Streaming Virtual Texturing in Unreal Engine | Epic Developer Community
[UE] Virtual Texture and its Streaming mechanism, plus answers to frequently asked questions #UE4 - Qiita
[UE4] About VirtualTexturing | Historia Inc.
Since it is so useful, using it for available textures to keep memory usage down has likely become a mainstream approach for development targeting mid-to-high-end platforms.
However, modern texture assets are often around 4K, and if you package them as-is, those 4K textures will naturally reside in storage.
As a result, texture files could end up occupying most of the capacity of the packaged content.
Also, since the system manages pooled memory, the capacity of that pool can grow quite large, which may ironically end up pressuring the memory.
The purpose of this article is to share the configuration methods available to address these points.
Verification
The project uses Stack O Bot | Fab, which was recently added officially.
Storage Capacity Verification
First, let's package the project without any modifications and look at the breakdown of asset capacities.
For information on how to check the asset breakdown, please refer to the following article I wrote a while ago:
[UE5] How to check the size breakdown of assets in a package
Looking at the contents using "Asset Disk Size," the result is as shown in the figure below.

A clear example is the texture named T_Metal_Painted_N that I selected.
It is about 12MB in size.
It is a 4K normal map texture compressed using BC5.
If this is not an issue, you don't need to do anything, but it can become a problem if you want to keep the package size as small as possible.
Memory Capacity Verification
I will check this using Memory Insights within Unreal Insights.
I have also written an article about how to check the breakdown of memory usage for each asset, so please refer to that as well.
[UE5] How to use Memory Insights and display asset usage status
The measurement was taken at the starting point of the running game after clicking "Play" from the title screen.

The result is as shown below.

In this result, the parts allocating 63–65 MB are the pool textures used by Virtual Texture (most likely).
While this is significantly more memory-efficient compared to loading all textures, there may be needs such as requiring pools depending on the texture format or wanting to change the size per platform.
Next, I will explain how to configure these settings.
Configuration Methods and Results
Storage Capacity
Regarding storage, you specify the size during texture cooking.
Please refer to the following documentation for details:
Texture Format Support and Settings in Unreal Engine | Epic Developer Community
While MaxLODSize can be used for regular textures, it does not work for Virtual Textures. For Virtual Textures, use MaxLODSize_VT.
Additionally, it seems that LODBias_VT settings have been added since UE 5.6. This is a setting for LODBias during rendering, so it doesn't affect storage capacity, but it may be effective when you want to reduce the rendering load.
Let's look at the texture capacity when packaged by adding the following to DefaultDeviceProfiles.ini. I have set MaxLODSize_VT to 2048.
[GlobalDefaults DeviceProfile]
TextureLODGroups=(Group=TEXTUREGROUP_World,MinLODSize=1,MaxLODSize=16384,LODBias=0,MaxLODSize_VT=2048,MinMagFilter=aniso,MipFilter=point,MipGenSettings=TMGS_SimpleAverage)
The results are shown in the figure below. You can see that the overall texture capacity has decreased, and the size of the prominent T_Metal_Painted_N has been drastically reduced.

This is one method you can take when textures occupy the entire package and you need to reduce the size after checking the size breakdown.
Memory Capacity
Pool Memory per Format
By default, a 64MB pool is used for each format type, but this setting can be changed.
You can configure this from the Virtual Texture section within the Project Settings.
Also, the pool size can be set for each format type.

The fact that it's "for each format type" is a bit of a trap; even if there is only one texture of a certain format used in the scene, the pool memory will be allocated.
Therefore, if BC3 and BC7 get mixed up due to configuration errors, pool memory for both BC3 and BC7 will be allocated.
If this is intentional, there's no problem, but if it's set unintentionally, it will conversely pressure the memory.
Regarding errors, it's best to prevent them by creating a Validator.
Let's actually confirm that the memory pool is increasing.
I'll change the compression type of the texture at /Game/StackOBot/Environment/Materials/Textures/T_ConcreteTileable_BC.T_ConcreteTileable_BC to BC7.

The figure below shows the result of executing the console command r.VT.DumpPoolUsage.
You can see that there is only one BC7 texture.

Now let's look at Unreal Insights.
Compared to before, you can see that the pool texture allocating 64MB has increased.

Pool Memory Scaling
Pool memory can be scaled using console variables in device profiles, etc.
r.VT.PoolSizeScale is that setting.
However, by default, it won't work even if you set it to 0.1 or 0.5.
By adding a pool setting for each format and turning ON Allow Size Scale within it, the scale will take effect for that pool.

Therefore, configure the pools you want to scale and adjust r.VT.PoolSizeScale in the device profiles for the necessary platforms.
Summary
Virtual Texture is extremely convenient.
However, if used without any countermeasures, it can increase packaging size or lead to unexpectedly high memory load.
Let's have a great Virtual Texture life by thoroughly implementing countermeasures, verification, measurement, and appropriate responses.
Discussion