cocos2dx完整运行过程_win32

原创 2016年06月01日 21:55:19

main函数作为所有C语言程序的入口 cocos2dx也不例外 在win32文件夹下我们可以看到 main.cpp这个文件 其中代码如下:


#include "main.h"
#include "AppDelegate.h"
#include "cocos2d.h"


USING_NS_CC;


int APIENTRY _tWinMain(HINSTANCE hInstance,//程序当前实例的句柄,以后随时可以用GetModuleHandle(0)来获得

                       HINSTANCE hPrevInstance,//这个参数在Win32环境下总是0,已经废弃不用了

                       LPTSTR    lpCmdLine,//指向以/0结尾的命令行,不包括EXE本身的文件名,

                       int       nCmdShow)//指定以什么方式显示主窗口
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);


    // create the application instance
    AppDelegate app;
    return Application::getInstance()->run();
}


我们来分别解释其中代码的含义:

APIENTRY:这个是一个宏定义 这个标明这里函数的从左到右的压栈约定 

 _tWinMain做为c语言程序的入口 

UNREFERENCED_PARAMETER(hPrevInstance);
 UNREFERENCED_PARAMETER(lpCmdLine);  //这两句表面再这里让编译器忽略hPrevInstance和IpCmdLine有定义但未使用的警告


//cocos2dx的真正运行

AppDelegate app;
return Application::getInstance()->run();

我们会发现我们所实例的app从来没有调用过 那么在这里有何用意呢?

一般有些编程经验的人可以推测出,这里应该是对 Application的构造函数的一个调用 那么如何才会调用到 Application的构造函数呢 ?是继承?还是组合? 我们看看源码

//AppDelegate源码

class  AppDelegate : private cocos2d::Application//很明显这里是继承 我们继续往上走 看看Application源码
{
public:
    AppDelegate();
    virtual ~AppDelegate();


    virtual void initGLContextAttrs();


    /**
    @brief    Implement Director and Scene init code here.
    @return true    Initialize success, app continue.
    @return false   Initialize failed, app terminate.
    */
    virtual bool applicationDidFinishLaunching();


    /**
    @brief  The function be called when the application enter background
    @param  the pointer of the application
    */
    virtual void applicationDidEnterBackground();


    /**
    @brief  The function be called when the application enter foreground
    @param  the pointer of the application
    */
    virtual void applicationWillEnterForeground();

{
public:
    AppDelegate();
    virtual ~AppDelegate();


    virtual void initGLContextAttrs();


    /**
    @brief    Implement Director and Scene init code here.
    @return true    Initialize success, app continue.
    @return false   Initialize failed, app terminate.
    */
    virtual bool applicationDidFinishLaunching();


    /**
    @brief  The function be called when the application enter background
    @param  the pointer of the application
    */
    virtual void applicationDidEnterBackground();


    /**
    @brief  The function be called when the application enter foreground
    @param  the pointer of the application
    */
    virtual void applicationWillEnterForeground();
};

Application源码

class CC_DLL Application : public ApplicationProtocol
{
public:
    /**
     * @js ctor
     */
    Application();
    /**
     * @js NA
     * @lua NA
     */
    virtual ~Application();


    /**
    @brief    Run the message loop.
    */
    int run();


    /**
    @brief    Get current applicaiton instance.
    @return Current application instance pointer.
    */
    static Application* getInstance();

.......

只贴了一部分

根据先前我们的分析 我们着重看构造函数 和 run函数 以及getInstance函数

Application * Application::sm_pSharedApplication = 0;


Application::Application()
: _instance(nullptr)
, _accelTable(nullptr)
{
    _instance    = GetModuleHandle(nullptr);
    _animationInterval.QuadPart = 0;
    CC_ASSERT(! sm_pSharedApplication);
    sm_pSharedApplication = this;
}

可以看到构造函数主要是一些变量的初始化 

Application* Application::getInstance()
{
    CC_ASSERT(sm_pSharedApplication);
    return sm_pSharedApplication;
}



getinstance函数 主要用于获取sm_pSharedApplication实例



int Application::run()
{
    PVRFrameEnableControlWindow(false);


    // Main message loop:
    LARGE_INTEGER nFreq;
    LARGE_INTEGER nLast;
    LARGE_INTEGER nNow;


    QueryPerformanceFrequency(&nFreq);
    QueryPerformanceCounter(&nLast);


    initGLContextAttrs();//初始化窗口信息


    // Initialize instance and cocos2d.
    if (!applicationDidFinishLaunching())//此处调用了这个函数 正式进入cocos2dx 
    {
        return 0;
    }


    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();


    // Retain glview to avoid glview being released in the while loop
    glview->retain();

//这里有一个循环 当窗口不需关闭时 进入循环体
    while(!glview->windowShouldClose())
    {
        QueryPerformanceCounter(&nNow);
        if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
        {
            nLast.QuadPart = nNow.QuadPart;
            
            director->mainLoop();//由mainloop进行维持
            glview->pollEvents();
        }
        else
        {
            Sleep(0);
        }
    }

//当我们要关闭窗口时接着运行以下的代码


    // Director should still do a cleanup if the window was closed manually.
    if (glview->isOpenGLReady())
    {
        director->end();//导演end
        director->mainLoop();//
        director = nullptr;
    }
    glview->release();//释放窗口
    return true;
}



由以上我们可以得到一个清晰的运行过程:

在win32文件下的 main.cpp文件中 先执行appdelegate app 调用其构造函数 以调用 application 构造函数 将  sm_pSharedApplication 初始化后 调用application 中的run 继而调用 applicationDidFinishLauching() 初始化 director和scene 在此函数内正式运行 scene 再由director->mainloop进行维持 当我们  手动关闭窗口时 进行资源回收 关闭窗口 也调用了director->end

cocos2dx在win32显示中文

  • 2012年10月28日 02:22
  • 8.96MB
  • 下载

HTML5游戏开发/微信游戏开发——Cocos2dx-js开发环境搭建(win32平台)

HTML5游戏开发/微信游戏开发——Cocos2dx-js开发环境搭建(win32平台) 一、须下载的软件/包 开发环境为xp sp3,cocos2d-x 3.0,用到以下软件 1、python2...

一步一步了解Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android)

cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑。每个比较大的版本变动,都会有不一样的项目创建方式,每次的跨度都挺大……   但是凭心而论,3.0RC...

COCOS2DX WIN32 版本的CPU占用25%改良策略

猜测它有可能是在主循环里使用了 Sleep(0), 一搜,果然定位到具体代码,它位于 cocos2dx\platform\win32\CCApplication.cpp,大致长像如下: ...

一步一步了解Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android)

一步一步了解Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android)   cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑。每个比...

Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android)

cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑。每个比较大的版本变动,都会有不一样的项目创建方式,每次的跨度都挺大……   但是凭心而论,3.0RC版本开...

cocos2dx 3.15 lua和c++版本 将win32项目打包到android平台遇见的坑与处理办法

D:\cocos_game\testlua\frameworks\runtime-src>cocos run -s . -p android 编译模式:debug 使用 Eclipse 工程:D:\c...

Cocos2dx 3.0 Android&Win32开发环境搭建

http://www.cnblogs.com/ShadowLoki/p/3679929.html 一步一步了解Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android) ...

使用dr.memory在win32环境下调试 cocos2dx 项目的内存异常

最近一周的时间在修改一个内存异常。这个异常feichangguiy
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2dx完整运行过程_win32
举报原因:
原因补充:

(最多只允许输入30个字)