
普通模式下的GFX Texture Mem和GFX Buffer Mem的大小

高性能模式下的GFX Texture Mem和GFX Buffer Mem的大小
资源纹理使用的是astc压缩纹理,两个模式下纹理占用内存基本相同,但是GFX Buffer在高性能模式下会出现一个很奇怪的异常增长,即使销毁场景,基本上也没怎么回收。请问是什么原因导致的吗?

普通模式下的GFX Texture Mem和GFX Buffer Mem的大小

高性能模式下的GFX Texture Mem和GFX Buffer Mem的大小
资源纹理使用的是astc压缩纹理,两个模式下纹理占用内存基本相同,但是GFX Buffer在高性能模式下会出现一个很奇怪的异常增长,即使销毁场景,基本上也没怎么回收。请问是什么原因导致的吗?
测试发现在iOS14-iOS15.3之间的设备会有这样的情况,mesh-buffer.ts中sys.__isWebIOS14OrIPadOS14Env 会把相同的IA,放到不同buffer中,那么用完后为什么感觉没有释放到呢?
你好,引擎组同事已经在处理此问题,预计在引擎 3.7.2 版本修复。
有相应的pr吗?
目前还没有 pr 提交
麻烦有相应pr时,请告知一下。因为我们的项目开了高性能模式,在iOS14-iOS15.3很容易提示运存不足,iOS15.4以上的设置基本上没有出现过运存不足的情况。我们项目的资源用了astc压缩,整体游戏运行时纹理占用的内存大概在80-90M左右,算上脚本引擎之类的内存占用是远远达不到1G内存这个上限。但是iOS14-iOS15.3之间的设备GFX Buffer Mem很容易就达到300多400M这样的占用,iOS15.4以上的系统GFX Buffer Mem的占用会少很多,只有几十M左右。
Android 遇到同样的问题。同一套代码 ,web模拟器就没有异常增大, 有增有减。 请问 代码上需要注意什么问题 ? destroy 有调用的。 资源都是通过 bundule 获取,预制体也是用 pool 保存的,使用了大量的spine。
你好,请问下游戏中能否观察到 DrawCall 增高之后 GFX Buffer Mem 也增高但是 DrawCall 降低后,GFX Buffer Mem 没有降低的情况吗?
DrawCall降低后,GFX Buffer Mem会有降低,但是会有残留。例如打开一个简单界面(里面包含了ScrollView和Mask控件等),DC会增加,GFX Buffer Mem也会相应增大,关闭界面时,GFX Buffer Mem会回落,但是还有大概0.05M左右释放不了,只要不断打开、关闭界面GFX Buffer Mem就会一直增长下去
再看了一下游戏中的一些其他界面,发现DC降低后,GFX Buffer Mem没有降低的情况
环境 : 3.7.1 Android windowsX64 .
前提: 资源都是从bundle里面获取的, 预制体也通过 pool回收。
1.我特意处理过 drawcall 的数量,之前也是怀疑drawCall的问题。后来发现 drawcall有增有减,GFX buffer mem 却没有任何的 减少 ,持续的加。 切换Scene之后,才会减少。
由于iOS在14版本中存在的多个DrawCall共享 buffer 会存在的性能问题,所以我们特殊处理了这个问题,使得在 iOS14 浏览器上每个 DrawCall 都使用自己独有的 buffer。微信的高性能模式同样存在这种处理。这样虽然解决了性能问题,但带来了 buffer 的增多,引起了内存的变大。
我们在此 PR (https://github.com/cocos/cocos-engine/pull/14436)中做出了对 bufferPool 的回收操作,这会在 DrawCall 没有那么高的时候内存会降低。
另外,由于我们提供了 BATCHER2D_MEM_INCREMENT 参数来使用户可以自己定制每个 DrawCall 可容纳的顶点数,用户可以根据自己的需求来调整这个值的大小,在这个问题的情况下,由于每个 DrawCall 都会占用一个 BATCHER2D_MEM_INCREMENT 大小的内存,可以考虑在项目中使用这个标签 __isWebIOS14OrIPadOS14Env 来调整 BATCHER2D_MEM_INCREMENT 大小,以避免不必要的内存浪费。
这个问题和楼主反馈的应该不是同一个问题,可以描述下你的游戏场景吗?是 3d 对象多还是 2d 对象为主?如果是切换场景之后减少的话有可能是资源本身占用的?顶点数和此值变化存在规律吗?
环境: 3.7.1 windows Android 都存在这个现象。2D 游戏。
进入场景的时候:
;大概玩了 两三分钟之后:
; GFX Texture Mem 到了一定的值之后就不会增加,但是 GFX Buffer Mem 一直加没减少过。
环境: 3.7.1 windows Android 都存在这个现象。2D 游戏
1.发现问题: 一个装有spine的预制体。 加载了,在界面上显示之后, 放回 NodePool 里面。 此时的 GFX Buffer Mem 没有减少。
2.单纯的 instantiate 这个预制体 N 个,并且放到 NodePool 里面 GFX Buffer Mem 是没有任何增加的。
3.请问:使用 NodePool存储临时对象是合理的思路,是不是设计上 GFX Buffer Mem 此时并不会释放任何东西?
是的,放置到 NodePool 中的对象并没有销毁,是不会释放内存的,你可以自己尝试减小池子的数量,或者安排一个池子中闲置对象的统一销毁时机应该会有效。
能不能解析一下这个问题:
单纯的把预制体放入 NodePool 里面, GFX Buffer Mem 是没有任何增加的。
由于 GFX 资源是在需要渲染时才进行分配的,如果没有渲染,只是实例化了节点出来,那是不会创建 GFX Buffer 的