3.6版本,微信高性能模式下GFX Buffer Mem增长异常大

你好,引擎组同事已经在处理此问题,预计在引擎 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 游戏。
进入场景的时候:image ;大概玩了 两三分钟之后:image ; 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 的

我问个问题,在原生里我一直请求网络图片,gfx texutre mem会一直增长,整体内存也一直增长,但是一段时间不请求数据后,gfx texture mem会慢慢降低【我们自己没有进行纹理和image销毁】,但是整体内存几乎没用什么变化。
问题:
1、gfx texture mem是cocos所有纹理内存值吗?为毛值会降回去呢?
2、gfx texture mem降了,但是整体没降,是什么导致的增长呢?看原生内存工具,是一个叫Native的数据涨的,但是也不太清楚具体是什么数据。

原来如此,怪不得裁剪了要显示了才涨