请选择 进入手机版 | 继续访问电脑版
搜索
查看: 207|回复: 0

Cocos2d-x Android启动过程分析

[复制链接]

9

主题

64

帖子

408

积分

超级版主

Rank: 8Rank: 8

积分
408
发表于 2016-11-29 16:40:26 | 显示全部楼层 |阅读模式
本帖最后由 MatchVS官方客服 于 2016-11-29 16:41 编辑



Cocos2dxActivity" style="margin-top: 20px; color: rgb(51, 51, 51); line-height: 20px; font-family: Arial, sans-serif;">所有android平台运行的APP必然有一个主Activity,分析的启点就是cocos引擎android平台的MainActivity->Cocos2dxActivity


1.so加载

在Cocos2dxActivity的onCreate方法,Coco做的第一件事情就是加载SO

调用onLoadNativeLibraries()方法 从XML文件中读取so的名字并加载 (这里调用了一个java api 加载SO文件  :system.loadlibrary());

加载SO后 根据JNI的特性 最终会调用到 cocos_android_app_init(JniHelper::getEnv());方法

这个方法内部做的事情很简单,构建一个AppDelegate类实例

AppDelegate *pAppDelegate = new AppDelegate();

这是Cocos2d在android平台上被调用的第一个类.(资源预加载的控制点一)


2.系统参数配置初始化和Android部分初始化

加载SO后就是 初始化系统硬件,设备相关参数(Video WebView EditText Accelerometer... ) ,

其中我们关注的是资源路径的设置.

Cocos打出来的android包资源是未经过预编译的,放在asset目录下

资源路径通过下面代码配置

Cocos2dxHelper.sFileDirectory = activity.getFilesDir().getAbsolutePath();
Cocos2dxHelper.nativeSetApkPath(applicationInfo.sourceDir);


配置读取完成后然后再看引擎启动部分的代码:

UI部分的初始化是利用Android GLSrufaceView的特性在OnCreateSurfaceView中触发(资源预加载的控制点二)

Cocos2dxRenderer.nativeInit(this.mScreenWidth, this.mScreenHeight);

这个部分的实现交给了c++. 具体实现文件在:javaactivity-android.cpp:

Cocos2dxRenderer_nativeInit(JNIEnv*  env, jobject thiz, jint w, jint h);

这个方法中间会调用

     cocos2d::Application::getInstance()->run();

来完成cocos引擎启动的最后一步

run的实现在实现了ApplicationProtocol接口的类中,只做了一件事情:

// Initialize instance and cocos2d.
if (! applicationDidFinishLaunching())


3.Cocos C++ 导演类(核心类)的启动

在bool AppDelegate::applicationDidFinishLaunching()的实现中.Cocos生成的模板代码包含如下一些东西资源预加载的控制点三)

// initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::createWithRect("Cocos2dSample", Rect(0, 0, 480, 800));
director->setOpenGLView(glview);
}

从这里引擎的启动就结束了.后面是游戏的具体逻辑.如加载资源,加载主场景等


4.主场景和资源加载(资源预加载的控制点四)

//加载初始化场景

auto scene = HelloWorld::createScene();

// run
director->runWithScene(scene);



5.UI界面的更新频率(FPS)控制

关于这块,游戏同步中可能会用到

cocox引擎的主线程是由android的上层的线程驱动的.可以控制的刷新帧率

cocos2d:irector::getInstance()->mainLoop();





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|MatchVS开发者论坛

GMT+8, 2017-4-27 01:35 , Processed in 0.066216 second(s), 21 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表