简述CCNode和Sprite的渲染过程

Sprite创建时,加载纹理,产生纹理id。Sprite重写(override)Node中的draw

void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)

{

// Don‘t do calculate the culling if the transform was not updated

_insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds;

if(_insideBounds)

{

_quadCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, &_quad, 1, transform);

renderer->addCommand(&_quadCommand);

#if CC_SPRITE_DEBUG_DRAW

_debugDrawNode->clear();

Vec2 vertices[4] = {

Vec2( _quad.bl.vertices.x, _quad.bl.vertices.y ),

Vec2( _quad.br.vertices.x, _quad.br.vertices.y ),

Vec2( _quad.tr.vertices.x, _quad.tr.vertices.y ),

Vec2( _quad.tl.vertices.x, _quad.tl.vertices.y ),

};

_debugDrawNode->drawPoly(vertices, 4, true, Color4F(1.0, 1.0, 1.0, 1.0));

#endif //CC_SPRITE_DEBUG_DRAW

}

}

将对应的顶点信息,纹理id,视图矩阵加入render队列。

draw函数在什么时候被调用?

请看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;

}

uint32_t flags = processParentFlags(parentTransform, parentFlags);

// IMPORTANT:

// To ease the migration to v3.0, we still support the Mat4 stack,

// but it is deprecated and your code should not rely on it

Director* director = Director::getInstance();

director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewTransform);

bool visibleByCamera = isVisitableByVisitingCamera();

int i = 0;

if(!_children.empty())

{

sortAllChildren();

// draw children zOrder < 0

for( ; i < _children.size(); i++ )

{

auto node = _children.at(i);

if ( node && node->_localZOrder < 0 )

node->visit(renderer, _modelViewTransform, flags);

else

break;

}

// self draw

if (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);

}

director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

// FIX ME: Why need to set _orderOfArrival to 0??

// Please refer to https://github.com/cocos2d/cocos2d-x/pull/6920

// reset for next frame

// _orderOfArrival = 0;

}

visit首先根据zorder排列子节点,先调用zorder大于0的子节点的draw函数,再调用自身的draw,接着再调用zorder小于0的子节点的draw函数,最后渲染时,按照render中队列的先后顺序,渲染所有节点。

void Director::drawScene()

if (_runningScene)

{

//clear draw stats

_renderer->clearDrawStats();

//render the scene

_runningScene->render(_renderer);---------调用所有节点的visit和draw函数,添加节点渲染信息到渲染队列中

_eventDispatcher->dispatchEvent(_eventAfterVisit);

}

// draw the notifications node

if (_notificationNode)

{

_notificationNode->visit(_renderer, Mat4::IDENTITY, 0);

}

if (_displayStats)

{

showStats();

}

_renderer->render();------------------渲染所有节点

时间: 2024-10-23 22:57:03

简述CCNode和Sprite的渲染过程的相关文章

浏览器渲染过程

有时候想要进行性能优化时了解浏览器的渲染过程无疑是十分重要的.下面来看 首先介绍一下主流浏览器的渲染引擎: IE:Trident chrome:Blink Safire:webkit Firefox:Gecko Opera:Blink QQ浏览器/微信webview:X5/Blink 可能有很多会感到疑惑:chrome不是webkit么?其实Blink也算是webkit的一种升级吧,前缀还是不变的. 然后介绍一下渲染过程 1.DOM解析(与CSS解析同时进行): 把HTML文档解析成DOM树的过

前端必备的浏览器知识(渲染过程、回流和重绘等)

常用哪几种浏览器测试?有哪些浏览器内核(Rendering Engine)? (Q1)浏览器:Chrome,IE,FireFox,Safari,Opera. (Q2)对应内核:Webkit,Trident,Gecko,Webkit,Presto.(国内的浏览器,除了傲游是直接基于Webkit开发的,其他基本都是基于谷歌在webkit上开发的Chromium,当然谷歌自己也是用的Chromium.另外值得的一提的是手机的系统(安卓.苹果)默认浏览器都是基于webkit内核的) 如何理解浏览器内核?

WebKit 渲染过程

webkit笔记,主要来自 朱永盛 <WebKit技术内幕> 学习笔记,转载就注明原著,该书是国内仅有的Webkit内核的书籍,学习的好导师,推荐有兴趣的朋友可以购买 Webkit渲染过程包括很多数据和模块 数据:网页内容,DOM树,内部表示,图像 模块:HTML解释器,CSS解释器,JavaScript引擎,布局和绘图模块 根据数据的方向,渲染分三个阶段 1,网页的URL 到构建完DOM 树 2,DOM树 到 构建完 Webkit的绘图上下文 3,绘图上下文 到 最终的图像 下面是详细的对三

spring mvc DispatcherServlet详解之---视图渲染过程

整个spring mvc的架构如下图所示: 现在来讲解DispatcherServletDispatcherServlet的最后一步:视图渲染.视图渲染的过程是在获取到ModelAndView后的过程. 视图渲染的过程: DispatcherServlet.java doService()--->doDispatch()--->processDispatchResult()--->render() processDispatchResult():主要处理异常.请求状态及触发请求完成事件,

&lt;转&gt;iOS 事件处理机制与图像渲染过程

原文:http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=401383686&idx=1&sn=1613dfa8fa762a0efee4bc4af496fddf&scene=0#wechat_redirect iOS RunLoop都干了什么 RunLoop是一个接收处理异步消息事件的循环,一个循环中:等待事件发生,然后将这个事件送到能处理它的地方. 如图1-1所示,描述了一个触摸事件从操作系统层传送到应用内的main

网页在浏览器上的渲染过程

最近在学习性能优化,学习了雅虎军规 ,可是觉着有点云里雾里的,因为里面有些东西虽然自己也一直在使用,但是感觉不太明白所以然,比如减少DNS查询,css和js文件的顺序.所以就花了时间去了解浏览器的工作,有一篇经典的文章<how browsers work> ,讲的很详细,也有中文译本 .不过就是文章有点太长,也讲了一堆东西,还是自己总结一下. 为什么要了解浏览器加载.解析.渲染这个过程? 好,我们先说一下,为什么要了解这些呢?如果想写出一个最佳实践的页面,就要好好了解. 了解浏览器如何进行加载

《转之微信移动团队微信公众号》iOS 事件处理机制与图像渲染过程

致歉声明: Peter在开发公众号功能时触发了一个bug,导致群发错误.对此我们深表歉意,并果断开除了Peter.以下交回给正文时间: iOS 事件处理机制与图像渲染过程 iOS RunLoop都干了什么 iOS 为什么必须在主线程中操作UI 事件响应 CALayer CADisplayLink 和 NSTimer iOS 渲染过程 渲染时机 CPU 和 GPU渲染 Core Animation Facebook Pop介绍 AsyncDisplay介绍 参考文章 iOS RunLoop都干了什

iOS 事件处理机制与图像渲染过程

iOS 事件处理机制与图像渲染过程 iOS RunLoop都干了什么 iOS 为什么必须在主线程中操作UI 事件响应 CALayer CADisplayLink 和 NSTimer iOS 渲染过程 渲染时机 CPU 和 GPU渲染 Core Animation Facebook Pop介绍 AsyncDisplay介绍 参考文章 iOS RunLoop都干了什么 RunLoop是一个接收处理异步消息事件的循环,一个循环中:等待事件发生,然后将这个事件送到能处理它的地方. 如图1-1所示,描述了

通过浏览器渲染过程来进行前端优化

介绍 做web开发,我个人觉得必须要弄清楚浏览器的渲染过程,否则我们很难进行前端优化. 我今天就简单说一下页面加载和前端优化. 页面加载 我按照最简单的方式进行描述,实际上更复杂,不管是在浏览器端还是服务端,比如dns解析,代理服务器,负载均衡器等等. 1.用户访问网页,发送一个http请求到网络服务器. 2.网络服务器(应用服务器)解析请求,发送请求给数据库服务器. 3.数据服务器返回数据给网络服务器,网络服务器解析数据,并生成html文件内容放入http response中,返回给浏览器.