频繁的赋值spriteframe有什么方法优化吗?

目前我们在做一个功能:第三方插件绘制图像到canvas,然后通过canvas生成Texture2D给creator里面的sprite用。但效率很低,pc上都只有2 30帧。有什么优化的方法吗?
代码大概是下面这个样子。

onDecodeRender:funtion()  \\每秒执行30次左右 
 {
    var texture=new cc.Texture2D();
    texture.initWithElement(this._canvas);
    texture.handleLoadedTexture();
    this._ui.spriteFrame.setTexture(texture);
 },

掌声有请三位大神。。。@nantas @jare @panda

1赞

人工置顶asdf

我也试了下 发现必须得new Texture2D() releaseTexture 方法无效 texture没法重用 请大神看看

这操作每次都会把 this._canvas 的内容上传到 GPU,gl.texImage2D 操作损耗是很高的,所以问题是,你是不是每秒 30 次都会去改变 this._canvas 的内容呢?this._canvas 的内容到底是什么?变化的频率有多高?变化是不是在有限的范围内(比如有限的几个贴图)。

是视频流 绘制到另外的canvas 绘制完之后从canvas取出来渲染到精灵上

视频流就肯定要不停地修改贴图了,不过理论上不需要重新创建 texture2d 对象,可以把你的代码发出来看看

每次都不同 有没有好的方法

就是楼主这段代码

texture.releaseTexture();
texture.initWithElement(this._canvas);
texture.handleLoadedTexture();

这样直接使用 initWithElement 和 handleLoadedTexture 应该是可以更新贴图的

昨天写的测试是这样的 renderSprite 换成
this.texture.releaseTexture();
this.texture.initWithElement(this._canvas);
this.texture.handleLoadedTexture(); 如果只执行一次renderSprite 是绿的 如果执行多次 就边黑了 说明texture里面有脏数据 并没有清理干净 如果每次重新new 就没有问题

是这样吗?貌似不行,给警告。

texture.releaseTexture();
cc.gl.bindTexture2D(null);
texture.initWithElement(this._canvas);
texture.handleLoadedTexture();

用这个试试看

可以了,能解释一下为什么要加第二句那个代码吗?

清空 GLStateCache 中的缓存状态。

不过这样依然无法避免每次重新上传贴图到 GPU,所以效率如果仍然无法接受,可能要看看你的贴图尺寸是不是过大

好像又出状况了,在不支持webgl,只能用canvas绘制的时候会报这个错误

如何解决呢?

这一句报的错:
cc.gl.bindTexture2D(null);

可能是这句话执行的时候 gl context 还没准备好,可以这样保护一下

if (cc._renderContext) {
    cc.gl.bindTexture2D(null);
}

还是不行哦。在canvas模式下,依然报错。我目前的做法是判断是不是在webgl下,如果不是就不执行这条语句,而且要关闭脏矩形优化才能正常显示,不然黑屏

哦哦,canvas 模式下肯定不行

你好 我这边用视频流绘制 用panda的方法黑屏 然后试了用New texture2d还是黑屏 有什么办法么?@panda