spine 推荐使用方式

之前使用过laya1.0的spine,最大的问题应该就是DrawCall,支持性也差,建议大家用2.0,结合我目前开发的项目大量使用spine,分享下使用中遇到的问题以及解决方案
1、常规UI特效
    1、直接 new Laya.Skeleton,然后load,不用自己手动管理Laya.Templet加载和释放
    2、移除Laya.Skeleton可以cache成通用节点,避免重复创建
    3、释放资源直接调用Laya.loader.clearTextureRes
    4、每次使用之前,先检测Templete对应的Texture资源是否释放过,如果释放过先恢复Texture的资源,避免Laya.Skeleton使用时发现资源不存在自己去恢复,会有可能重复恢复资源
导致内存泄露
    5、恢复资源逻辑可以参考Texture中的函数recoverBitmap
2、角色资源
    1、角色如果不能换肤,可以直接参考常规UI特效使用方式
    2、角色可以换肤(目前我的项目就是全部可以换肤)
        1、需要自己手动管理Templet,因为资源量远比UI特效要大,需要控制什么时候释放和加载
        2、实际使用中,有换肤的Templet如果直接按照常规UI资源恢复逻辑,会导致内存泄露,原因是内部的皮肤节点全部是单独创建的Texuture,这时候需要自己手动恢复,代码如下,手动释放和恢复
/**
    *释放纹理
    */
    __proto.destroyTexture=function(){
        if(this._mainTexture!=null){
            this._mainTexture.disposeBitmap();
        }
        this._needRecoverTexture = true;
    }
    /**
     * 恢复纹理
     */
    __proto.recoverTexture=function(){
        if(this._needRecoverTexture == true){
            this._needRecoverTexture = false; 
            for(var $each_tTexture in this.subTextureDic){
                var tTexture=this.subTextureDic[$each_tTexture];
                tTexture.bitmap = this._mainTexture.bitmap;
            }   
            for (var i=0,n=this.skinSlotDisplayDataArr.length;i < n;i++){
                var tSkinSlotDisplayData=this.skinSlotDisplayDataArr[i];
                if(tSkinSlotDisplayData.texture!=null){
                    tSkinSlotDisplayData.texture.bitmap = this._mainTexture.bitmap;
                }
            }
            
        }
    }
        3、recoverTexure这个恢复纹理的函数,需要先恢复Templete中_mainTexture纹理信息,再调用
        4、角色使用的Skeleton千万不要cache,我目前测试如果长时间运行下,如果使用cache的节点会有可能导致卡顿十分严重,如果用重新创建的节点是不会出现的,但实际最好用cache,不然运行时间长了,也会产生很多垃圾内存,对性能造成一定的影响
3、释放资源不建议用Laya.loader.clearRes,有可能下次加载失败,原因不详
4、有相关经验的伙伴可以补充和指出问题。
已邀请:

要回复问题请先

商务合作
商务合作