您好,我们现在开启了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的部分?
Liu.Wei
(Liu.Wei)
2
Hi,
你好,抱歉回复的比较晚。
如果没有设置PoolSizeForMeshes, Mesh和Texture是共用StreamingPoolSize,当PoolSize被占满后,就会开始StreamingOut,默认会优先保留Mesh的LOD(CVarPrioritizeMeshLODRetention)。
- 我不太明白Texture侧相应的补偿是什么意思,如果开启了PoolSizeForMeshes,StreamingPoolSize就只是Texture被占用,Mesh则只占用PoolSizeForMeshes。两者独立,不会互相影响。
- Poolsize会根据实际显存大小调整,比如AvailableVRAMForStreaming的值,你列的代码下面还有一些相关的逻辑。
- 我不太确定 你指的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?
很抱歉回复有些晚了。
我在观察stat streaming的时候发现,Wanted Mips那一行的PoolCapacity的数值事实上就是Texture+Mesh的Poolsize?
Liu.Wei
(Liu.Wei)
6
是的,stat streaming里的数据应该是统计了全部的数据(FRenderAssetStreamingMipCalcTask::UpdateStats_Async),StreamingRenderAssets应该包含了所有可以streaming的asset,包括贴图和mesh.