纹理流送(Texture Streaming)

转载原文:《UE4-纹理流送(Texture Streaming)》 作者:什么都不懂

1.什么是纹理流送(Texture Streaming)

当你处理许多纹理时,特别是在建筑可视化项目或汽车类项目中,你可能偶尔会发现纹理有点模糊。它们没有显示所有细节,因为它们的流送(Streaming)不正确。通常你不会遇到这种情况,但如果遇到了,你就需要了解接下来的知识。

简单来说,流送就是获取纹理的所有细节层级(LOD)或多级渐进纹理(Mipmaps),然后在玩家靠近时显示最高分辨率的渐进纹理,在玩家远离时显示低分辨率版本,但仅限场景摄像机的视锥范围内。我们之前讨论过多级渐进纹理(Mipmaps),它相当于纹理的细节层级。事实上,细节层级或多级渐进纹理和纹理完全一样,只不过细节层级会稍微小一点,占用的资源更少一些。纹理流送能够在摄像机接近或者远离场景对象时,流送这些不同的细节层级。

纹理流送设有一个缓存池:一片专门用于缓存多级渐进纹理的内存区域。随着纹理不断远离摄像机,它们会变得越来越小,在纹理流送池中占用的内存也越来越少,直到不再占用任何内存。然而,当玩家越来越接近对象时,纹理在流送池中的占用空间也越来越大,因为引擎必须显式更大的多级渐进纹理。介绍这点的原因是,在建筑可视化项目或汽车类项目中,如果你使用细节程度非常高的纹理。你可能会遇到警告,提示纹理流送池可用空间不足(TEXTURE STREAMING POOL OVER……BUDGET)。

如果要增加内存池大小,你需要做的是打开UE4控制台,例如输入 r.Streaming.Poolsize=3000MB,以MB为单位,具体大小完全取决于你的项目情况和项目需求。

如果你发现所有项目级别都有这个问题,或每次打开项目后,都必须增加纹理池大小。你可以打开项目文件夹下的 “Config/DefaultEngine.ini” 文件,然后在 [/Script/Engine.RendererSettings] 下方添加 r.Streaming.PoolSize=3000MB ,这能确保该项目每次启动后,你都能获得修改后的流送池大小。

2.如何强制纹理不流送

强制纹理不流送的目的是确保始终显示最高分辨率的纹理,你不应该将项目中的所有纹理都设置成最高分辨率,这样做会严重影响性能。通常,你应该让那些靠近用户的纹理使用“永不流送”,比如 UI 元素或者是会在用户靠近时显示文本的元素。

那我们该怎么设置呢?你只需要打开纹理编辑器,在“Level Of Detail”分段下的高级选项中,勾选“Never Stream”属性即可。

如果你启用了 “Never Stream”,并且同时把 “Compression Settings” 设置为“UserInterface2D”后, 纹理只要在游戏中出现,基本上始终会以最高分辨率显示。这会让它的渲染开销变得非常大,不仅是在内存中,而且屏幕绘制开销也会变大,因为它没有压缩,所以会用到大量信息。它永远都不会使用其他渐进纹理,即便它在屏幕中只占 200 或 100 像素或在屏幕上占用 2000 像素,开销是一样的。

还有一种简单暴力的方式,直接在项目设置中关闭纹理流送功能。

你需要记住,将纹理设置为 “Never Stream”能让你获得最高质量的效果,但会影响性能。因此,你需要在项目中慎重使用“Never Streaming”。

留下评论