应用程序类 CocosApplication 源码分析

CocosApplication 是 Cocos Creator 引擎的核心组件之一,主要负责管理应用程序的生命周期和初始化引擎,它是 Cocos Creator 引擎与原生平台之间的桥梁。

CocosApplication 类的主要职责包括:

  1. 初始化引擎
  2. 管理应用程序生命周期(启动、暂停、恢复、关闭)
  3. 处理脚本执行和异常
  4. 创建和管理窗口
  5. 注册和处理引擎事件

CocosApplication 类构造和析构

构造函数

CocosApplication::CocosApplication() {
    _engine = BaseEngine::createEngine();
}

这是 CocosApplication 类的构造函数,它通过调用 BaseEngine::createEngine() 创建了一个引擎实例。这个引擎实例是整个 Cocos Creator 引擎的核心,负责管理游戏循环、渲染、资源加载等关键功能。

CocosApplication.cpp:31:35

析构函数

CocosApplication::~CocosApplication() {
    unregisterAllEngineEvents();
}

析构函数调用了 unregisterAllEngineEvents() 方法,用于注销所有注册的引擎事件,确保在应用程序关闭时正确清理资源。

CocosApplication.cpp:36:40

unregisterAllEngineEvents 方法

void CocosApplication::unregisterAllEngineEvents() {
    if (_engine != nullptr) {
        _engine->off(_engineEvents);
    }
}

这个方法用于注销所有引擎事件监听器,防止内存泄漏。它检查引擎实例是否存在,如果存在则移除所有事件监听。

CocosApplication.cpp:41:46

init 方法分析

init 方法是 CocosApplication 类中最重要的方法之一,负责初始化整个应用程序和引擎。让我们详细分析这个方法的实现:

int CocosApplication::init() {
    if (_engine->init()) {
        return -1;
    }
    unregisterAllEngineEvents();

    _systemWindow = CC_GET_MAIN_SYSTEM_WINDOW();

    _engineEvents = _engine->on<BaseEngine::EngineStatusChange>([this](BaseEngine * /*emitter*/, BaseEngine::EngineStatus status) {
        switch (status) {
            case BaseEngine::ON_START:
                this->onStart();
                break;
            case BaseEngine::ON_RESUME:
                this->onResume();
                break;
            case BaseEngine::ON_PAUSE:
                this->onPause();
                break;
            case BaseEngine::ON_CLOSE:
                this->onClose();
                break;
            default:
                CC_ABORT();
        }
    });

    se::ScriptEngine *se = se::ScriptEngine::getInstance();

    jsb_init_file_operation_delegate();

    se->setExceptionCallback(
        std::bind(&CocosApplication::handleException, this, // NOLINT(modernize-avoid-bind)
                  std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));

    jsb_register_all_modules();
#if CC_EDITOR
    auto isolate = v8::Isolate::GetCurrent();
    se->start(isolate);
#else
    se->start();
#endif

#if (CC_PLATFORM == CC_PLATFORM_IOS)
    auto logicSize = _systemWindow->getViewSize();
    IScreen *screen = _engine->getInterface<IScreen>();
    float pixelRatio = screen->getDevicePixelRatio();
    uint32_t windowId = _systemWindow->getWindowId();
    events::Resize::broadcast(logicSize.width * pixelRatio, logicSize.height * pixelRatio, windowId);
#endif
    return 0;
}

CocosApplication.cpp:47:90

init 方法详解

  1. 引擎初始化

    if (_engine->init()) {
        return -1;
    }
    

    首先调用引擎的 init() 方法进行初始化。如果初始化失败,返回 -1 表示错误。

  2. 事件注销

    unregisterAllEngineEvents();
    

    在重新注册事件之前,先注销所有已有的引擎事件。

  3. 获取系统窗口

    _systemWindow = CC_GET_MAIN_SYSTEM_WINDOW();
    

    通过宏 CC_GET_MAIN_SYSTEM_WINDOW() 获取主系统窗口接口,用于后续的窗口操作。

  4. 注册引擎状态变化事件

    _engineEvents = _engine->on<BaseEngine::EngineStatusChange>([this](BaseEngine * /*emitter*/, BaseEngine::EngineStatus status) {
        switch (status) {
            case BaseEngine::ON_START:
                this->onStart();
                break;
            case BaseEngine::ON_RESUME:
                this->onResume();
                break;
            case BaseEngine::ON_PAUSE:
                this->onPause();
                break;
            case BaseEngine::ON_CLOSE:
                this->onClose();
                break;
            default:
                CC_ABORT();
        }
    });
    

    注册引擎状态变化事件监听器。当引擎状态发生变化时(启动、暂停、恢复、关闭),会调用相应的处理方法。

  5. 获取脚本引擎实例

    se::ScriptEngine *se = se::ScriptEngine::getInstance();
    

    获取脚本引擎实例,用于执行 JavaScript 代码。

  6. 初始化文件操作委托

    jsb_init_file_operation_delegate();
    

    初始化文件操作委托,为 JavaScript 提供文件操作能力。

  7. 设置异常回调

    se->setExceptionCallback(
        std::bind(&CocosApplication::handleException, this, // NOLINT(modernize-avoid-bind)
                  std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
    

    设置脚本引擎的异常回调函数,当 JavaScript 代码抛出异常时会调用 handleException 方法。

  8. 注册所有模块

    jsb_register_all_modules();
    

    注册所有 JavaScript 模块,使 JavaScript 代码可以访问 C++ 实现的功能。

  9. 启动脚本引擎

    #if CC_EDITOR
    auto isolate = v8::Isolate::GetCurrent();
    se->start(isolate);
    #else
    se->start();
    #endif
    

    启动脚本引擎。在编辑器模式下需要传递 V8 的 isolate 实例。

  10. iOS 特定初始化

    #if (CC_PLATFORM == CC_PLATFORM_IOS)
    auto logicSize = _systemWindow->getViewSize();
    IScreen *screen = _engine->getInterface<IScreen>();
    float pixelRatio = screen->getDevicePixelRatio();
    uint32_t windowId = _systemWindow->getWindowId();
    events::Resize::broadcast(logicSize.width * pixelRatio, logicSize.height * pixelRatio, windowId);
    #endif
    

    对于 iOS 平台,进行特定的初始化操作,包括获取视图大小、像素比例,并广播窗口大小变化事件。

其他重要方法

run 方法

int32_t CocosApplication::run(int argc, const char **argv) {
    CC_UNUSED_PARAM(argc);
    CC_UNUSED_PARAM(argv);
    return _engine->run();
}

run 方法启动应用程序的主循环。它忽略传入的命令行参数,并调用引擎的 run() 方法启动游戏循环。

CocosApplication.cpp:91:96

pause 和 resume 方法

void CocosApplication::pause() {
    _engine->pause();
}

void CocosApplication::resume() {
    _engine->resume();
}

这两个方法分别用于暂停和恢复应用程序。它们直接调用引擎的相应方法。

CocosApplication.cpp:97:104

restart 方法

void CocosApplication::restart() {
    _engine->restart();
}

restart 方法用于重启应用程序,调用引擎的 restart() 方法。

CocosApplication.cpp:121:124

close 方法

void CocosApplication::close() {
    _systemWindow->closeWindow();
}

close 方法用于关闭应用程序窗口,调用系统窗口的 closeWindow() 方法。

CocosApplication.cpp:133:136

事件处理方法

onStart, onResume, onPause, onClose 方法

void CocosApplication::onStart() {
    // TODO(cc): Handling engine start events
}

void CocosApplication::onPause() {
    // TODO(cc): Handling pause events
}

void CocosApplication::onResume() {
    // TODO(cc): Handling resume events
}

void CocosApplication::onClose() {
    _engine->close();
}

这些方法是引擎状态变化事件的处理函数。当引擎状态变为启动、暂停、恢复或关闭时,会调用相应的方法。目前这些方法的实现是空的,需要在子类中重写以实现具体的功能。

CocosApplication.cpp:140:158

辅助方法

setDebugIpAndPort 方法

void CocosApplication::setDebugIpAndPort(const ccstd::string &serverAddr, uint32_t port, bool isWaitForConnect) {
    // Enable debugger here
    jsb_enable_debugger(serverAddr, port, isWaitForConnect);
}

设置调试器的 IP 地址和端口,启用调试功能。

CocosApplication.cpp:159:164

runScript 方法

void CocosApplication::runScript(const ccstd::string &filePath) {
    jsb_run_script(filePath);
}

执行指定路径的脚本文件。

CocosApplication.cpp:166:169

handleException 方法

void CocosApplication::handleException(const char *location, const char *message, const char *stack) {
    // Send exception information to server like Tencent Bugly.
    CC_LOG_ERROR("\nUncaught Exception:\n - location :  %s\n - msg : %s\n - detail : \n      %s\n", location, message, stack);
}

处理脚本引擎抛出的异常,记录错误信息。

CocosApplication.cpp:170:176

setXXTeaKey 方法

void CocosApplication::setXXTeaKey(const ccstd::string &key) {
    jsb_set_xxtea_key(key);
}

设置 XXTEA 加密密钥。

CocosApplication.cpp:177:180

createWindow 方法 (Windows/Linux/Mac 平台)

#if CC_PLATFORM == CC_PLATFORM_WINDOWS || CC_PLATFORM == CC_PLATFORM_LINUX || CC_PLATFORM == CC_PLATFORM_QNX || CC_PLATFORM == CC_PLATFORM_MACOS
void CocosApplication::createWindow(const char *title, int32_t w,
                                    int32_t h, int32_t flags) {
    _systemWindow->createWindow(title, w, h, flags);
}

void CocosApplication::createWindow(const char *title,
                                    int32_t x, int32_t y, int32_t w,
                                    int32_t h, int32_t flags) {
    _systemWindow->createWindow(title, x, y, w, h, flags);
}
#endif

为 Windows、Linux 和 Mac 平台定义了创建窗口的方法。

CocosApplication.cpp:181:193

总结

CocosApplication 是 Cocos Creator 引擎与原生平台交互的核心文件之一。它定义的 CocosApplication 类负责管理应用程序的生命周期,初始化引擎,处理脚本执行和异常,以及创建和管理窗口。

init 方法是这个类中最重要的方法,它完成了以下关键任务:

  1. 初始化引擎
  2. 注册引擎状态变化事件
  3. 初始化脚本引擎
  4. 设置异常处理
  5. 注册所有 JavaScript 模块
  6. 启动脚本引擎
  7. 处理平台特定的初始化(如 iOS)

通过这些功能,CocosApplication 类为 Cocos Creator 引擎提供了一个稳定的基础,使得开发者可以专注于游戏逻辑的实现,而不需要关心底层的平台细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值