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

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是如何将一个给予的图片,显示在屏幕上的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值