-
Creator 版本: 3.6.2
-
目标平台: 微信小游戏
-
重现方式:
const canvas = document.createElement(‘canvas’);
const image = canvas.getContext(‘2d’).createImageData(300,300);
update(dt){
const texture = new Texture2D();
texture.image = new ImageAsset(this.hiddenImage);
let spriteFrame = new SpriteFrame();
spriteFrame.texture = texture;
this.sprite.spriteFrame = spriteFrame;
} -
说明
我翻了论坛之前的帖子,有说用RenderTexture的,但是3.6版本的RenderTexture没有initWithElement方法。请问各位大佬,有什么好的解决办法吗,比如能否用自定义shader或者还有什么我不知道的api。
我觉得对于频繁更新的spriteFrame还是静态存储好点,你这1秒new几十次确实吃不消
我这边的核心需求就是内存里画出图片,然后渲染出来,图片可能每帧都会变化。
本来 Graphics组件应该很合适做这个事,但是这个组件没有drawImage的api。
所以我只能用sprite来做。
参考
您好,非常感谢大佬的方案!
我想再麻烦问下,我这边是update方法里生成的ImageData,怎么样将imageData转成您方案里的videoSource。

下次自己多看看 api
战术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();
}
结论:对内存优化了,帧率依旧没有改变

为什么会说出之前是阿里后端开发呢,你是盼着能给你加一点光环么
对,加光环,不至于认为我是个完全不会编程的新手。
这个问题我尝试了很多方法,也尝试看了一些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呢。有没有官方大佬给解释下怎么处理这种需求。 
也许特定平台某个细节存在缺陷, 大家在这猜也没用. 先找准这个点, 再 workaround 吧. 正常逻辑这不像是有明显性能问题. (我们的 720p 视频每帧 uploadData 都没问题, 不过没用 Sprite & SpriteFrame, 而是自己写的 shader)
我为什么怀疑是cocos的性能问题呢?因为我做过如下尝试:
我用同样的游戏逻辑,不依赖任何引擎,在微信小游戏开发工具里写,直接用微信小游戏的Canvas渲染,是没有问题的。
也就是我上面的代码里,不用cocos的sprite来渲染,直接通过微信的canvas.drawImage,帧率可以达到60。
但是我想用cocos里其他功能,然而cocos里没法获取到微信的MainCanvas,只能创建离屏Canvas。所以被迫想了一个用sprite来渲染的方法。