1.AppControler完成加载后
2.调用了Director,设置了OpenglView,投影的设置就在这个过程里面。
3.调用Application::run
4.在开始运行程序之前,首先调用了基础了Application的Appdelegate的applicationDidFinishLaunching方法
5.new一个新的Scene,并runScene,此时Director中存在了一个需要渲染的树
6.然后开启一个无休止的循环mainLoop
7.在Director::mainLoop中,需要完成两件事情
1.drawScene 渲染整个场景树
2.PoolManager中clear引用计数的autoRelease
之后游戏的就全部放在了mainloop中进行处理,所以比较复杂的所有的逻辑都在drawScene中体现.
问题:
1.AppControler是如何执行的?
2.AppController 和 RootViewController 分析
AppController 是针对UIApplicationDelegate的处理,也就是系统加载完成后需要执行的 finish enterBackground enterForeground 等
而 RootViewController 则是针对UIViewController,主要针对的是视图相关的,最重要的是横版和竖版的时候,修改屏幕的大小(长宽)。
3.app controllerdidFinishLaunchingWithOptions
create window
create CCEAGLView
create RootViewController 来管理CCEAGLView
隐藏了IOS的状态条
接着进入了cocos2dx
首先 create cocos2d::GLView -> 通过CCEAGLView来创建
Director:: setOpenGLView
cocos2d::Application -> run
4.drawScene
最终调用了 Node::visit
voidNode::visit(Renderer* renderer,constMat4&parentTransform,boolparentTransformUpdated)
在visit内部,主要逻辑是递归访问child,处理每一个child的render
f have no child 就是叶子节点
draw self
else
对child按照zorder排序
首先绘制 zorder < 0的
然后绘制自己
然后绘制 zorder > 0的
而针对每一个节点,真正的渲染,会自动进入到
virtualvoiddraw(Renderer*renderer,constMat4& transform,booltransformUpdated);
完整渲染流程图