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函数相关推荐

  1. networkx怎么显示图_如何将标签添加到networkx图形中的节点?

    我正在写整数分区的代码,并构造一个图形,其中每个节点是一个分区.我想用{2,1,1},{1,1,1,1},{2,2}等分区元素标记图中的节点.如何将标签添加到networkx图形中的节点? 所以我想知 ...

  2. NS2仿真中nam节点颜色设置

    NS2仿真中节点颜色设置 2009-02-16 20:01 NS中提供了配置节点与流量颜色标识的方法,给一条流"上色"是经常用的方法,但是在无线仿真的时候不好用,经常出现只有fid ...

  3. NS2仿真中nam节点颜色设置(转)

    NS2仿真中节点颜色设置 2009-02-16 20:01 NS中提供了配置节点与流量颜色标识的方法,给一条流"上色"是经常用的方法,但是在无线仿真的时候不好用,经常出现只有fid ...

  4. Cocos2d-x中替换动画(Armature)中的节点与粒子

    Cocos2d-x游戏开发中常用到骨骼动画Armature,Armature真是个好东西啊,不仅占用资源不大(相对于帧动画来说),而且还能添加帧事件,它还自带有动画的播放.停止.循环事件...bala ...

  5. LeetCode实战:删除链表中的节点

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a fun ...

  6. Php 获取xml中的节点值

    Php获取xml中的节点值 XML: test_xml2.xml <?xml version="1.0" encoding="UTF-8"?> &l ...

  7. zTree中父节点禁用,子节点可以用

    参考学习网址:http://www.treejs.cn/v3/main.php#_zTreeInfo zTree中父节点禁用,子节点可以用 axios.get('/base/unit/unittree ...

  8. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )

    文章目录 一.继承 BuilderSupport 抽象类 二.在 createNode 方法中获取节点名称.节点属性.节点值信息 三.完整代码示例 1.MyBuilderSupport 生成器代码 2 ...

  9. 【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )

    文章目录 一.创建 XmlParser 解析器 二.获取 Xml 文件中的节点 三.获取 Xml 文件中的节点属性 四.完整代码示例 一.创建 XmlParser 解析器 创建 XmlParser 解 ...

最新文章

  1. 遇见BUG(5)如何找到VHDL的包呢?
  2. 求有环单链表的环连接点位置
  3. 【网址收藏】rancher镜像源仓库
  4. 如何安装python3.7.6_CentOS7安装Python3.7.6,配置pip,安装配置virtualenv和virtualenvwrapper...
  5. linux支持ppp网卡,linux和安卓上(ppp widget)使用3g网卡的方法
  6. 开源cms系统:We7 CMS 2.5版内测版发布啦!
  7. 计算机浏览器应用程序,基于浏览器的应用程序
  8. Tomcat 工作原理【转】
  9. Java项目:SSM高校教职工差旅报销管理系统
  10. vdbench - 性能压力测试工具
  11. linux生成密钥公钥,linux 生成密钥和公钥,实现免密登录
  12. 使用easy_captcha生成登录验证码
  13. linux环境下pytesseract的安装和央行征信中心的登录验证码识别
  14. table 点击文字按钮预览图片
  15. Ultra Light Support
  16. 浙江大学许威威教授招聘博士后
  17. 影响到网站收录有哪些方面呢
  18. Linux - 系统文件目录说明
  19. 天上掉馅饼?英国推出全球首个无人机派送披萨服务
  20. PHP后端生成签名后uniapp前端直传华为云OBS记录

热门文章

  1. 分析ctr模型效果的一些思路总结
  2. 电脑开机后报bootsafe.sys丢失,报0x00000098状态码
  3. MT6752/MT6755处理器功能介绍,MT6752/MT6755芯片资料分享
  4. 【Accumulation】The definition of SISR
  5. 多线程(五、原子类-AtomicReference)
  6. java练习题(set集合)
  7. (Modern Family S01E01) Part 11 PhilClair Luke和Phil打篮球 总
  8. Android 控制屏幕唤醒常亮或熄灭
  9. linux系统cpu性能测试工具
  10. ASO苹果搜索广告审核不通过的原因