• 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();
    }
  • 相关阅读:
    windows蓝屏错误小全
    大数据量下高并发同步的讲解(不看,保证你后悔)
    本地或者服务器同时启动2个或多个tomcat
    如何在同一系统里同时启动多个Tomcat
    Java配置----JDK开发环境搭建及环境变量配置
    Tomcat8内置jdk8运行环境发布web项目
    Tomcat 部署项目的三种方法
    Java Web(五) JSP详解(四大作用域九大内置对象等)
    Java 四大作用域总结
    JSP九大隐式对象
  • 原文地址:https://www.cnblogs.com/liangzhimy/p/4422007.html
Copyright © 2020-2023  润新知