微信小游戏频繁更新spriteframe性能很低,有什么优化办法吗

BG8~%V3IR{$W3F3NE9J6WT

下次自己多看看 api

1赞

战术mark

感谢答复!我之前是阿里后端开发,对游戏十分感兴趣,目前自学了几个月了,想做个小游戏上架。
根据您的方案,我在我原有的代码上修改了下,确实对gfx texture mem的占用有明显改善,但是游戏帧率在pc端正常60,在微信小游戏端只有10。
我修改的方法如下:
texture和spriteFrame不用每次new。使用texture.updateImage()或者texture.uploadData更新texture; 然后使用sprite.markForUpdateRenderData()标记需要被渲染。
代码:
const canvas = document.createElement(‘canvas’);
const image = canvas.getContext(‘2d’).createImageData(300,300);
const texture = new Texture2D();
const spriteFrame = new SpriteFrame();

update(dt){
this.texture.image = new ImageAsset(this.hiddenImage);
this.texture.updateImage();
this.spriteFrame.texture = texture;
this.sprite.spriteFrame = spriteFrame;
this.sprite.markForUpdateRenderData();
}

结论:对内存优化了,帧率依旧没有改变

:joy:
为什么会说出之前是阿里后端开发呢,你是盼着能给你加一点光环么

对,加光环,不至于认为我是个完全不会编程的新手。
这个问题我尝试了很多方法,也尝试看了一些cocos源码,困扰了我很多天依旧没有搞定,所以想来发帖求教。

我几乎翻遍了论坛里类似的帖子,论坛里遇到这个问题的帖子不少,不过大多是2.x版本里有解决方案,解决方案是用RenderTexture。
但是3.x里的RenderTexture没有initWithData这种api,如何将imageData写进RenderTexture呢?

可以看下gfx相关函数有没作用:
cc.gfx.deviceManager.gfxDevice.copyBuffersToTexture cc.gfx.deviceManager.gfxDevice.copyTexImagesToTexture

感谢建议!
这几个方法我不太会用,这个方法需要gfx.texture参数,怎么将texture2d转换成gfx.texture传进去,能辛苦指导下嘛

大佬,阿里工作体验是怎么样的

外面的人想进来,里面的人想出去。

怎么看都应该是 tex.uploadData(canvas) 效率最高啊. 而更新 texture.image 跟 new Texture 区别不大.

我测试两者帧率差不多,而且uploadData会导致渲染的尺寸有点小问题

如果RenderTexture性能好,这里怎么将图片数据转换成RenderTexture呢。有没有官方大佬给解释下怎么处理这种需求。 :sob:

也许特定平台某个细节存在缺陷, 大家在这猜也没用. 先找准这个点, 再 workaround 吧. 正常逻辑这不像是有明显性能问题. (我们的 720p 视频每帧 uploadData 都没问题, 不过没用 Sprite & SpriteFrame, 而是自己写的 shader)

我为什么怀疑是cocos的性能问题呢?因为我做过如下尝试:
我用同样的游戏逻辑,不依赖任何引擎,在微信小游戏开发工具里写,直接用微信小游戏的Canvas渲染,是没有问题的。
也就是我上面的代码里,不用cocos的sprite来渲染,直接通过微信的canvas.drawImage,帧率可以达到60。
但是我想用cocos里其他功能,然而cocos里没法获取到微信的MainCanvas,只能创建离屏Canvas。所以被迫想了一个用sprite来渲染的方法。

gfx.Texture是RenderTexture中的接口getGFXTexture()提供的
我的意思是你使用RenderTexture时不是卡在怎么将数据传入么?
gfx的两个接口都是提交数据到纹理中,可以看下能否达到目的

用一张贴图不好么? 频繁的去new ,不卡才怪!

我试了下,renderTexture.getGFXTexture获取的是null

已解决,IOS不支持JIT导致的,Android运行良好。
使用微信小游戏的Worker可以开启实验性JIT。

你看说到头来, 就是特定平台的问题. 你非要坚持是这几行代码的问题.

不过我还是不信, 这几行代码涉及到的逻辑 JIT 不 JIT 会有这么大区别.