r.Streaming.PoolSizeForMeshes对StreamingPool是否有影响?

您好,我们现在开启了MeshStreaming,同时出现了一些LOD Pop与Texture质量的问题,所以我们准备设置专属的MeshPool来解决。但在测试的过程中观察stat streaming以及stat streamingoverview让我感到困惑:

  • 在通读论坛的帖子里,我得知MeshStreaming开启后,StreamingManager将会优先传入Mesh,并且有一个专门的RetentionCVar来控制。但是经过我的测试,在某些场景,存在如下问题 - Mesh LOD被大量Stream out时,如果此刻开启PoolSizeForMeshes并给予合适的大小,将会解决Mesh的LOD问题,但我并没有看见在Texture侧相应的补偿。不过UnkownRef Mips倒是增加了MeshLOD Resident的差值。
  • 在主机端检查Streaming Pool的大小时,总会有一个与制定PoolSzie的偏差,这部分的内存的去向是哪里?
  • 看起来在开启MeshPool后,Mesh项的PoolCapacity将不再适用,这时要参考那个数值呢?
  • 在读代码的过程我看到了这一行:

const int64 NonStreamingRenderAssetMemory = AllocatedMemory - MemoryUsed + MemoryUsedByNonTextures;

int64 AvailableMemoryForStreaming = PoolSize - NonStreamingRenderAssetMemory - MemoryMargin;

从上文看来MemoryUsedByNonTextures就是Resident的Mesh所以我们在计算可用内存的时候刨除了Mesh的部分?

Hi,

你好,抱歉回复的比较晚。

如果没有设置PoolSizeForMeshes, Mesh和Texture是共用StreamingPoolSize,当PoolSize被占满后,就会开始StreamingOut,默认会优先保留Mesh的LOD(CVarPrioritizeMeshLODRetention)。

  1. 我不太明白Texture侧相应的补偿是什么意思,如果开启了PoolSizeForMeshes,StreamingPoolSize就只是Texture被占用,Mesh则只占用PoolSizeForMeshes。两者独立,不会互相影响。
  2. Poolsize会根据实际显存大小调整,比如AvailableVRAMForStreaming的值,你列的代码下面还有一些相关的逻辑。
  3. 我不太确定 你指的PoolCapacity是什么,不过stat streaming貌似没有考虑单独列出来Mesh相关的信息。

感谢回答!

1.不好意思我的表达有些模糊,关于补偿我的意思是指这种情况:在没有开启MeshPool的时候,此时需要的TexturePool已经大于了现有的TexturePoolSize,已知Mesh的大小是一个较大但小于TexturePoolSize的数。此时如果开始足够的MeshPool,按这个逻辑,Mesh在原TexturePool所占的内存将清空并转移到MeshPool。也就是说,Texture将会拥有一个空缺来传入更多的mips。在我的尝试中没有看到明显的变化,比如Visible Mips数值 etc

2. 在我的测试中确实看到了不同平台下这个数值的变化

3.Pool Capacity是指:在下面的情况中,我们将MeshPoolSize设置为300mb,TexturePoolSize设置为600mb,但是此时Pool Capacity(表的最右列)的显示依然为Texture Pool的大小。不过你的回答大概解释我的问题,看来目前没有stat可以监控MeshPool的大小

[Image Removed]还有一个问题我可能没有表述的很清楚:举个例子

假设 TexturePoolSize 600, MeshPoolSize 300, Mesh 实际用量也是300。按照Meshpool的设想,此时TexturePool可以调动的大小就应该是~600。 但是从我列出的代码上看来,在计算可用内存时TexturePool将会减去Mesh的部分和Margin在进行计算,在我们的例子中也就是600 - 300 = 300,此时尽管我们开启了MeshPool,但是TexturePool依然按照没有开启的方式来计算可用内存为300?

  1. 这个TexturePool和MeshPool不要理解成一个专门分配出来的Pool,实际上只是用PoolSize来控制可以StreamingIn的总量,如果没有设置MeshPoolSize前,Mesh+Texture的显存占用超过了StreamingPoolSize,Texture或者Mesh就会StreamOut来进来维持总量不超过StreamingPoolSize,当专门设置了MeshPoolSize,Texture就会看是否超过了StreamingPoolSize,决定是否StreamingOut或者是否可以StreamingIn,Mesh则看是否超过了MeshPoolSize,决定StreamingIn/Out.
  2. 大部分情况下都会在DeviceProfile里针对不同设备配置。也会根据平台设置。
  3. 是的,没有针对Mesh去更新这些Stats。

很抱歉回复有些晚了。

我在观察stat streaming的时候发现,Wanted Mips那一行的PoolCapacity的数值事实上就是Texture+Mesh的Poolsize?

是的,stat streaming里的数据应该是统计了全部的数据(FRenderAssetStreamingMipCalcTask::UpdateStats_Async),StreamingRenderAssets应该包含了所有可以streaming的asset,包括贴图和mesh.