本页包含以下部分:
使用 API 可对 Unity 串流纹理的方式进行更有力的控制。您可以覆盖要为特定纹理加载的 Mipmap 级别,而 Mipmap 串流系统将自动管理所有其他纹理。在特定的游戏项目中,您可能知道 Unity 需要完全加载某些纹理。例如,远距离快速移动或者使用瞬间摄像机切换镜头,可能会导致明显的纹理质量变化,而 Mipmap 串流系统会将 Mipmap 从磁盘串流到内存。为了减少这个问题,可以使用 API 在新的摄像机位置预加载 Mipmap。
要对纹理启用和控制 Mipmap 串流,请使用以下属性:
Mipmap 串流可自动减小纹理的大小,直到它们符合 Mipmap 串流__内存预算 (Memory Budget)。纹理的 Mipmap 优先级__ 数值大致是__内存预算__ 的 Mipmap 偏移。例如,优先级为 2 时,Mipmap 串流系统尝试使用比优先级为 0 的其他纹理高出两个 Mip 级别的 Mipmap。负值也有效。如果无法实现,则会使用更低的 Mip 级别来适应__内存预算 (Memory Budget)__。
以下属性在运行时为只读:
要控制运行时的行为,请使用以下静态属性:
Memory Budget(内存预算) 属性确定 Unity 用于场景中纹理的最大内存量。默认情况下,此设置为 512MB。使用纹理串流时,__内存预算__ 对您的场景有很大影响。如果您的内存预算太小,Unity 会降低场景中纹理的分辨率。这可能会导致纹理突变或加载缓慢。但是,内存预算应尽可能小,以便为其他资源留出内存。
要确定您的内存预算的合理数量:
1.在项目运行时查看 Texture.desiredTextureMemory 值。 2.将 Memory Budget 值设置为略高于Texture.desiredTextureMemory 的值。
这确保有足够的纹理内存可用于场景中资源最密集的区域,并防止纹理下降到较低的分辨率。如果您有额外的可用内存,可以设置更大的内存预算,以便 Unity 可以将场景中不可见的纹理数据保留在串流缓存中。
In the Quality Settings (Edit > Project Settings > Quality), use Add All Cameras to specify whether Unity should calculate Mip Map Streaming for all Cameras in the Project. This is enabled by default.
为了更精细地控制哪些摄像机处于活动状态,请在与 Camera 组件相同的游戏对象上使用 Streaming Controller 组件。这会直接从 Camera 组件获取位置和摄像机设置(如 __Field of View__)。
如果禁用了摄像机,除非启用 Streaming Controller 并处于预加载状态,否则 Unity 不会为摄像机计算 Mipmap 串流。启用了 Streaming Controller 或关联的摄像机时,或者如果 Streaming Controller 处于预加载状态,则 Unity 将为此摄像机计算 Mipmap 串流。如果禁用了 Streaming Controller,则 Unity 将不会为此摄像机计算 Mipmap 串流。
Streaming Controller 组件包含 Mip Map Bias 设置。要通过 API 来控制此设置,请使用 StreamingController.streamingMipmapBias。
使用此设置可以强制 Unity 加载比 Mipmap 串流系统为这些纹理选择的更高或更低的 Mipmap 级别。使用数字字段来设置 Unity 应用于 Mipmap 级别的偏移。Unity 可将此偏移添加到在此摄像机中可见的所有纹理。
从一个位置切换到另一个位置时,Mipmap 串流系统需要一定的时间将所需纹理串流到 Unity。要在某个禁用的目标摄像机位置触发预加载,请在目标摄像机的 Streaming Controller 组件上调用 StreamingController.SetPreloading。可指定一个超时来结束预加载阶段。要在预加载阶段结束时自动启用摄像机,请在脚本中将 activateCameraOnTimeout
标志设置为 true。要在从某个摄像机切换到新摄像机之后禁用此摄像机,请以 disableCameraCuttingFrom
参数传递该摄像机。
void StreamingController.SetPreloading(float timeoutSeconds=0.0f, bool activateCameraOnTimeout=false, Camera disableCameraCuttingFrom=null)
要取消或查询预加载状态,请使用下列方法:
要确定 Mipmap 串流系统是否仍在加载纹理,可以查询以下属性:
请注意,启用摄像机与这些属性变为非零值之间存在延迟。这种延迟是因为 Mipmap 串流系统使用时间切片处理技术来计算 Mipmap。鉴于此原因,在摄像机切换镜头时,应该在切换镜头之前等待一个最短时间。纹理预算和场景移动会导致连续的 Mipmap 串流,所以还需要设置在切换镜头之前的最长等待时间。
要覆盖特定纹理的 Mip 级别计算,请使用 Texture2D.requestedMipmapLevel。这是一个精确的 Mip 级别,范围从 0 到特定纹理的最高 Mip 级别或者是 Max Level Reduction 值(如果该值更大)。0 表示最高分辨率的 Mip。
要检查您请求的 Mip 级别是否已加载,请使用 Texture2D.IsRequestedMipmapLevelLoaded。
如果不再希望覆盖所请求的 Mip 级别,而是希望系统继续计算 Mipmap 级别,请使用 Texture2D.ClearRequestedMipmapLevel 来重置值。
要估算网格上的 UV 密度,请使用以下代码行:
float Mesh.GetUVDistributionMetric(int uvSetIndex)
可以使用 UV 分布指标根据摄像机的位置来计算所需的 Mipmap 级别。请参阅 Mesh.GetUVDistributionMetric 以查看代码示例。
要覆盖系统并强制加载所有 Mip,请使用 Texture.streamingTextureForceLoadAll。
要获取和设置分配给某一材质的纹理,请使用:
要获取某一材质中的所有纹理属性,请使用:
要获取可用于创建调试可视化的材质属性中每个纹理串流信息,请使用 Texture.SetStreamingTextureMaterialDebugProperties。
以下纹理属性也可用于为项目开发 Mipmap 串流性能分析/调试工具。
要获取与 Mipmap 串流系统交互的纹理或渲染器的数量信息,请使用以下属性:
要获取有关纹理的 Mipmap 级别的信息,请使用以下属性:
You can use the Mip Map Streaming system to stream lightmaps. You can edit the Texture settings directly, but they reset to their default values when Unity regenerates 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.
默认情况下,在运行模式下会启用 Mipmap 串流。但是,在运行模式下运行时,Editor 开销会导致统计信息出现偏差。要获取精确数字,请在目标设备上测试应用程序。
如果在运行模式下启用了 Mipmap 串流,但在编辑模式下未启用(或者是相反的情况),则切换到运行模式和从运行模式退出时所花费的时间会稍长一些。要在运行模式下禁用 Mipmap 串流,请选择 Editor 设置 (Edit > Project Settings > Editor),导航到 Streaming Settings__,并禁用 Enabled Texture Streaming in Play Mode__。这会阻止 Unity 卸载和重新加载 Mipmap 数据,并且应该会加快运行模式工作流程。