cocos-engine icon indicating copy to clipboard operation
cocos-engine copied to clipboard

希望能提供一个更高效的 `节点批量排序` 的方法.

Open finscn opened this issue 1 year ago • 2 comments

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

finscn avatar Sep 17 '24 06:09 finscn