cocosCreator2.3.x渲染流程深入剖析笔记(三)

2023-11-15

渲染批次合并之顶点

在这里插入图片描述
根据前面说过的render-flow流程接下来就是重头戏了render流程,其中包括了,检查两个渲染节点是否可以合并,同时把renderData的数据填充到modelBatch里的buffer中去。

所有需要渲染的节点都有一个rednerComponent(engine/cocos2d/core/cpmponents/CCRenderComponent.js),那就从这里入手。第一个参数其实就是modelBatcher。第二个参数cullingMask是跟camera相关的,后续再看。
先看modelBatcher(engine/cocos2d/core/renderer/webgl/model-batcher.js)的结构。

modelBatcher

在这里插入图片描述
我们可以看到它创建了4个类型的Buffer,并且持有了一个renderScene,renderScene以后再说。先看这个Buffer,对于2d渲染来说我们用到的也就是其中的_mesh-buffer,其他的基本也是相同的写法,只要搞懂一个,其他的也就都一样。先看看meshBuffer(engine/cocos2d/core/renderer/webgl/mesh-buffer.js)。

这个里面的东西很多。

在这里插入图片描述
这个gfx.VertexBuffer(engine/cocos2d/renderer/gfx/vertex-buffer.js)是用来绑定顶点数组的,当调用里面的update方法的时候就会调用gl.bindBuffer和gl.bufferData来绑定webGL数组。

同理gfx.IndexBuffer也是一样用来绑定顶点索引数组的。

然后我们再来看下vertexFormat这个参数的,它是在ModelBatcher的构造函数中传过来的
在这里插入图片描述
它的结构在engine/cocos2d/core/renderer/webgl/vertex-format.js里定义的。
在这里插入图片描述
可以看到它的定义跟我们在前段时间在Assembler2D里的renderData是一样的,只不过最后的颜色属性定义的不一样,renderData里定义了的是Uint32,而在这里用的是4个Uint8,虽然它们定义的不一样,但是数值和所占的字节数是一样的。

再来看mesh-buffer构建Buffer的地方。在这里插入图片描述
这里的定义也和我们Assembler2D里的renderData是一样的。变量名都基本一样,这里都不细说了,不明白的可以看看前面的文章。

再来看看前面的renderScene,这个跟我们的CCScene不是一个东西,这里面只包含了渲染相关的数据,它的位置在engine/cocos2d/renderer/scene/scene.js。
在这里插入图片描述
对于2d渲染比较关注的是两个东西一个是models数组,一个model就是一个渲染批次。另一个是cameras数组,camera后面再说。先来看看model(engine/cocos2d/renderer/scene/model.js)里有些什么东西。

在这里插入图片描述
其中比较重要的是inputAssebler,effect。effect是material里的effect,这个自不必说,重点看inputAssebler(engine/cocos2d/renderer/core/input-assembler.js)。
在这里插入图片描述
this._vertexBuffer就是上面MessBuffer里的gfx.VertexBuffer的引用,this._indexBuffer就是上面Messbuffer里的gfx.IndexBuffer的引用,图元默认的参数给的是三角形,还有一个this._start表示顶点索引的开始位置,this._count表示要绘制的顶点索引的个数。

了解了上面这些我们就开始说它们是怎么将相邻的node节点渲染批次合并的。

先看Assembler2D里fillBuffers方法
在这里插入图片描述
其中
在这里插入图片描述
这个里面可以看到它就是用的ModelBatcher里的_meshBuffer。fillBuffers方法就是将Assembler2D持有的renderData里的数据填充到ModelBatcher里的_meshBuffer。

再看在此之前执行的CCRenderComponent里的_checkBacth方法,它是实现渲染批次合并的关键所在。
在这里插入图片描述
如果本节点的渲染的材质和前一个不一致就执行_flush方法。
在这里插入图片描述
在这里它就直接生成一个新的InputAssembler,根据messBuffer的顶点索引的start值来更新自己的start值,同时生成一个新的model,然后持有这个新的InputAssembler。然后将这个model添加到renderScene,以后再说这个renderScene,现在先忽略。最后更新messBuffer的顶点索引的start值。

到这里关于顶点属性的渲染批次就很明白了,假设场景有两个需要渲染的2d节点,节点A和节点B,其中节点A是本场景第一个渲染的节点,它们的材质都是一样,那么它们就不会执行_flush参数,也就是只会生成一个model,一个InputAssembler(start=0,count=12)(一个2d节点有6个索引)。那如果节点A和节点B材质不一样,就会生成两个model,节点A的InputAssember就为(start=0,count=6),节点B的InputAssember就为(start=6,count=6),这样就有两个model,尽管两个model中的InputAssember的_vertexBuffer,_indexBuffer依旧指向同一段数据,最后再渲染的时候也就会分两次来渲染。

当然还有其他的地方也会执行_flush函数。
在这里插入图片描述
比如当meshBuffer的数组过大的时候也会执行_flush函数。

顶点数组,索引数组合并只是渲染批次合并的一部分,想要达到真正的渲染批次合并,纹理的合并和纹理合并后的uv坐标更新也是很重要的一部分,这个下一篇文章再说。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cocosCreator2.3.x渲染流程深入剖析笔记(三) 的相关文章

随机推荐

  • 【目标检测】基于yolov5海上船舶目标检测(附代码和数据集)

    Hello 大家好 我是augustqi 今天给大家分享的目标检测项目是 基于yolov5海上船舶目标检测 附代码和数据集 Part1 前言 传统的海上目标检测是通过雷达来实现 但是随着技术的发展 各种隐形涂料的船舰层出不穷 通过雷达进行目
  • Java中的线程中断

    Java中的线程中断 1 线程中断相关方法介绍 Java多线程编程中的interrupt 方法 isInterrupted 方法和interrupted 方法都是跟线程中断相关的方法 都非常重要 这三个方法名称非常相似 不理解原理时容易混淆
  • 秋招笔试题——嵌入式软件开发

    某VO 给定一个非空字符串str 在最多可以删除一个字符的情况下 请编程判定其能否成为回文字符串 如果可以则输出首次删除一个字符所能得到的回文字符串 如果不行则输出字符串 false bool isSpecial char string i
  • C++ 类与对象 面向对象编程 继承

    https www bilibili com video BV1et411b73Z p 127https www bilibili com video BV1et411b73Z p 127 继承是面向对象三大特性之一 我们发现 定义一些类时
  • WordPress计数插件

    这几天在折腾这个blog 无非是加些插件改点代码 折腾的成果基本就是大家看到的这样了 可能国外用户不关心post的访问人数 WP基本功能里没有显示多少个views的功能 这时候就需要WP PostViews插件帮忙 我的WP版本比较高 安装
  • java中的异常 最详细的讲解

    一 异常的概念 异常 在程序执行的过程中 出现的非正常情况 最终会导致JVM非正常停止 在Java等面向对象的编程语言中 异常本身是一个类 产生异常就是创建异常对象并抛出了一个异常对象 Java处 理异常的方式是中断处理 异常指的并不是语法
  • Nginx基本入门

    本文转载至 http blog csdn net u012486840 article details 53098890 1 静态HTTP服务器 首先 Nginx是一个HTTP服务器 可以将服务器上的静态文件 如HTML 图片 通过HTTP
  • [leetcode] 适合打劫银行的日子 -前缀和

    题目链接 前缀和思想 用数组 l l l 表示前面有多少个数满足 a i
  • MySQL----内置函数

    MySQL gt 内置函数 函数 将经常使用的代码封装起来 需要的时候直接调用就可以 从函数定义角度 函数可分为 内置函数 系统内置的通用函数 自定义函数 需要根据需求编写的函数 MySQL提供的内置函数从实现的功能角度可以分为数值函数 字
  • 多益视频面试

    多益面试 有一种怀疑人生的感觉 向老师 我对不起你 去年刚学的网络安全 我竟然没说出来加密算法的名字 也并不是题很难 而是简单的就是说不出来 写不出来 而难的也就是听过而已 问题 1 说一下什么是线程安全 线程安全的场景 线程安全就是确保程
  • 单相机做分屏混合

    做了一个单相机实现分屏混合的功能 需求大概就是在同一视角下 相机通过不同的CullingMask获取不同的渲染图片RenderTexture之后 通过某种方式一起显示在界面的功能 其实核心逻辑就是怎样用一个相机渲染不同的图片罢了 直接上代码
  • 在Java中,将ExecutorService转为守护程序

    问题描述 我正在Java 1 6中使用一个ExecutoreService 简单地开始 ExecutorService pool Executors newFixedThreadPool THREADS 当我的主线程完成 以及由线程池处理的
  • vue调用原生方法交互

    目前在做一个H5应用 需要调用原生方法进行交互 特此做一个记录 技术栈 vue版本2 6 vant版本 2 12 第一步 声明一个rpcFn js文件 进行原生交互阿里桥封装 const rpc function url params re
  • github actions实现Android持续集成

    持续集成 Continuous Integration 在很多单位都有现成的系统 但是作为一名工程师 我们还是要了解其原理 可以自己尝试做一下 经过本人的尝试 发现功能并不复杂 这里把持续集成实践经验总结与大家分享 持续集成用的比较多的是j
  • 2023自动化专业毕业设计项目集合

    文章目录 1前言 2 如何选题 2 1 物联网方向 2 2 嵌入式开发方向 2 3 人工智能方向 2 4 算法研究方向 2 5 学长作品展示 4 最后 1前言 近期不少学弟学妹询问学长关于自动化专业相关的毕设选题 学长特意写下这篇文章以作回
  • 基于springcloud gateway + nacos实现灰度发布(reactive版)

    什么是灰度发布 灰度发布 又名金丝雀发布 是指在黑与白之间 能够平滑过渡的一种发布方式 在其上可以进行A B testing 即让一部分用户继续用产品特性A 一部分用户开始用产品特性B 如果用户对B没有什么反对意见 那么逐步扩大范围 把所有
  • 一个网站引发的程序猿的牢骚,哈哈哈

    2013年大学毕业后 参加工作做的第一个前端项目 北京服装学院 今天调研一个关于iframe的需求 突然想试试 以前那些做IE6兼容的项目是否还在使用 就默默的点开了 十年了 他们没有换网站 我的岁月似乎从这一刻又回来了一次 已经十年了 我
  • Flask学习笔记(二)

    Flask学习笔记 二 1 知识点 1 1虚拟环境 1 1 1virtualenv 1 1 2virtualenvwrapper 1 2web与视图 1 3jinja2 1 3 1template知识点 1 3 2豆瓣列表页 1 3 3视图
  • 锚框损失论文下载 Iou-Loss【IoU Loss、GIoU Loss、 DIoU Loss 、CIoU Loss、 CDIoU Loss、 F-EIoU Loss、α-IoU Loss】

    锚框损失 Iou Loss IoU Loss GIoU Loss DIoU Loss CIoU Loss CDIoU Loss F EIoU Loss IoU Loss 论文打包下载 yolo系列论文https download csdn
  • cocosCreator2.3.x渲染流程深入剖析笔记(三)

    渲染批次合并之顶点 根据前面说过的render flow流程接下来就是重头戏了render流程 其中包括了 检查两个渲染节点是否可以合并 同时把renderData的数据填充到modelBatch里的buffer中去 所有需要渲染的节点都有