希望为node添加一个属性, 用来高性能的实现"不渲染当前node及其子节点" 的功能

希望为node添加一个属性, 用来高性能的实现"不渲染当前node及其子节点" 的功能.

之前在 github 上提过这个需求, 但是被 close了.
还是你在论坛发一下吧.
希望大家能来讨论讨论. 这个需求到底有没有必要.

注意 , 在这个需求里, 高性能 是很重要的一个目标, 因为会存在频繁的操作.
举个例子: 在城建类2D模拟经营游戏(比如模拟城市) 里, 地图上有很多建筑, 玩家滚动地图时, 地图之外的建筑物不渲染, 但是建筑物节点上可能会挂载一些负责建筑物工作的组件, 他们还要运转.
地图上有熙熙攘攘的人群 , 他们走出地图时, 不渲染, 但是人物身上挂接的组件还是要运转(因为人物通常有工作要执行)

需求:
希望通过添加一个属性来实现 不渲染 以及不深度遍历某个节点和它的子节点.
但是上面的 组件正常运转 (所以 node.active 无法满足需求, 而且它会深度遍历所有节点和组件).

目前 设置node.Layer = 0 能实现类似功能, 但是比较低效, 因为要深度遍历所有子节点 来改变 所有子节点的Layer.
而且如果子节点的 Layer 不一样, 还要备份之前的值, 用来还原. (而且 Layer 好像不能避免 walk() ???)

希望能提供一个更纯粹的属性来控制渲染.
比如 node.renderable , 那么在2D场景下 可以在 walk 时进行如下判断.

public walk (node: Node, level = 0): void {
        if (!node.activeInHierarchy || !node.renderable2D) {
            return;
        }
        // .....
}

当然 其实有时候也希望3D场景预备这个能力.

我在目前的真实项目里, 通过简单粗暴的直接设置 activeInHierarchy = false 来实现了类似需求.
但是这个显然并不好, 因为 这不是 activeInHierarchy 属性本来的作用. 而且不排除某些场景下会引起 activeInHierarchy 的错乱.
所以希望有一个单独的属性来实现这个功能. (不渲染 不执行walk(), cocos的walk性能太低了)
如果觉得用 renderable 这个名字不好 可以用一个其他的名字.

.

1赞

我觉得这个属性的作用更像是拦截了渲染操作。可能较中断渲染之类的名称比较好。renderable没有体现不去渲染子节点的意思。

可以用ecs让数据脱离cocos的component node只负责渲染 active就可以达到效果

你这个逻辑,又要高性能,又要节点遍历执行你的逻辑,本身就很矛盾,节点只负责展示渲染,逻辑自己管控就行

active 本身就会深度遍历. 我需要的其实是一个 父节点设置之后, 就忽略所有子节点的属性

其实我现在已经这样做了 . 但是即使节点只负责渲染, active/layer 的开销也是巨大的.
只要递归深度遍历 就不太行.
我需要的其实是一个 父节点设置之后, 就忽略所有子节点的属性.
以前 2.x 里的 renderFlag 能满足需求. 但是3.x去掉了.

我自己在walk里面加了一个

设置透明度0就不渲染了, 好像不会深度遍历node改东西浪费性能

但是如果这个node本身的 透明度是有意义的 就很烦, 你还要备份之前的透明度 用来还原.
改同名度 本质上和我现在 用 activeInHierarchy 类似, "能达到效果, 但是属于错误的使用属性本来的意义)

原生上,修改opacity也会深度遍历子节点,加脏标记什么的,也很浪费

这个确实不错,这样node甚至能当成数据来用,哈哈哈

你挂个组件 设置为开启xxx的时候遍历子节点 启动/关闭对应的渲染组件不就好了?

3.x的透明度为0一样渲染:joy:

你已经是个成熟的大佬了.懂得自己来加属性了.

node下再包一个 渲染节点,你对这个渲染节点 active