Creator 版本:3.8.4
平台:PC
100个技能动画.anim文件对应100个文件夹,每个文件夹有大概50张图片(序列帧图片), 我就想知道 一共不到500MB的图片(平均每个技能由50张图构成占总容量2-6MB左右,素材我已经进行过压缩了,png透明图,大约一张图20-200kb左右),为啥用resources.load()加载了大概2-3分钟,并且占用了将近30个GB的内存? 这是不是也太不正常了? 还有resource.load()不是异步加载么? 为啥阻塞主线程,导致非常卡?? 哪个大神帮忙解决下,非常感谢
电脑配置:i7-12700 ,显卡rtx4080s, 内存48GB
先说明一下:占用内存(显存)不是看图片大小,而是看图片面积。一个1024*1024的图片,是占用1024 * 1024 * 4 B = 4MB 的内存(显存)大小,你可以自己计算一下整体大小。
不过我感觉你代码有问题,因为在pc上,这部分是先加载到显存,而内存暴涨很可能是你另外的代码问题,有大量的内存泄漏导致的。
用spine,图片再怎么压缩,宽高摆在那边
你用network看下加载了哪些资源啊
我认为内存超过3个G 就已经无法理解了,普通手机崩溃是家常便饭,小游戏想都不用想,先找自己代码的问题吧
试试压缩纹理,会小很多,内存是看像素尺寸,和文件大小无关
我都怀疑你是不是多算了3个0。
你可能对异步理解有点问题, 首先resource.load异步是体现在js在io处理上, 即下载这个过程, 然后下载完anim文件还要解析成cc使用的格式(类似json parse), 这个是同步的, 你一口气100个文件处理同步逻辑有卡顿不是很正常麻
因为在pc上,这部分是先加载到显存,而内存暴涨很可能是你另外的代码问题,有大量的内存泄漏导致的
不一定, cc使用了createImageBitmap来做texture的, 但浏览器会根据绘制状况来决定这个ImageBitmap是存于在显存还是内存, 有可能ta加载了, 但还未渲染使用, 被放到内存里了
首先你要搞明白 图片到内存上的展开面积是怎么算的.
其次, 很少见到有这么多的序列帧做特效. 建议
1:必须用序列帧的话,考虑抽帧,缩放大小,把一个特效的图打到一个图集里.每个个技能控制在1024*1024内.
2:如果不是大面积大数量出现的效果,建议用spine.因为spine可以复用一些美术资源.
3:如果确实需要100个特效, 那么建议用之前预加载, 用完后立即释放.千万别一把load进来.
确实 我也考虑用图集了,牺牲下质量换速度, 1600*900确实是大面积的全屏特效,小技能还有100个没放在里面,不过你说的很对,我确实也是想预加载,但是preload没啥效果,等到技能释放的时候用resources.load()导致加载技能时候人物动作卡顿,所以才想在游戏一开始读个进度条全部把技能放到对象池里,用的时候直接拿,结果跑到了30Gb
好的 感谢指正 确实问题出在解析上,图片太多了 解析导致主进程被阻断了,导致了卡顿
对 确实如你说的,我有循环引用问题,这个循环引用问题你们都怎么解决的? 用单例么? 有没有其他解决办法? 比如 A节点组件调用B节点组件属性, B节点组件调用A节点组件属性?
疯了啊!1600*900的超大序列帧, 我记得这样可能会引起机器发烫的
啊啊啊 全屏特效也不能这么搞, 尺寸太大了,建议你换种实现方式吧
考虑用spine 或者 用可复用的碎资源自己拼
猜测是美术不是专门做动画的,把动画都彻底做成序列帧了,说是转spine或者用碎资源拼接当然是办法了,但最重要的还是加钱找个专门做动画的吧,纯自己搞效果很难达到预期的
好奇是什么特效了,方便发个动态图出来看看吗
设计有问题,不妨看看我的rpg游戏
