1 cocos2dx源碼分析-程序啟動與主循環


 
 
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();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM