The Mipmap Streaming system gives you control over how Unity loads mipmaps.
本页包含以下信息:
For information about using the API to extend the functionality of this system, see Mipmap Streaming system API.
This system forces Unity to only load the mip levels needed to render the current Camera position, instead of loading all of them by default. It trades a small amount of CPU resources to save a potentially large amount of GPU memory.
You can set a total memory limit for all textures in an application, and the system automatically reduces mip levels to stay within this budget.
In Unity’s Viking Village demo project, the Mipmap Streaming system saves 25–30% of texture memory, depending on Camera location.
To enable Mipmap Streaming, go to Unity’s Quality Settings (Edit > Project Settings > Quality) and enable the Texture Streaming checkbox.
When you enable this setting, the Quality settings window reveals the settings specific to the Mipmap Streaming system. For details on each setting, see documentation on Quality Settings.
By default, this enables Mipmap Streaming for all Cameras in your project.
Now you can set up Mipmap Streaming on individual textures. Select a texture asset, navigate to the Inspector window and view the Texture Import settings. Open the Advanced settings, and enable the Streaming Mip Maps checkbox.
If you’re developing for Android, you also need to open the Build Settings and set the Compression Method to LZ4 or LZ4HC. Unity requires one of these compression methods for asynchronous Texture loading, which the Mipmap Streaming system relies upon.
Unity loads mips at the highest resolution possible while observing the memory budget. You can configure the priority of a texture with the Mip Map Priority setting in the Texture Import Settings.
Unity uses this setting to determine:
Positive numbers give higher priority. Valid values range from –128 to 127.
You can use the Mipmap Streaming system to stream mip levels for lightmaps.
You can edit the Mip Map Streaming settings of the lightmap assets in the same way that you can any other texture, but they reset to their default values when Unity regenerates the lightmaps. To solve this, you can tell Unity to apply these values when it generates the lightmaps. The Player Settings (Edit > Project Settings > Player) provide two controls to set streaming and priority for generated lightmaps: Lightmap Streaming Enabled and Streaming Priority.
Enabling Mip Map Streaming and configuring priority work in the same way for lightmaps as for regular textures.
You can configure default settings in the Unity Editor, and then use the Mipmap Streaming API to override these settings if required.
The Memory Budget property determines the maximum amount of memory Unity uses for textures. If your memory budget is too small, Unity lowers the resolution of textures in your scene. This can cause textures to pop or load slowly. However, the memory budget should be as small as possible to allow memory for other resources.
Set the memory budget in the Quality Settings window, with the Texture Streaming > Memory Budget property.
When the memory budget is full, Unity discards mipmaps it’s not using, to make room for those it needs to use. You can control how many unused mipmaps it discards with the Max Level Reduction.
This value is also the mipmap level that the Mipmap Streaming system initially loads at startup. For example, when this is set to 2, Unity skips the two highest mipmaps on first load.
Set this value in the Quality Settings window, with the Texture Streaming > Max Level Reduction property.
Note: Unity prioritises the Max Level Reduction value over the memory budget. It never discards more mipmaps than the Max Level Reduction value, even if this causes the textures memory to exceed the budget.
The memory budget includes textures that do not use Mipmap Streaming. For example, if your budget is 100MB and you have 90MB of textures that don’t use Mipmap Streaming, Unity tries to fit all the streaming mipmaps in the remaining 10MB. If it can’t, it loads them at a lower resolution. Unity always loads textures that don’t use Mipmap Streaming at full resolution, even if that exceeds the budget.
要确定您的内存预算的合理数量:
这确保有足够的纹理内存可用于场景中资源最密集的区域,并防止纹理下降到较低的分辨率。如果您有额外的可用内存,可以设置更大的内存预算,以便 Unity 可以将场景中不可见的纹理数据保留在串流缓存中。
By default, when you enable the Mipmap Streaming system, Unity enables it for all cameras. You can disable this setting if you like.
Control whether Unity enables mipmap Streaming for all Cameras in the Quality Settings window, with the Texture Streaming > Add All Cameras property.
If you want to exclude a specific Camera, add a Streaming Controller component to that Camera and then disable it.
If you disable Add All Cameras, then you must enable mipmap Streaming per-Camera. To do this, add a Streaming Controller component to the same GameObject as the Camera component.
This component also allows you to adjust the mip bias setting per-Camera.
Mipmap Streaming is enabled in Play Mode by default.
Control whether Unity enables Mipmap Streaming in Play Mode in the Editor Settings window, with the Streaming Settings > Enable Texture Streaming in Play Mode property.
When Mipmap Streaming is enabled in Play mode, but not enabled in Edit mode (or the other way around), toggling in and out of Play mode takes slightly longer. This prevents Unity from unloading and reloading mipmap data, and should speed up the Play Mode workflow.
Unity 具有内置的 Mipmap 串流调试视图模式。要访问此模式,请单击 Scene 视图控制下拉选单,然后选择 Texture Streaming。根据游戏对象在 Mipmap 串流系统中的状态,此视图模式将其显示为以下颜色:
您还可以使用调试 API 编写您自己的自定义调试工具。
重要:如果您使用 MainTexture 属性特性在您的着色器中标志了一个主纹理,这些纹理在调试模式下将不可见。要解决此问题,请始终使用名为 _Maintex
的纹理属性指明材质的主纹理。
For textures that use Mipmap Streaming, Unity calculates the correct mip level using one of the following methods:
If you don’t do this, Unity can’t calculate the correct mip level, and it loads the texture using low-quality mips. These can appear blurry.
Note: The following systems don’t use standard Renderer components. This means you must manually set the requested mips for these systems:
_ST
value with the same name as the texture flagged in your shader. For example, if you reference your textures are in the shader using _MainTex
, Unity will look for _MainTex_ST
.