关闭

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

148人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13001次
    • 积分:724
    • 等级:
    • 排名:千里之外
    • 原创:62篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条