反馈一个zindex api不够完善的信息

在creator里,zindex 更改后,将调用updateorder,如下
zIndex: {
get () {
return this._localZOrder;
},
set (value) {
if (this._localZOrder !== value) {
this._localZOrder = value;
this._sgNode.zIndex = value;

                if (this._parent) {
                    updateOrder(this);
                }
            }
        }
    },

这样在场景中node不多的情况下,子node更改zindex 刷新 parent sortallchild性能不存在什么问题

但如果场景中node很多(比如我有1000),这时候更改一次子节点将刷新所有父节点的child,很明显极为吃性能

比如一款2.5D策略游戏,场景中一百个建筑,有移动的小兵建筑中来回穿梭,这就牵扯到Z轴的持续刷新问题,如果用现有api来做极为吃性能,实现的方式如下

  1. update持续刷新Z轴(最笨的办法)
    2.1的基础上判定有移动的元素,为移动的元素持续刷新Z轴 (笨-1)
    3.2的基础上判断移动的元素走过了一个格子,则刷新一次Z轴 (笨 -2)

4.最好的方案,每1/2秒刷新一次parent的所有节点,更改子节点的Z轴不使用zindex。可以使用_localZOrder来存,到时统一刷新

比如我这样的写法
子child中的update方法持续刷新子节点的Z轴,不使用 child.zindex = 新的Z ;而是使用 child. _localZOrder = 新Z

主update中每1/2秒手动调用
if(self.all_Update_Refresh_Per > gameData.REFRESH_Z_PER){
//gameData.REFRESH_Z_PER =15 帧数设30的情况下
self.all_Update_Refresh_Per=0;
let nodeutil = cc.ll.nodeUtil; //所有的场景元素的父节点
if(!nodeutil._reorderChildDirty){
nodeutil._reorderChildDirty = true;
}
nodeutil.sortAllChildren();
}
else self.all_Update_Refresh_Per++;

但现在问题来了,发现nodeutil.sortAllChildren 并未刷新元素的Z轴,zindex 倒是变了,效果上并没有表现,想恳请官方给解答一下,我这样的业务需求该怎么手动调用sort

1赞

我觉得现有api如果去做任何多场景元素并需持续排列Z轴的游戏,都极难解决 更新子节点Z轴一次就sort整个父节点

咚咚咚!有人吗?GM我要充游戏币!有人吗?

_DelaySortAllChild(){
var _children = this._children;
for (let i = 0;i<_children.length;i++){
let child = _children[i]
if(child._sgNode.zIndex != child._localZOrder){
child._sgNode.zIndex = child._localZOrder
}
}
this._delaySort();
},

自己写了个方法,效果是达到了,大神帮看看这样写科学吗

这个帖子解决了,因为2.3版本自带了zindex优化,性能表现已经无问题

2.3如何优化的? 我改引擎用链表来实现的. 我觉得splice性能都不行, 一个节点下8000个道具, splice 1.5ms,

2.3的帖子说明里有这样的一个修改。优化设置 zIndex 时性能消耗 #589922

其实这个优化在2.2.1的时候就有过这个优化,估计之后又做了完善。

这个修改我记得当时的原理是,之前的zindex 会重复的刷新元素,导致性能下降很大,后来改了帧批量处理,就表现不错了。

我当时大约是3000-4000个node的zindex排序