微信小游戏 创建自定义字体的Label组件掉帧严重

  • Creator 版本:2.1.0

  • 目标平台: Android 微信小游戏 Android 7.0

  • 详细报错信息,包含调用堆栈:for循环创建 50个label组件( 回收池形式 ) 掉帧到 20

  • 重现方式:必现

  • 之前哪个版本是正常的 :

  • 手机型号 :三星S6

  • 编辑器操作系统 :window 7

  • 编辑器之前是否有其它报错 :没有

  • 出现概率:100%

// 回收池创建
createPool( key, prefab, node, spriteName , args) {
        let element = null;
        if ( !this.elementList[ key ] ) {
            this.elementList[ key ] = {};
            this.elementList[ key ].pool = new cc.NodePool(key);
            this.elementList[ key ].prefab = prefab;
            element = this.getElement( key, node, spriteName ,args);
        } else {
            element = this.getElement( key, node, spriteName ,args);
        }
        return element;
    }

getElement( key, node, scriptName ,args) {
        let element = null;
        let elementData = this.elementList[ key ];
        if ( elementData ) {
            if ( elementData.pool.size() > 0 ) {
                element = elementData.pool.get();
            } else {
                // 如果对象池总没有.就创建
                element = cc.instantiate( elementData.prefab );

                console.log(  new Date() + '创建' ,  elementData.pool.size() );
            }

            element.parent = node;

            if ( scriptName ) {
                element.getComponent( scriptName ).initPool(args);
            }
        }

        return element;
    }

onElementKilled( key, element ) {
        if ( this.elementList[ key ] ) {
            this.elementList[ key ].pool.put( element );
        }
    }

// 测试代码
createDamageLabel( attCount, isDouble ) {
        let label = NodePoolMgr().createPool( 'DamageItem', this.damage, this.bossPos, 'DamageItem', {
            isDouble,
            attCount,
            pos: { y: this.curBoss.height / 2 }
        } );
    },

// 按钮事件
onCreate() {
// 循环50个
        for ( let i = 0; i < 50; i++ ) {
       
            this.createDamageLabel( 105, i % 3 === 0 );

        }

    }

###就这样一个流程. 字体是加载的字体包.只有800KB …显示只显示 数字 和 “暴击”; 显示格式 “-100"或者"暴击:-200”;
###操作流程:
####点击按钮 帧数从60掉到 20左右,

小游戏的label性能非常之差。

建议自己做个字体,覆盖掉label本身的字体就可以解决这个问题

升级到 creator2.0.9,这个问题应该可以得到改善,如果问题依然存在,只能把ttf改成bmfont,或者等待微信的下次更新优化。

listitem内的label使用bitmap优化,第一次显示出来的文字都是一样的。

而且弹框内的label使用bitmap优化。每次弹框出来都会在dynamicatlas里生成一个新的文字,不会引用原来的,这里的文字会越来越多

文字越来越多的问题,我反馈一下。

我现在用的是 2.1.0. 问题依然存在

2.0.9 比2.1.0 新,看版本的更新时间

2.0.9之前的label,主要问题是在ttf.js _updateTexture函数非常耗时
其实文字的texture只需要创建一次就好,但是实际情况是弹窗用透明度变化的话_updateTexture就会被每帧调用 这个我是不理解的,
刚接触cocos不熟悉引擎底层,自己改太费劲就寄希望于2.0.9的更新
于是2.0.9设置char模式如果有文字描边,文字间距会扩大,某些情况文字位置会乱,具体原因还没找到

char有描边是会间距变大。
另外bitmap模式也有可能显示的文字变成一样的。