你好,目前建议使用 setSiblingIndex
来调整节点树的顺序。
这个 setSiblingIndex 真心不好用。尤其是大世界地图。官方还是要引起重视啊
如果彻底取消 priority 而没有替代接口,那我宁愿不升级
今天又遇到了这个问题,3.3 升级到 3.6.1,priority 原生失效了,只剩下 setSiblingIndex ,真的是ex,没有替换的接口就直接让之前的接口失效,不要说 setSiblingIndex 是替换接口,功能完全不一致,还要自己写额外的逻辑去使用 setSiblingIndex
原生确实失效了 。有解决方案吗?
我直接这样搞,每次都是负优化
去掉 cc,为了剔除代码(现在还没有这个功能)
删除 zIndex 却把替代 priority 接口标注为废弃,然后让你用比 priority 更难用且功能完全不一致的 setSiblingIndex 接口,真的搞不懂设计接口的人
cc.Node.prototype['__priority'] = 0;
Object.defineProperty(cc.UITransform.prototype, 'priority', {
get: function (this: cc.UITransform) {
return this.node['__priority'];
},
set: function (this: cc.UITransform, valueN_: number) {
if (!this.isValid) {
return;
}
this.node['__priority'] = valueN_;
if (!this.node.parent) {
return;
}
let priorityAs = [...this.node.parent.children].sort((va, vb) => va['__priority'] - vb['__priority']);
priorityAs.forEach((v, kN) => {
v.setSiblingIndex(kN);
});
}
});
好的。谢谢。我试试看
Mark!!
index不是常用接口,统一优化了也没啥影响
这只是你不常用而已,你可以去投个票,两个接口只能存在一个的情况下,看看多少人支持zIndex,又有多少人支持 setSiblingIndex
官方这样设计,应该是有特殊优化
是的,特殊负优化
应该是在使用这个函数的时候有特殊处理以提高运算和渲染效率
很可能是借鉴了其他引擎的内核
我的节点排序使用的是自己的排序,用的timsort
2dx性能比creator高,为什么这么多人用creator?按照你这想法,全用2dx去算了
引擎取消zIndex,是因为zIndex导致频繁sort排序。
出个无排序的简单方案:
setZIndex(node: Node, zIndex: number) {
(node as any).zIndex = zIndex;
let bFindMe = false;
const parent = node.parent;
if (!parent) return;
const children = node.parent.children;
for (let i = children.length - 1; i >= 0; --i) {
const child = children[i];
if (node == child) {
bFindMe = true;
} else {
const chIndex = (child as any).zIndex || 0;
if (zIndex >= chIndex) {
node.setSiblingIndex(bFindMe ? i + 1 : i);
break;
}
}
}
}
去掉了zIndex,要用它的人还不是要自己实现一个可能比之前原本zIndex性能更低的接口,不用的人自然也不用,所以为什么要去掉呢?如果仅仅是为了这个接口性能低给去掉,那么引擎直接一大堆的接口直接没了
我只能说不做游戏的人做引擎,就如同下面这张图
setSiblingIndex是子节点排序,这个和zindex这个统一节点排序已经不是一个功能了。针对子节点排序,还可以在渲染层面进行优化。如果要把zindex改为setSiblingIndex,需要获取节点序列,反向解序列就比较麻烦了。但是重新开发会更加方便快捷