2d游戏做的不多,请教一下排序问题

先不考虑长条形斜侧视角墙面。
是否需要每个排序节点每帧都需要做一下setSiblingIndex?

这段代码放在排序管理器的update里面,傻傻的运行着。效果没问题,排序都对。只能这么做么?
超过一两千,电脑上都开始不能满60了。看上去是逻辑延迟,就是这的原因了。

    private orderInDynamicGroup() {
        for (let i = 0; i < this.node.children.length; i++) {
            let groupNode = this.node.children[i];
            if (groupNode.name.startsWith('dynamic')) {
                let units = groupNode.getComponentsInChildren(OrderUnit);
                units.sort((a, b) => {

                        return -a.node.position.y + b.node.position.y;
                    
                });
                for (let j = 0; j < units.length; j++) {
                    units[j].node.setSiblingIndex(j);
                }
            }
        }
    }

虽然根据游戏中的墙面将地图分成了多个区域,排序物体需要先进区域排序组,然后每个区域里面运行上面的排序,虽然减轻了一些排序基数,而且解决了墙面的遮挡问题,但也是挺慢的。

我找到商店里面有个2d排序的,它的里面是否也需要不断的进行类似的运算?

子组件向排序系统注册自己和移除自己,不要每帧去调用getComponent这种耗时接口,更不要调用getComponentInChildren

把这一段换个写法,用 _updateSiblingIndex;
向你说的墙面很多,那可以试试插入排序,效率可能会提高;
不需要每帧都跑,可以看情况间隔1到n帧跑一次排序;
你不是区分了区域吗,也可以试试在第n帧运行a区域排序,n+1帧运行b区域排序,…这种思路。

我也遇到这个问题,mark。我最后直接去掉代码。 :grinning:

排序物体大部分静止所以是需要排序时才排序,如果有动态穿插的物体,比如走动的小人,我之前是1秒排一次,瞬时的穿帮影响不大

做筛选,视角范围内才排序。
有相关物体动了之后,才排序。