Version: 2020.3
帧调试器
串流控制器 (Streaming Controller)

Mipmap 串流

Mipmap 串流系统可以控制 Unity 加载到内存中的 Mipmap 级别。该系统可减少 Unity 对于纹理所需的内存总量,因为它只加载 Unity 在场景中渲染当前摄像机位置时所需的 Mipmap,而不是默认加载所有 Mipmap。该系统通过消耗少量 CPU 资源来节省潜在的大量 GPU 内存。

您还可以使用 Memory Budget(内存预算) 为项目中使用的所有纹理设置一个总内存限制。Mipmap 串流系统会自动降低 Mipmap 级别来确保不超出此预算范围。

您可以使用 Mipmap 串流系统 API 为特定纹理请求特定的 Mipmap 级别。Unity 提供了 C# 代码示例,其中会重现 Mipmap 选择方法的引擎逻辑;您可以使用此引擎逻辑来覆盖您自己项目中的引擎逻辑。有关更多详细信息,请参阅 Mipmap 串流 API

在 Unity 的 Viking Village 演示项目中,Mipmap 串流可以节省 25–30% 的纹理内存,具体数值取决于摄像机位置。

准备开始

要启用 Mipmap 串流,请选择 Unity 的 Quality Settings (Edit > Project Settings > Quality),然后启用 Texture Streaming 复选框。此时将显示 Mipmap 串流系统特有的设置。如需了解每项设置的详细信息,请参阅 Quality Settings 的文档。

完成此操作后,请在各个纹理上设置 Mipmap 串流,从而让 Mipmap 串流系统将每个纹理的 Mipmap 从磁盘流式传输到内存中。为此,请选择要应用 Mipmap 串流的纹理,导航到 Inspector 窗口,并查看纹理导入设置。打开 Advanced 设置,并启用 Streaming Mip Maps 复选框。

如果是进行 Android 开发,还需要打开 Build Settings 并将 Compression Method 设置为 LZ4LZ4HC。Unity 需要使用其中一种压缩方法进行异步纹理加载,这是 Mipmap 串流系统所必需的操作。

Unity 在满足纹理 Memory Budget(内存预算) 的同时以最高分辨率级别加载 Mipmap。要进行更具体的控制或微调 Mipmap 串流系统的自动化结果,请使用 C# API 为每个纹理指定 Mipmap 级别。有关更多详细信息,请参阅 Mipmap 串流 API

限制

您可以指示 Mipmap 串流使用以下方法之一计算所需的 Mipmap 级别:

如果您不指示 Mipmap 串流使用这些方法之一计算 Mipmap 级别,Unity 将无法计算要使用的 Mip 级别。这会导致 Unity 使用看起来模糊的低质量 Mip 加载纹理。

以下系统不使用标准渲染器。这意味着您必须为这些系统手动设置请求的 Mipmap,否则 Unity 会以低分辨率加载它们使用的纹理:

  • 贴花投影器 (Decal Projector) 纹理。
  • 反射探针纹理:较低分辨率的 Mipmap 是粗糙度的查找表。因此,如果 Unity 使用较低的 Mipmap 级别,它会使用错误的粗糙度渲染材质。
  • Unity 地形系统中的纹理:Unity 不支持地形纹理上的 Mipmap 串流。这是因为地形纹理需要始终以全分辨率提供,以允许 Unity 平铺和混合纹理。
  • 处理纹理 UV 坐标的着色器与 Unity 内置着色器不同。Unity 始终假定纹理使用存储在 Msh 中的 UV0 进行采样。除了缩放和平移(见下文)或使用 UV1 外,不考虑任何基于着色器的纹理坐标修改。

当渲染器处于活动状态时,渲染器使用的网格需要有效的 UV 分布指标来计算所需的 Mipmap 级别。作为网格导入过程的一部分,Unity 会自动计算分布指标。您也可以在脚本中使用 Mesh.GetUVDistributionMetric 进行计算。

当 Unity 直接使用 API(例如 Graphics.DrawMeshNow)直接渲染串流纹理时,系统没有用于计算 Mip 级别的渲染器边界或其他信息,因此您需要显式设置纹理 Mip 级别(或在此纹理上禁用 Mipmap 串流)。有关如何手动设置要加载的 Mip 的更多详细信息,请参阅有关 Texture2D.requestedMipmapLevel 的文档。

调试 Mipmap 串流

Unity 具有内置的 Mipmap 串流调试视图模式。要访问此模式,请单击 Scene 视图控制下拉选单,然后选择 Texture Streaming。根据游戏对象在 Mipmap 串流系统中的状态,此视图模式将其显示为以下颜色:

  • __绿色__表示由于 Mipmap 串流系统而降低了 Mipmap 的纹理。
  • __红色__表示由于 Mipmap 串流系统没有足够资源来加载全部 Mipmap 而减少了 Mipmap 的纹理。
  • __蓝色__表示未设置为串流的纹理,或者在没有渲染器计算 Mip 级别的情况下的纹理。

您还可以使用调试 API 编写您自己的自定义调试工具。

__重要__:如果您使用 MainTexture 属性特性在您的着色器中标志了一个主纹理,这些纹理在调试模式下将不可见。要解决此问题,请始终使用名为 _Maintex 的纹理属性指明材质的主纹理。

帧调试器
串流控制器 (Streaming Controller)