第二篇 渲染框架2.x
简介
整个渲染框架主要包含:用于控制场景中所有渲染节点的渲染状态的流程的RenderFlow。更新渲染数据、写入Buffer的Assembler。暂存数据的RenderData。数据缓冲区的MeshBuffer、quadBuffer、spineBuffer。包含着色器程序和渲染技术的Material。渲染指令数据的装载、合批的ModelBatcher。依次对每个model数据进行真正调用渲染的forwardRenderer。
RenderFlow
cocos把每个渲染数据状态都划分成不同的flag的,并创建了与之对应的函数。多个flag组成了一个_renderFlag。renderFlow 主要功能是根据节点的_renderFlag 调用对应的链表函数,会优选对渲染数据进行更新暂存至RenderData中,再写入数据缓冲区Buffer中,最后调用forwardRender的render 进行渲染。
再写入数据缓冲区之前,会把符合合批条件(material的hash、cullingMask一致)的渲染进行动态合批。
-
_renderFlag
当渲染数据被修改,需要渲染时会使用flag进行标记。其记录方式是使用掩码,通过掩码的位与运算、位或运算、位取反运算。
位与运算:& 例如:如果你有两个二进制数 A = 1101 和 B = 1010,那么 A & B 的结果将是 1000。
位取反运算:~ 例如:如果你有一个二进制数 A = 1101,那么 ~A 的结果将是 0010。
位或运算:| 例如:如果你有两个二进制数 A = 1101 和 B = 1010,那么 A | B 的结果将是 1111。
-
链表函数
因为cocos 根据渲染状态的调用频繁度划分出了多个分支,在初始化时就把所有可能存在的分支全部创建共1024个分支(此时不是完整的链表函数)。Render时会根据node的renderFlag调用对应的分支,如果存在完整的链表函数,直接调用。不存在会优先创建链表函数,再调用。
LOCAL_TRANSFORM、WORLD_TRANSFORM、TRANSFORM 用于更新节点的本地矩阵和世界矩阵。
UPDATE_RENDER_DATA 用于更新节点的uv数据、顶点数据,并暂时存在的RenderData中。
OPACITY、COLOR 用于更新节点的透明度、颜色。
RENDER 把RenderData数据写入缓冲区中,在写入缓冲区之前会进行动态合批处理。
CHILDREN 使用DFS 深度遍历 所有的子节点,并处理透明度。
POST_RENDER 屏幕后效效果处理。例如 技能的击打效果。
Assembler
Assembler 其主要用于对渲染数据的更新、写入数据缓冲区中。对应的数据更新函数和数据的写入函数都是在RenderFlow调用。每个渲染组件都有与之对应的Assembler。
Assembler的注册
每个渲染节点根据它们的渲染类型可能存在一个或多个Assembler。在初始化渲染时即会把渲染节点所有的Assembler注册到渲染组件中的__assembler__。
initWebGL(canvas, opts) {//注册Assemblerrequire("./webgl/assemblers");
.....
}
Assembler.register = function (renderCompCtor, assembler) {renderCompCtor.__assembler__ = assembler;
};
Assembler的确定
因为渲染节点会存在多个Assembler,但是运行时,需要确定使用的是那个Assembler,即再预加载前会进行Assembler的确定,此事一般都在RenderComponent的_proload函数中调用Assembler的类方法init,确定_assembler值。(这里需要注意实例方法和类方法)
Assembler.init = function (renderComp) {let renderCompCtor = renderComp.constructor;let assemblerCtor = renderCompCtor.__assembler__;while (!assemblerCtor) {renderCompCtor = renderCompCtor.$super;if (!renderCompCtor) {cc.warn(`Can not find assembler for render component : [${cc.js.getClassName(renderComp)}]`);return;}assemblerCtor = renderCompCtor.__assembler__;}if (assemblerCtor.getConstructor) {assemblerCtor = assemblerCtor.getConstructor(renderComp);}if (!renderComp._assembler ||renderComp._assembler.constructor !== assemblerCtor) {let assembler = assemblerPool.get(assemblerCtor);assembler.init(renderComp);renderComp._assembler = assembler;}
};
数据的更新
updateRenderData 方法用于更新顶点数据、uv数据,并暂存至RenderData。
updateColor 函数用于更新节点的color值,并暂存至RenderData。
数据的写入
fillBuffers 主要是把RenderData数据写入数据缓冲区中。例如sprite数据写入MeshBuffer中。
官方文档
RenderData
renderData 存储渲染节点的顶点数据、索引数据、颜色值。数据的存储是以ArrayBuffer进行存储的。如果需要操作读写时需要通过视图。webGL-类型化数组_雷鸣_IT的博客-CSDN博客
iDatas 是无符号整数数据,主要用于存储索引数据。
顶点数据包含了位置数据、uv数据、color数据。因为位置数据、uv数据是float类型。而color数据是整数数据,所以在RenderData中使用了两种视图操作一个ArrayBuffer。
vDatas 是以浮点32位进行读写,主要用于位置数据、uv数据的使用。
uintVDatas 是以无符号32整数进行读写。主要用于color值的使用。
例如:sprite组件:
四个顶点。每个顶点包含5个Float数据(位置数据2个,uv数据2个,color数据1个)。
索引数据6个:因为webGL只能渲染点、线、三角形。因此一个sprite又两个三角形组成。
uv数据的偏移量 ,color的偏移量:因为数据都在一个连续的一维数组中,前两位0,1存储位置数据,接下来两位2,3存储uv数据,第4位存储color数据。依次循环。
floatsPerVert: 5, //每个顶点数据 有五个floatsverticesCount: 4, //有4个顶点indicesCount: 6, //6个索引 即两个三角形uvOffset: 2, //uv数据在顶点数据的偏移colorOffset: 4, //color 数据在顶点数据的偏移
color不是包含rgba四位数吗,为什么color值的存储只需要一位?
rgba 每个数的范围都是0~255,可用8位二进制表示。Assembler的updateColor函数读取color值是通过_val。_val的赋值如下:
this._val = ((a << 24) >>> 0) + (b << 16) + (g << 8) + (r|0);
(a << 24) >>> 0) 向左移动24位并保证位整数
(b << 16) 向左移动16位、(g << 8) 向左移动8位。 (r|0) 非零整数。
_val 最终得到的是一个rgba组合而成32位二进制的整数,且是无符号整数。
ModelBatcher
在渲染数据RenderData 写入缓冲区之前,会优先创建一个合批model,用于存放可以合批的渲染指令。合批条件简单归纳即material、culingMash一致就会使用同一个model。
具体的合批条件是:
1,着色器程序相同:顶点着色器、片元着色器
2,纹理相同
3,渲染状态相同:深度测试(Depth Test)模板测试(Stencil Test)裁剪测试(Scissor Test)透明度测试(Alpha Test)混合(blending)等
4,缓冲数据相同:顶点缓冲数据、索引缓冲数据。(此处的一致指的是同一个buffer)
有两个重要数据_iaPool、modelPool。
一个ia会记录vertexBuffer、indexBuffer、索引的开始坐标、索引数。(buffer对象实际由meshBuffer管理)
一个model时一个drawCall的buffer数据集合、以及对应的effect。
MeshBuffer
meshBuffer主要用于管理vertexBuffer、indexBuffer。
相关文章:
第二篇 渲染框架2.x
简介 整个渲染框架主要包含:用于控制场景中所有渲染节点的渲染状态的流程的RenderFlow。更新渲染数据、写入Buffer的Assembler。暂存数据的RenderData。数据缓冲区的MeshBuffer、quadBuffer、spineBuffer。包含着色器程序和渲染技术的Material。渲染指令数据的装载…...
k8s-----25、资源调度-ResourceQuota资源配额、资源限制limitrange、服务质量QoS
1、ResourceQuota资源配额 1.0 作用 命名空间资源配额。防止公司内部人员对资源的不合理利用。 1.1、为什么需要资源配额 1、作为k8s集群的管理员,知道集群的规模,会合理规划资源,但是使用侧不知道,会导致很多不合理的使用场景…...
Pytorch使用torchvision.datasets.ImageFolder读取数据集,数据集的内容排列状况
当使用torchvision.datasets.ImageFolder读取猫狗数据集时,dataset中存的图片是 猫狗猫狗猫狗猫狗 还是 猫猫猫猫狗狗狗狗 呢? 数据集文件的存放路径如下图 测试代码如下 import torch import torchvisiontransform torchvision.transforms.Compose([torchvision.transform…...
uni-app:引用文件的方法
绝对定位 ①import common from "/utils/common.js" ②import common from "utils/common.js" <template><view></view> </template> <script>import common from "/utils/common.js"export default {data() {ret…...
软件测试必备:如何编写测试用例?
前言 今天想和大家来聊聊测试用例,这篇文章主要是想要写给软件测试小伙伴们的,因为我发现还是有很多小伙伴在遇到写测试用例的时候无从下手,我就想和大家简单的聊聊,这篇文章主要是针对功能测试的哟。 同时,我也准备…...
windows安装数据库MySQL
windows安装数据库MySQL 文章目录 windows安装数据库MySQL一、MySQL官网下载压缩包二、在D盘新建文件夹D:\MySQL,将下载的压缩包解压到该文件夹下三、配置环境变量四、通过命令行模式安装、启用、配置SQL服务 一、MySQL官网下载压缩包 下载地址:https:/…...
2023CCF中国开源大会 | 麒麟信安作为首批合作伙伴入驻全国信创开源广场
聚开源各界群智,于湘江之滨论道。10月21-22日,以“开源联合,聚力共赢”为主题的2023 CCF中国开源大会(CCF ChinaOSC)在长沙隆重召开。本届大会由中国计算机学会、开放原子开源基金会主办,中国工程院院士、鹏…...
python网络爬虫实例
目录 1、访问百度 2、输入单词百度翻译 3、豆瓣电影排行榜 4、豆瓣电影top250 5、下载美女壁纸 1、访问百度 from urllib.request import urlopen url"http://www.baidu.com" respurlopen(url)with open("mybaidu.html",mode"w") as f:f.wr…...
ArcGIS中如何为跨带数据投影?
北京54、西安80高斯克吕格投影是我国常用的投影坐标系统,它们是一种分带投影方式,有3和6分带,不适合大范围内的投影使用。但是如果有份数据范围较大,跨越了多个度带,该选择哪个坐标系统进行投影转换呢? 在大范围内,常用的坐标系统有Albers等面积投影和Lambert等角投影,…...
如何在Ubuntu中安装libevent库
我自己在ubuntu 22 和20上都安装成功了。应该是每个版本都适合的。 我主要是整合参考这两个人的。 Ubuntu安装及测试Libevent_如何查看ubuntu是否安装了libevent-CSDN博客 【精选】Linux Ubuntu 20.04LTS安装OpenSSL步骤_ubuntu安装openssl-CSDN博客 下载方法一:…...
领域高口碑 | 中科院1区TOP,Elsevier出版社,仅1个月Accept!稳定检索40年!
【SciencePub学术】本期,小编给大家推荐的是一本Elsevier旗下、稳定检索40年、影响因子为10.0的中科院1区TOP刊,期刊详情及专题信息如下: 期刊简介 COMPUTERS IN INDUSTRY ISSN:0166-3615 E-ISSN:1872-6194 IF&a…...
RDBMS 的历史回顾
“数据库”这个词是怎么来的?当 SQL 是 SEQUEL 时它代表什么?通过这篇有关 RDBMS 历史的文章了解所有这些内容以及更多内容。 埃里克迪特里希用户头像 经过 埃里克迪特里希 核心 Anush Gasparyan 用户头像 经过 阿努什加斯帕里安 2017年7月21日 意见…...
windows 离线安装 vue 环境
由于公司要求在内网开发项目,而内网不能连接外网,因此只能离线安装 vue 环境,在网上找过很多的离线安装方法,但都没有成功,于是在不断的尝试中找到了以下方法。 1、找一台与内网电脑相同系统的有网电脑。 2、在有网的电…...
python实现批量pdf转txt和word
文章目录 背景需求环境安装完整代码效果 背景需求 已经获取到了大量的pdf在download文件夹中,但是我需要的是txt文件和word文件~ 环境安装 pip install pdf2docx pdfminer.six完整代码 # pip install pdf2docx pdfminer.siximport os from pdf2docx …...
c++ 并发与多线程(12)线程安全的单例模式-2
一、内部静态变量的懒汉单例(C++11 线程安全) #include <iostream> #include <thread> #include <vector>class Single { public:// 获取单实例对象static Single& GetInstance();// 打印实例地址void Print();private:// 私有构造函数,防止外部创建对…...
银河麒麟v10x86或者arm离线安装服务
银河麒麟v10x86或者arm离线安装服务 最近有个项目,甲方的服务器用的全是国产化服务器银河麒麟,架构是x86的然后也无法连接外网,需要离线安装服务正常思路就是找到离线安装的包,然后拷贝到现场的服务器中进行安装所以问题就在于如…...
【Ansible自动化运维工具 1】Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)
Ansible常用模块 一、Ansible1.1 简介1.2 工作原理1.3 Ansible的特性1.3.1 特性一:Agentless,即无Agent的存在1.3.2 特性二:幂等性 1.4 Ansible的基本组件 二、Ansible环境安装部署2.1 安装ansible2.2 查看基本信息2.3 配置远程主机清单 三、…...
Telegram 引入了国产小程序容器技术
Telegram 宣布为其开发者提供了一项“能够在 App 中运行迷你应用”的新功能( 迷你应用即 Mini App,下文中以“小程序”代替)。 在一篇博客文章中,Telegram 的开发者写到“小程序提供了可替代互联网网站的灵活界面(cre…...
Capture One Pro 23图像处理工具「Mac」
Capture One Pro是一款专业的图像处理软件,旨在为摄影师和其他专业用户提供最佳的图像编辑和后期处理工具。 Capture One Pro 的主要功能包括 RAW 文件处理、图像编辑、颜色校正、曝光控制、局部调整、批处理等。它的相机支持列表非常广泛,几乎可以支持…...
rust OJ实战
目录 力扣 414. 第三大的数 力扣 628. 三个数的最大乘积 力扣 414. 第三大的数 给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 示例 1: 输入:[3, 2, 1] 输出:1 解释:…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
