07-渲染流程-2-HelloWorld分析

原创 2015年11月18日 09:58:12

Image

"HelloWorld.png”    —> 到屏幕的显示经历了哪些过程?

抛开系统启动的过程,那么所有的渲染方式在Director::drawScene中

在Director::mainLoop中不断的循环该方法进行渲染

1.时间间隔判断

Image(1)

2.确保openGL的视图事件响应-IPhone程序没用-空实现

Image(2)

3.按照优先级调度update函数(每个节点都有这么个函数),然后OpenGL调用清除缓存

Image(3)

4.如果切换场景,就先处理场景切换的逻辑,在setNextScene中,将正在运行的scene release,将下一个scene保存,设置为马上要渲染的scene

Image(4)

5.矩阵操作

pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

6.调用OpenGL来绘制场景树的代码

Image(5)

调用了当前Scene的visit方法,最终其实调用的是Node::visit

以此逐层次将Node对象的渲染逻辑放在_renderer对象集合中

7.visit界面其他附加内容,比如帧率的显示

Image(6)

8.执行渲染,模型视图矩阵管理

Image(7)

9.此时在OpenGL缓存中渲染完成,交换显示

Image(8)

visit 可以说是一个Node节点树的渲染入口。

Scene永远作为一个树的根,在visit 内部会按照树的层次进行渲染,基本按照

     A.绘制子节点中localZorder < 0的

     B.绘制自己

     B.绘制下一层节点

而每个节点的绘制到屏幕,是调用了方法:

virtual void draw(Renderer *renderer, const Mat4& transform, bool transformUpdated);

因而,HelloWorld中需要渲染的节点顺序:

scene -> layer -> sprite

所以重点放在这三类的节点的绘制

scene渲染

没有override draw方法,所以显然调用的Node::draw

Node渲染

Image(9)

显然Node是不会在屏幕上显示什么内容的。

所以Scene本身是不会渲染任何内容的。

layer渲染

Layer 也没有找到draw方法,所以也是没有绘制内容的

sprite渲染

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
        _customDebugDrawCommand.init(_globalZOrder);
        _customDebugDrawCommand.func = CC_CALLBACK_0(Sprite::drawDebugData, this);
        renderer->addCommand(&_customDebugDrawCommand);
#endif //CC_SPRITE_DEBUG_DRAW
    }

}

到这里我们可以得出一个结论:

开始提出的问题,现在可以等价于

Sprite是如何将一个给予的图片,显示在屏幕上的。

相关文章推荐

07-渲染流程-3-Sprite渲染-判断是否裁剪分析

我们集中精力来看Sprite的draw() _insideBounds = transformUpdated ? renderer->checkVisibility(transform, _co...

07-渲染流程-4-Sprite渲染-渲染命令分析

如果在可视范围内,则需要执行render的addCommand命令 首先我们需要搞清楚两个对象   _quadCommand 和 renderer QuadCommand Sprite使用的...

cocos3.1源码分析(2)渲染流程分析

上一篇分析启动流程的时候,看到了最后是进入了一个是

cocos2dx TTF字体渲染流程

2dx支持几种格式的文字,如下: enum class LabelType { TTF, BMFONT, CHARMAP, S...

Cocos2Dx之渲染流程

渲染时一个游戏引擎最重要的部分。渲染的效率决定了游戏的流畅度清晰度,跟前面的介绍的内容相比,渲染是最具技术含量的事情,也是一个需要很多专业知识的事情。这里我们有这个机会,来学习下一个游戏引擎的渲染是怎...

Cocos2d-x3.2与OpenGL渲染总结和渲染流程

第一,渲染流程从2.x到3.x的变化。在2.x中,渲染过程是通过递归渲染树(Rendering tree)这种图关系来渲染关系图。递归调用visit()函数,并且在visit()函数中调用该节点的dr...

Cocos2dx_3.x新的渲染流程

第一,渲染流程从2.x到3.x的变化。     在2.x中,渲染过程是通过递归渲染树(Rendering tree)这种图关系来渲染关系图。递归调用visit()函数,并且在visit()函数中调用该...

cocos2dx的渲染流程(源码走读)

注意: 为了流程更加清晰,以下代码片段都是删除了其他无关的代码,只保留了与流程相关的函数调用。 1 main 中调用 run:int main() { AppDelegate app; ...

Cocos2d-x3.2与OpenGL渲染总结(一)Cocos2d-x3.2的渲染流程

这是一篇比较详细介绍Cocos2d-x3.2渲染过程的文章。
  • cbbbc
  • cbbbc
  • 2014年09月21日 22:36
  • 11512
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:07-渲染流程-2-HelloWorld分析
举报原因:
原因补充:

(最多只允许输入30个字)