cocos 层级渲染与管理

本文深入探讨了Cocos2d-x引擎中层级管理的特殊机制,揭示了层级调整对节点渲染顺序的影响,及如何正确处理层级设置以避免视觉效果的意外变化。

今天踩了一个坑,我在设置层级时,同一层Node中将一个Node;Node1有需求设置为了99999(原本为0),也就是显示为最高层,随后需求完成后设置为0,返还回去,发现效果没有变,最后发现cocos的层级管理有点东西,为避免后人采坑,作下文:

cococ渲染是树状结构,同级的节点层级是和同级的相比的,就像Node1.Node2.Node3.Node4.Node5,调整Node1的节点,也只会改变同层的Node层级栈

而子节点都是基于父节点的,就像我改变了Node6的层级,也只是在Node6,Node7,Node8之间做调整,不会影响到父节点的层级关系:如果Node1在第一分支中层级是最低的,那么就算Node6层级为9999,那也只是在Node1下的子节点有用,Node2等等的子节点层级也会在Node1之上

而cocos 渲染顺序是加入Node的时候没有设置层级,则层级默认为0,再往后加Node,也都是0,但是后面的Node会在top,所以我在设置回0的时候,cocos是默认放在同层的层级都为0的最后的,也就是在top。可以看成一个层级栈,此时我设置任一同一层级的Node为1,那么这个Node在同一层级中是top

<think>我们正在讨论CocosCreator的渲染流程和机制。根据之前的引用,我们知道节点是CocosCreator中所有可视化对象的基础,节点可以包含多个组件,如渲染组件、相机组件等。节点之间形成层级关系,构成游戏场景。CocosCreator的渲染流程大致如下:1.**场景遍历**:引擎从场景根节点开始,按照节点树进行遍历(通常是深度优先遍历),收集所有需要渲染的节点。每个节点上的渲染组件(如Sprite、Label等)会提供渲染数据(如顶点、纹理等)。2.**渲染排序**:收集到的渲染数据会根据一定的规则进行排序。排序规则包括:-节点的渲染层级(Layer)-节点的Z深度(用于2D的ZIndex或3D的Z值)-材质(Material)的渲染队列(RenderQueue)排序的目的是为了减少渲染状态切换,提高渲染效率。3.**渲染批次合并(Batch)**:为了减少DrawCall,引擎会尝试将使用相同材质和纹理的多个渲染数据合并成一个批次(Batch)。这样,原本需要多次DrawCall的渲染就可以通过一次DrawCall完成。4.**相机裁剪**:每个相机(Camera)会根据其可见性(Visibility)设置和视口(Viewport)设置,对渲染节点进行裁剪。只有位于相机视口内且可见层级(Layer)相机Visibility匹配的节点才会被渲染。5.**渲染命令提交**:经过排序和批次合并后的渲染数据,会被转换成渲染命令(RenderCommand),并提交到渲染队列中。渲染队列根据相机的优先级(Priority)进行排序,优先级高的相机先渲染。6.**执行渲染**:渲染引擎(如WebGL、OpenGLES)执行渲染命令,将图像绘制到帧缓冲区(FrameBuffer)上。如果是多个相机,可能会渲染到多个渲染纹理(RenderTexture)上,然后通过后期处理(如合成)输出到屏幕。在整个流程中,CocosCreator使用了一种基于组件的架构。每个节点可以挂载多个组件,其中渲染组件(如Sprite、Label、ParticleSystem等)负责提供渲染数据。相机组件(Camera)控制渲染的视角和视口。关于性能优化,我们可以注意以下几点:-合理使用节点层级,避免过深的节点树。-尽量使用相同的材质和纹理,以促进批次合并。-使用动态合图(DynamicAtlas)将多个小纹理合并成大纹理,从而增加批次合并的机会。-合理设置节点的ZIndex和Layer,以便正确排序和裁剪。下面我们根据引用内容补充一些细节:-引用[2]提到相机组件的Priority和Visibility:Priority决定相机的渲染顺序,Visibility决定相机可以看到哪些层级的节点。-引用[3]提到动画帧率:虽然渲染流程没有直接关系,但动画的更新也会影响渲染的内容。通常动画的更新是在渲染前进行的。以上是CocosCreator渲染流程的基本介绍。如果需要更深入的细节,可以参考官方文档或相关源码。§§相关问题§§1.CocosCreator中如何优化渲染性能?2.相机组件在渲染流程中具体起到什么作用?3.什么是渲染批次合并?它是如何减少DrawCall的?4.动态合图(DynamicAtlas)是什么?它是如何工作的?</think>### Cocos Creator 渲染流程详解 Cocos Creator 的渲染流程是基于**节点-组件**架构实现的,核心流程如下: #### 1. **场景遍历渲染数据收集** - 引擎从场景根节点开始深度优先遍历节点树 - 收集所有包含**渲染组件**的节点(如 `Sprite`、`Label`、`MeshRenderer`) - 每个渲染组件提供顶点数据、纹理、材质等信息 - *引用[1]:节点是可视化对象的基础,通过层级关系构成场景结构*[^1] #### 2. **渲染排序批次合并** ```mermaid graph LR A[渲染数据] --> B[按层级排序] B --> C[按Z深度排序] C --> D[按材质ID排序] D --> E[批次合并] ``` - **排序规则**: 1. 节点层级(Layer)优先级 2. Z轴深度(2D为ZIndex,3D为WorldZ) 3. 材质/纹理ID - **批次合并**:相同材质/纹理的渲染
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值