概述
前面的一篇文章介绍了如何使用 cocos creator 创建 HelloWorld 工程,本文就来简单分析一下这个工程,以便对 cocos 引擎的工作原理有个初步的了解。
项目结构
https://docs.cocos.com/creator/2.2/manual/zh/getting-started/project-structure.html
Android 工程文件
Android 工程目录在 HelloWorld/build/jsb-link/frameworks/runtime-src/proj.android-studio
目录下面,我们先从 settings.gralde 中看看它包含哪些模块:
1 | include ':libcocos2dx',':game', ':instantapp' |
game 和 instantapp 模块可以先不用去管,下面我们主要分析的就是 hello_world 和 libcocos2dx 模块了,hello_world 是我们的 app 模块,libcocos2dx 是引擎中关于 Android 平台的相关类。
另外,和 proj.android-studio 同级有个 Classes 目录,里面的 AppDelegate.cpp、AppDelegate.h、jsb_module_register.cpp 文件也是我们工程需要的文件,后面会介绍。
APK 目录
1 | ├── AndroidManifest.xml |
assets 目录中是游戏相关的文件,这些文件是从来的呢?我们先来看一下 Android 工程中的 build.gradle 文件中相关的一段代码:
1 | android.applicationVariants.all { variant -> |
编译时,从cocos游戏工程的 build/jsb-link 目录中把相关的文件打包到 assets 目录。
这个 outputDir 目录就是build/jsb-link/frameworks/runtime-src/proj.android-studio/app/build/intermediates/merged_assets/debug/mergeDebugAssets/
至于这些文件何时加载,后面将会详细的介绍。
jni 部分
来看一下工程根目录下面的 jni 目录,里面的文件列表如下:
1 | ├── CocosAndroid.mk |
1 | //CocosAndroid.mk |
把上面的 hellojavascript/main.cpp
文件和 runtime-src/Classes
目录下面的 AppDelegate.cpp 和 jsb_module_register.cpp 三个文件编译生成 libcocos2djs.so。
AppDelegate.cpp 中定义了 AppDelegate 类,该类继承自 cocos/platfrom/android/CCApplication-android.cpp 中的 Application 类。
AppDelegate 类是游戏程序的入口,主要用于游戏程序的逻辑初始化,并创建运行程序的入口界面(即第一个游戏界面场景)。这部分的源码分析后面再详细介绍。
AppDelegate 类在 main.cpp 中的 cocos_android_app_init 方法中初始化:
1 | // main.cpp |
那么 cocos_android_app_init 方法在哪里被调用呢?在cocos引擎的 cocos/platfrom/android/jni/JniImp.cpp 中的 nativeInit
方法中被初始化。这部分等后面的渲染流程中详细介绍。
Java 部分
工程中 AppActivity 继承自 Cocos2dxActivity,除了在 onCreateView
中创建了 Cocos2dxGLSurfaceView 实例,其他并没有做什么工作,那么,我们就来看看 Cocos2dxActivity 类。
Cocos2dxActivity 主要就是创建了一个 Cocos2dxGLSurfaceView,并把它加入到 contentView 中去,由 Cocos2dxGLSurfaceView 对游戏进行渲染。
下面先对 onCreate 方法进行一些解释:
1 | @Override |
1 | public void init() { |
Cocos2dxRenderer
下面来看看渲染器 Cocos2dxRenderer 类:
1 | @Override |
onSurfaceCreated 方法里面主要调用了 Cocos2dxRenderer.nativeInit
本地方法对做一些引擎的初始化工作。
1 | @Override |
onDrawFrame 每一帧都会调用一次来进行帧面面的渲染,渲染的方法主要是调用本地方法 Cocos2dxRenderer.nativeRender()
。
我们从 Cocos2dxRenderer 类中可以看到有很多的native 方法,这些方法会调用的c++实现的引擎中去,是我们研究cocos引擎游戏渲染的关键,后面我们会详细介绍。
总结
本文我们主要对 HelloWorld 工程进行了概要的介绍。接下来将会深入到 cocos 引擎,介绍一些它的实现原理。