IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> cocos性能优化之spine动画 -> 正文阅读

[游戏开发]cocos性能优化之spine动画

最近在做一个塔防的项目,怎么说呢,炮台,子弹攻击特效加上受击特效等等等一顿代码撸下来一看dc稳定在200+,这还只是核心的游戏逻辑,如果加上ui那还得了,普通手机挂几分钟就直接挂掉,那就想只能先优化了,这个时候想到之前看过一个滑动层优化的代码,于是想着照葫芦画瓢直接把他的思想拿过来用啊,实践后发现果然可行,不得感叹大佬还是大佬。
先看看没有优化之前的dc,只有两种炮的情况下就是120了:
在这里插入图片描述
看看现在,n种炮加子弹特效加受击特效:
在这里插入图片描述
那就直接讲思路吧,首先在主场景中,挂一个节点,专门用来做渲染层的东西,比如这个项目中的炮,我就拧出来单独做一个节点存放,并挂上脚本turretRender.ts,它主要就是干两个事,
1.克隆一个需要用到的spine节点并加入到这个渲染节点下
2.不用的时候destroy掉
在这里插入图片描述
代码:

 addRenderNodeToRoot(type,name:string, node:cc.Node){
        let baseNode:cc.Node =  this._turretRoot;
        let parentNode:cc.Node = baseNode.getChildByName(name);
        if(parentNode){
            parentNode.addChild(node);
            return;
        }
        parentNode = new cc.Node;
        parentNode.name = name;
        baseNode.addChild(parentNode);
        parentNode.addChild(node);
    }

    removeSpineNodeFromRoot(node:cc.Node){
        if(node){
            node.destroy();
        }
    }

在我们加载spine的地方复制原节点,这个复制的节点就当做我们后面需要渲染的节点存在并把它加入到上面创建的turrtRender中,代码如下 :
加载spine动画的节点,加载完成后给他一个回调:

  loadSpineImg(callback: Function) {
        if (this.bulletSpine) {
            this.bulletSpine.skeletonData = null;
        }
        this.loadSpine("spine/turret/" + this.bulletData.type + "/bullet/" + this.bulletData.name, sp.SkeletonData, (error, sp: sp.SkeletonData) => {
            if (error) {
                cc.warn(error);
                return;
            }
            this.bulletSpine.skeletonData = sp;
            callback && callback();
        })
    }

加载完成spine节点后的回调里处理克隆逻辑,在这里需要注意的是,我们要把原始节点隐藏,显示的是克隆出来的节点,位置设置好,后面对原始界面的操作全部改成克隆出来的节点操作,需要注意的是,记得判断克隆的节点是否存在的情况,还有要保证位置实时更新

  this.loadSpineImg(() => {
                if (this.cloneBulletSpine) {
                    turretRender.inst.removeSpineNodeFromRoot(this.cloneBulletSpine);
                    this.cloneBulletSpine = null;
                }
                this.cloneBulletSpine = cc.instantiate(this.bulletSpine.node);
                this.cloneBulletSpine.removeAllChildren();
                this.cloneBulletSpine.active = true;
                this.bulletSpine.node.active = false;
                let name: string = this.bulletData.type+"_paodan";
                turretRender.inst.addRenderNodeToRoot(RenderNodeType.renderBulletSpine,name, this.cloneBulletSpine);
                let wPos = this.bulletSpine.node.parent.convertToWorldSpaceAR(this.bulletSpine.node.getPosition());
                let lPos = this.cloneBulletSpine.parent.convertToNodeSpaceAR(wPos);
                this.cloneBulletSpine.setPosition(lPos);
                //回调
                if (this.bulletData.Spine == 1) {
                    this.cloneBulletSpine.getComponent(sp.Skeleton).setAnimation(0, this.bulletData.animationName, this.bulletData.loop == "1");
                    this.isMoment = false;
                } else {
                    this.cloneBulletSpine.getComponent(sp.Skeleton).clearTracks();
                    this.playAni();
                }
            });

监听位置实时更新代码,要不然会出现位置偏移情况:

start() {
        this.node.on(cc.Node.EventType.POSITION_CHANGED, this.updatePos, this);
        this.bulletSpine.node.on(cc.Node.EventType.ROTATION_CHANGED, this.updatePos, this);
    }
updatePos() {
        if (this.bulletSpine && this.cloneBulletSpine) {
            let wPos = this.bulletSpine.node.parent.convertToWorldSpaceAR(this.bulletSpine.node.getPosition());
            let lPos = this.cloneBulletSpine.parent.convertToNodeSpaceAR(wPos);
            this.cloneBulletSpine.setPosition(lPos);
            this.cloneBulletSpine.angle = this.node.angle;
        }
    }

其实这样做主要的目的就是合批,如果是一个个的加上去,spine有些地方会打断合批操作,就导致合批不成功,dc就会相当高了。
----------------------------------------------------------分割线----------------------------------------------------------------------
推荐两个好用的插件:
1.查看dc的绘制情况:spector.js,自行百度怎么用吧,可以检测优化后dc绘制情况是否正确
如图,点击蓝色部分就是每次dc在绘制什么东西:在这里插入图片描述
2.ccc-devtools插件,是可以看到整个cocos的层级结构,看看某个节点在哪个节点下,在这里可以监听克隆的spine节点是否加在了turretRender节点下
在这里插入图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:43:41  更:2021-11-20 18:44:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 23:56:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码