如果在可视范围内,则需要执行render的addCommand命令
首先我们需要搞清楚两个对象 _quadCommand 和 renderer
QuadCommand
Sprite使用的QuadCommand进行渲染,所以要了解Sprite是如何被渲染出来的,就要深入看QuadCommand的代码了。
Renderer
renderer->addCommand(&_quadCommand);
addCommand发生了什么呢?
在Renderer内部有一个
std::vector<RenderQueue> _renderGroups;
addCommand 其实就是在栈顶的RenderQueue添加RenderCommand
我们再来看看RenderQueue
维护了RenderCommand,在我们这个Demo中,只需要关注 _queue0 即可
渲染的时机
我们再来看看 Director::mainLoop 吧,如果合适,就会做两件事情
1.drawScene
2.内存池释放
所以渲染的关键地方在于 drawScene
显然,渲染的时机现在我们可以粗略的分为两部分:
1.遍历Node树,收集渲染命令,渲染命令保存在了_renderer对象的当前栈顶的 RendQueue中
Node树的根节点永远是当前Scene对象
2.执行 _renderer->render()
进行排序后,然后就具体渲染,基本可以分为两步:
1.遍历保存的RenderCommand
2.flush 执行批次渲染命令
在HelloWorld中:
1.遍历保存的RenderCommand,找到了渲染的QuadCommand命令,并保存在了
std::vector<QuadCommand*> _batchedQuadCommands;
2.flush
调用了 void Renderer::drawBatchedQuads()
然后从QuadCommand中获取渲染的数据,调用对应的OpenGL接口进行绘制。
所以接下来我们需要重点分析一下
QuadCommand 和 对应的 渲染接口