[LayaNative 2.0]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、有相关经验的伙伴可以补充和指出问题。
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、有相关经验的伙伴可以补充和指出问题。
没有找到相关结果
已邀请:
要回复问题请先登录
0 个回复