
1 啟動
在iOS系統中,由main函數啟動默認調用了AppController
main.m NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, @"AppController"); [pool release]; return retVal;
2 AppController
iOS的ViewController都熟悉吧,iOS程序的基礎Controller 。
1. 初始化Application
cocos2d::Application *app = cocos2d::Application::getInstance(); app->initGLContextAttrs(); cocos2d::GLViewImpl::convertAttrs();
2. 初始化OpenGLView, 在iOS下使用OpenGL必須實現一個EAGLLayer 的View 我們這里就叫它EAGView吧,
這個View是OpenGL 最終顯示的畫布, 在這里我們以初始化了與OpenGL相關的工作。
如:
1>初始化EAGLContext
2> RenderBuffer
3> FrameBuffer
4> 關聯RenderBuffer 與FrameBuffer
5> 在這個View里有一個swapBuffer 其實就是 [context RenderBuffer:GL_RenderBuffer], 這個函數在每個渲染循環都要調用, 主要是在Director::drawScene 里調用。 drawScene 是在下面要說到的run 里調用了iOS自更新函數displayLinker:mainLoop來實現的。
// Override point for customization after application launch. // Add the view controller's view to the window and display. window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; // Init the CCEAGLView CCEAGLView *eaglView = [CCEAGLView viewWithFrame: [window bounds] pixelFormat: (NSString*)cocos2d::GLViewImpl::_pixelFormat depthFormat: cocos2d::GLViewImpl::_depthFormat preserveBackbuffer: NO sharegroup: nil multiSampling: NO numberOfSamples: 0 ]; // Use RootViewController manage CCEAGLView _viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil]; _viewController.wantsFullScreenLayout = YES; _viewController.view = eaglView;
3. cocos:GLView 代理模式,代理了之前我們創建的CCEAGLView對象, 這樣我們就可以轉到使用統一的cocos的GLView了, 后面又把這個GLView給了director。 這樣我們director及GLView就都算是初始化了。
// IMPORTANT: Setting the GLView should be done after creating the RootViewController cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView(eaglView); cocos2d::Director::getInstance()->setOpenGLView(glview);
4. 最主要的程序主循環mainLoop()
這里調用的是Application->run。 這個run最后用調用 到director的mainLoop, 從這里開始程序的控制權正式歸入到director手中。
app->run(); int Application::run() { if (applicationDidFinishLaunching()) { [[CCDirectorCaller sharedDirectorCaller] startMainLoop]; } return 0; } -(void) startMainLoop { // Director::setAnimationInterval() is called, we should invalidate it first [self stopMainLoop]; displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:selfselector:@selector(doCaller:)]; [displayLink setFrameInterval: self.interval]; [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; } -(void) doCaller: (id) sender { cocos2d::Director* director = cocos2d::Director::getInstance(); [EAGLContext setCurrentContext: [(CCEAGLView*)director->getOpenGLView()->getEAGLView()context]]; director->mainLoop(); }