在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来做极为吃性能,实现的方式如下
- 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