cocos-engine
cocos-engine copied to clipboard
希望能提供一个更高效的 `节点批量排序` 的方法.
Use Case
目前 cocos 中 如果要实现 node的排序 要基于 setSiblingIndex() 方法. 这个方法 每次交换 节点 都要 执行很多复杂的操作. 偶尔改变一两个节点的顺序 还能接受. 但是如果要大批量大范围的改动 就很低效率.
public setSiblingIndex (index: number): void {
if (!this._parent) {
return;
}
if (this._parent._objFlags & Deactivating) {
errorID(3821);
return;
}
const siblings = this._parent._children;
index = index !== -1 ? index : siblings.length - 1;
const oldIndex = siblings.indexOf(this);
if (index !== oldIndex) {
siblings.splice(oldIndex, 1);
if (index < siblings.length) {
siblings.splice(index, 0, this);
} else {
siblings.push(this);
}
this._parent._updateSiblingIndex();
if (this._onSiblingIndexChanged) {
this._onSiblingIndexChanged(index);
}
this._eventProcessor.onUpdatingSiblingIndex();
}
}
改变任何一个node的顺序, 都会执行 splice/push, _updateSiblingIndex, _onSiblingIndexChanged, onUpdatingSiblingIndex.
但是当批量排序时, 通常我们只需要 在排序后, 统一执行一次这些方法.
逻辑可能是这样的:
- 批量修改所有节点的 _siblingIndex 值 , 但是不会调用 前面提到的那些方法
- 执行
node.children.sort((a, b) => a._siblingIndex- b._siblingIndex)对所有children 进行一次性批量排序. - 排序后再调用一些 排序后的 后置方法和事件.
按照上述逻辑来实现批量排序 性能会更好. 希望官方能够提供类似方法.
Problem Description
如上所述
Proposed Solution
No response
How it works
No response
Alternatives Considered
无
Additional Information
No response