cocos 中每个节点的visit与draw函数
visit函数内会先sortAllChildren,然后调用自己的draw函数,然后遍历所有子节点递归调用字节的visit:
因为draw函数会创建渲染指令加到渲染队列中,所以先执行visit的节点会先进行绘制,
它的渲染指令在渲染队列的前面,sortAllChildren根据ZOrder,由小到大排序,ZOrder小的先绘制。
cocos渲染流程是从Director类的主循环mainLoop中开始:
1.调用drawScene():
//精简后的代码,方便理解
void Director::drawScene()
{/*此处省略一些代码.....*/_renderer->clear();pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);if (_runningScene){/*绘制当前场景,实际上不是真正绘制而是为场景内的每个节点创建渲染指令。
遍历访问场景内的节点树(visit和draw函数),初始化渲染指令加到渲染队列中。
为每个节点计算出将要传入着色器的数据:模型视图矩阵、shader对象(GLProgramState)等
这些数据封装在渲染指令中RenderCommand
*/_runningScene->render(_renderer);}//这里是真正的渲染,visitRenderQueue函数:变量渲染队列中的所有指令//processRenderCommand函数内处理单个指令,不同的渲染指令处理方式不同//能合批的合批(QUAD_COMMAND和TRIANGLES_COMMAND可以合批)//然后调用flush:1.发送顶点数据到opengl缓冲区 2.调用glDrawElements绘制//CUSTOM_COMMAND则执行自定义的渲染回调函数,一般是onDraw()函数_renderer->render();popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);// swap buffersif (_openGLView){_openGLView->swapBuffers();}
}
2._runningScene->render(_renderer):
void Scene::render(Renderer* renderer)
{...//计算节点相对于父节点坐标系的变换矩阵,也是当前节点相对于父节点的位移、旋转、缩放属性//这些属性构成一个矩阵,这个矩阵需要乘以所有父节点的变换矩阵,就可以得到这个节点在世界坐标系的变换矩阵,可以理解成相对于父节点的变换和所有父节点变换要叠加到一起const auto& transform = getNodeToParentTransform();//此处调用基类visit函数visit(renderer, transform, 0);...
}
3.Node::visit()
//这是虚函数
void Node::visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags)
{// quick return if not visible. children won't be drawn.if (!_visible){return;}.....int i = 0;if(!_children.empty()){sortAllChildren();// draw children zOrder < 0for( ; i < _children.size(); i++ ){auto node = _children.at(i);if (node && node->_localZOrder < 0)node->visit(renderer, _modelViewTransform, flags);elsebreak;}// self drawif (visibleByCamera)this->draw(renderer, _modelViewTransform, flags);for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)(*it)->visit(renderer, _modelViewTransform, flags);}else if (visibleByCamera){this->draw(renderer, _modelViewTransform, flags);}
}
void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
#if CC_USE_CULLING// Don't do calculate the culling if the transform was not updatedauto visitingCamera = Camera::getVisitingCamera();auto defaultCamera = Camera::getDefaultCamera();if (visitingCamera == defaultCamera) {_insideBounds = ((flags & FLAGS_TRANSFORM_DIRTY)|| visitingCamera->isViewProjectionUpdated()) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds;}else{_insideBounds = renderer->checkVisibility(transform, _contentSize);}if(_insideBounds)
#endif{_trianglesCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, _polyInfo.triangles, transform, flags);renderer->addCommand(&_trianglesCommand);}
}
cocos 中每个节点的visit与draw函数相关推荐
- networkx怎么显示图_如何将标签添加到networkx图形中的节点?
我正在写整数分区的代码,并构造一个图形,其中每个节点是一个分区.我想用{2,1,1},{1,1,1,1},{2,2}等分区元素标记图中的节点.如何将标签添加到networkx图形中的节点? 所以我想知 ...
- NS2仿真中nam节点颜色设置
NS2仿真中节点颜色设置 2009-02-16 20:01 NS中提供了配置节点与流量颜色标识的方法,给一条流"上色"是经常用的方法,但是在无线仿真的时候不好用,经常出现只有fid ...
- NS2仿真中nam节点颜色设置(转)
NS2仿真中节点颜色设置 2009-02-16 20:01 NS中提供了配置节点与流量颜色标识的方法,给一条流"上色"是经常用的方法,但是在无线仿真的时候不好用,经常出现只有fid ...
- Cocos2d-x中替换动画(Armature)中的节点与粒子
Cocos2d-x游戏开发中常用到骨骼动画Armature,Armature真是个好东西啊,不仅占用资源不大(相对于帧动画来说),而且还能添加帧事件,它还自带有动画的播放.停止.循环事件...bala ...
- LeetCode实战:删除链表中的节点
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a fun ...
- Php 获取xml中的节点值
Php获取xml中的节点值 XML: test_xml2.xml <?xml version="1.0" encoding="UTF-8"?> &l ...
- zTree中父节点禁用,子节点可以用
参考学习网址:http://www.treejs.cn/v3/main.php#_zTreeInfo zTree中父节点禁用,子节点可以用 axios.get('/base/unit/unittree ...
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )
文章目录 一.继承 BuilderSupport 抽象类 二.在 createNode 方法中获取节点名称.节点属性.节点值信息 三.完整代码示例 1.MyBuilderSupport 生成器代码 2 ...
- 【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
文章目录 一.创建 XmlParser 解析器 二.获取 Xml 文件中的节点 三.获取 Xml 文件中的节点属性 四.完整代码示例 一.创建 XmlParser 解析器 创建 XmlParser 解 ...
最新文章
- 遇见BUG(5)如何找到VHDL的包呢?
- 求有环单链表的环连接点位置
- 【网址收藏】rancher镜像源仓库
- 如何安装python3.7.6_CentOS7安装Python3.7.6,配置pip,安装配置virtualenv和virtualenvwrapper...
- linux支持ppp网卡,linux和安卓上(ppp widget)使用3g网卡的方法
- 开源cms系统:We7 CMS 2.5版内测版发布啦!
- 计算机浏览器应用程序,基于浏览器的应用程序
- Tomcat 工作原理【转】
- Java项目:SSM高校教职工差旅报销管理系统
- vdbench - 性能压力测试工具
- linux生成密钥公钥,linux 生成密钥和公钥,实现免密登录
- 使用easy_captcha生成登录验证码
- linux环境下pytesseract的安装和央行征信中心的登录验证码识别
- table 点击文字按钮预览图片
- Ultra Light Support
- 浙江大学许威威教授招聘博士后
- 影响到网站收录有哪些方面呢
- Linux - 系统文件目录说明
- 天上掉馅饼?英国推出全球首个无人机派送披萨服务
- PHP后端生成签名后uniapp前端直传华为云OBS记录
热门文章
- 分析ctr模型效果的一些思路总结
- 电脑开机后报bootsafe.sys丢失,报0x00000098状态码
- MT6752/MT6755处理器功能介绍,MT6752/MT6755芯片资料分享
- 【Accumulation】The definition of SISR
- 多线程(五、原子类-AtomicReference)
- java练习题(set集合)
- (Modern Family S01E01) Part 11 PhilClair Luke和Phil打篮球 总
- Android 控制屏幕唤醒常亮或熄灭
- linux系统cpu性能测试工具
- ASO苹果搜索广告审核不通过的原因