随着我们的项目进行过程中,可能会遇到原本精度很高的贴图,但是在场景中会变得很模糊的情况。现在就一起来了解一下unreal里面的texture streaming预算问题。
虽然警告 ‘ TEXTURE STREAMING POOL OVER ‘(后跟一个以mebibytes为单位的值)使用了可怕的红色文本并且全部用大写字母写成,但这并不需要恐慌。这是一个非常常见的警告,它只是告诉你场景中的纹理使用的内存比你为它们分配的内存多,因此引擎开始降低纹理的质量以进行补偿。
有两种有效的方法可以修复“Texture Streaming Pool Over # MiB”这种警告。第一个是通过控制台或项目的配置文件增加纹理池的大小。第二个是优化关卡/材质以保持纹理的大小。
旁注:是的,也有一些无效的方法可以清除此错误。如果你只是不想看到这个警告,在紧要关头,你可以在控制台中输入命令DisableAllScreenMessages,并且所有警告消息都不会再显示。请记住,这实际上并没有解决任何问题,下次打开编辑器时这些警告将再次出现。
要了解你收到此警告消息的原因,你需要对 Unreal 的texture streaming系统有一个基本的了解——它的作用是什么,为什么它如此重要。让我们做一个快速概览。
1、什么是texture streaming
无论你在创建什么场景,你的关卡都会有texture——如果你制作的东西偏真实,你将产生大量textures。即使你没有为每个资产都使用 4k 纹理贴图,这些纹理包含的数据量也会很快增加。任何时候都需要将大量信息保存在内存中。
这就是 Unreal 的texture streaming系统的主要作用。它结合巧妙的技术,根据需要动态加载纹理,以提高游戏性能。它还使用mipmapping的详细级别优化方法来动态增加或减少纹理的分辨率。这可确保在任何给定时间加载最少的纹理数据,而不会牺牲视觉保真度。
带有关联 mipmap 链的纹理;每次迭代都是前一次迭代的一半。texture streaming系统将根据它与相机的距离确定加载哪个 mip 级别。
使用这种技术将使你的纹理在磁盘上多占用 33% 的空间,但这意味着在任何时候加载的数据都更少。还能让你在远距离的时候贴图效果更好,如下
Streaming data(包括 mipmap 信息)是作为build all level过程的一部分预先计算的。它可以通过从 Build 菜单中选择Build Texture Streaming自行生成。
texture streaming系统主要是使你的纹理在任何距离上看起来尽可能好,并且开销最小。此外,它具有高度可定制性,可通过丰富的设置满足你项目的性能规格。
你可以通过你的Project Settings批量禁用纹理流——但我不知道你为什么想要!
你可以在“rendering”下找到此设置。
2、什么是texture streaming pool
Texture Streaming Pool是目前所有正在由流媒体系统绘制的纹理的虚拟存储容器。该值将与你安装在机器上的物理 RAM 不同(这很幸运,因为你的操作系统和其他重要服务需要其中一些),并且由几个一起运行的不同内存池组成以确保纹理可以安全地流入和流出。
你可以在编辑器中或在运行时将命令“ stat streaming ” 输入到你的控制台中,以查看texture streaming系统内存分配的细节。
你可以在 Memory Counters 部分的最右侧列中看到每个池的最大容量。默认情况下,texture streaming pool的大小设置为1000 MB。
3、解决办法
方法一:增加texture streaming pool内存分配
这是快速简便的解决方案。只需增加texture streaming pool的大小以包含纹理数据即可。当然,这仅在你的硬件(和你的目标配置)有可用内存时才可取。
查看文档最后,可以找出满足纹理要求的texture streaming pool需要多大。你可以使用以下控制台命令在编辑器中更改texture streamingpool的大小,其中#是以兆字节为单位设置的值。
r.Streaming.PoolSize #
你可以使用stat streaming命令检查你的更改是否被接受。
请记住,就像通过控制台输入的许多配置命令一样,以这种方式更改池的大小只是暂时的。每当你重新打开编辑器时,它都会重置为默认值 1000。如果你希望此更改持续存在,你需要导航到项目的DefaultEngine.ini配置文件并将r.Streaming.PoolSize=#添加到 [/Script/Engine.RendererSettings] 部分。如果它不存在,请创建它。
你会知道它在编辑器重新启动时起作用,因为输出日志中会有一行标记更改,并且你会看到它反映在你的统计流分析器中。
就是这样。问题解决了。假设你有空闲的内存。如果没有,总有……
方法二:减少纹理开销
如果不想增加池的大小以满足纹理的需求,则需要减少纹理所需的数据量。这是一种方式或另一种方式。
纹理和材质优化是一个很大的话题,我们不会在这里(也许有一天)深入探讨,但这里有一些快速提示可以帮助你减少纹理开销。
通过纹理设置中的Maximum Texture Size值降低纹理的分辨率。
美术师以高达预期分辨率的四倍来创作纹理是非常常见的。
在细节面板中查看纹理贴图,并尝试将其分辨率降低一半(如果可以,再降低一半)。你可能会惊讶于如此显着的性能提升所损失的质量如此之少。
记住要保持这个值的 2 次方。为0的时候表示大小没有上限,Unreal 将匹配源文件的分辨率。
检查压缩设置
你需要根据具体情况做出决定,因为你的纹理压缩设置在很大程度上取决于每个特定纹理的使用方式。详细了解每个压缩设置的作用超出了本文的范围——但你可以查看官方文档。
减少或重复使用纹理通道。请记住,你将使用的大多数纹理都具有 3 个通道(4 个带有 Alpha),并且你可能不会使用所有这些通道来获得完整效果。尽可能使用纹理打包将多个蒙版合并为一个。
如果使用静态光照,那么你的光照贴图可能会占用大量可用的纹理内存。即使是中等大小的关卡,也可以将数百个光照贴图对象打包到几个地图集中。在可能的情况下,将光照贴图分辨率保持在适当的最小值以减少这种影响。
4、解texture streaming pool需要多大
这里有一个快速方法,用于计算你的texture streaming池包含关卡纹理数据所需的最小大小(以 MB 为单位)。
如果你将r.Streaming.PoolSize 1输入到你的控制台中,你会将texture streaming pool设置为 1 MB,并且你的所有纹理将立即消失——但这没关系。这只是暂时的。
你现在会注意到,当你在地图上移动时,texture streaming pool超出预算警告消息将更新,以告诉你预算超出了多少。拉近你的地图并选择最大的数字 – 该值 (+1) 是你的最小池大小。
– End –