从Cocos2d-x2迁移到Cocos2d-x3的过程分享

核心代码迁移相对顺利,大致流程如下:

一、创建项目

1) cd cocos2d-x-3.0rc0;
    2) 执行setup.py,设置引擎依赖的环境变量,脚本会将COCOS_CONSOLE_ROOT和ANT_ROOT写入到~/.bash_profile中; 执行source ~/.bash_profile使得环境变量生效;
    3) 在cocos2d-x-3.0rc0下建立projects目录;
    4) 利用cocos2d-console工具建立新项目: cocos new GameDemo -p com.tonybai.game.gamedemo -l cpp -d ./projects
    5) cd ./projects/GameDemo,我们可以看到项目目录结构如下:
    

代码如下:

bin/  Classes/  CMakeLists.txt  cocos2d/  proj.android/
      proj.ios_mac/  proj.linux/  proj.win32/  Resources/

6) 执行cocos compile -p android -j 4  –ap 19 -m release,这个Demo的apk就会被生成,大致就是一个cpp-empty-test;

二、 代码移植
   
     代码移植的主要工作包括:
    1) 改名
            带有CC前缀的类名大都要将前缀去掉;
            各主要类的单例方法sharedXXXX都改为getInstance;

2) 菜单、按钮事件处理      
            由menu_selector(GameScene::menuStartCallback) 改为CC_CALLBACK_1(GameScene::menuStartCallback, this);

3) 触屏事件处理

在Cocos2d-x 2.2.2中,我们直接使用Layer的setTouchEnabled(true),并Override 三个触屏事件处理函数;
            在新版引擎中,我们需要建立事件Listener,并将Listener注册到全局EventDispatcher中,诸如:

代码如下:

auto listener = EventListenerTouchOneByOne::create();
        listener->setSwallowTouches(true);
        listener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan, this);
        listener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved, this);
        listener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded, this);
        Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

然后将这里的三个事件处理方法实现出来即可。

核心功能迁移后,GameDemo在genymotion 4.4 Android模拟器以及真机上都能正常运行,在模拟器上能保持40左右的帧率,在真机上帧率一直在60左右。玩了一会后,感觉引擎渲染性能的确有提升, 而且这种提升是可以在真机上直观感受到的。

不过好景不长,我又尝试将GameDemo在genymotion 2.3.7 Android上运行,这回得到的结果却是:黑屏。 又将Cocos2d-x 3.0rc0自带的cpp-empty-test编译后放到模拟器上运行,得到了同样的黑屏结果,显然这可能是rc0的一个问题。在Cocos2d-x forum上粗略搜到的结果是:升级到最新版本可以解决黑屏问题。于是到官方下载目前最新发布版Cocos2d-x 3.0rc2。这里也吐槽一下:cocos2d-x引擎包Size太大了,似乎也没有提供什么patch文件,导致每发一个版本都要下载几百M的包。官方 git repository也太大了,尝试clone了几次都失败了,最终还只能下载源码的zip包。

Cocos2d-x 3.0rc2下载解压后,先编译了一下cpp-empty-test,然后部署到Android 2.3.7上运行,这回“黑屏”的确不见了,看来rc2修正了这个问题。接下来就是将我的GameDemo移植到rc2上了。

我用解压后的“cocos2d-x 3.0rc2”替换GameDemo下的cocos2d,然后运行cocos compile编译,install到模拟器行运行,程序启动失败,从monitor logcat中看到一行错误日志:

“ANativeActivity_onCreate not found”

怎么会呢?ANativeActivity_onCreate是由NDK的 native_app_glue static library提供的,怎么会找不到呢?

于是乎打开GameDemo/cocos2d/cocos/2d/platform/android/Android.mk打算查看一下究竟:


代码如下:

LOCAL_WHOLE_STATIC_LIBRARIES    := cocos_png_static cocos_jpeg_static cocos_tiff_static cocos_webp_static

include $(BUILD_STATIC_LIBRARY)

$(call import-module,jpeg/prebuilt/android)
$(call import-module,png/prebuilt/android)
$(call import-module,tiff/prebuilt/android)
$(call import-module,webp/prebuilt/android)

Android.mk内容中居然没有将native_app_glue列入,又翻看了一下cocos2d-x 3.0rc0中的同位置Android.mk,后者是有native_app_glue的库依赖的。难道是rc2这块忘记了?于是我尝试将 native_app_glue依赖加上:


代码如下:

LOCAL_WHOLE_STATIC_LIBRARIES   := android_native_app_glue cocos_png_static cocos_jpeg_static cocos_tiff_static cocos_webp_static

include $(BUILD_STATIC_LIBRARY)

$(call import-module,jpeg/prebuilt/android)
$(call import-module,png/prebuilt/android)
$(call import-module,tiff/prebuilt/android)
$(call import-module,webp/prebuilt/android)
$(call import-module,android/native_app_glue)

再次尝试编译,不过这次连编译都没能通过,错误的build结果如下:


代码如下:

/home1/tonybai/android-dev/adt-bundle-linux-x86_64/android-ndk-r9c/sources/android/native_app_glue/android_native_app_glue.c:232: error: undefined reference to 'android_main'
collect2: error: ld returned 1 exit status
make: *** [obj/local/armeabi/libgamedemo.so] Error 1

从结果来看,链接器没能找到native_app_glue中android_main对 应的函数体定义。android_main可是cocos2d-x 3.0引擎提供的实现啊。于是乎再次进入到rc2引擎代码中查找原因,结果却让我很是吃惊:“NativeActivity被引擎移除了”!cocos2d/cocos/2d/platform /android目录下面已经没有了nativeactivity.h和nativeactivity.cpp了:

代码如下:

$ ls -F cocos2d/cocos/2d/platform/android
Android.mk         CCApplication.h  CCDevice.cpp            CCFileUtilsAndroid.h  CCGLView.cpp  CCPlatformDefine.h  java/             jni/
CCApplication.cpp  CCCommon.cpp     CCFileUtilsAndroid.cpp  CCGL.h                CCGLView.h    CCStdC.h            javaactivity.cpp

我们看到了一个新文件:javaactivity.cpp,打开该文件,我们发现了和cocos2d-x 2.2.2版本类似的名字:Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit。难道rc2针对 Android平台的引擎入口代码回退到2.x版本的设计了?于是乎赶紧进到/cocos2d/cocos/2d/platform/android/java/src/org/cocos2dx/lib目 录下一看究竟。

果不其然,一切看起来都那么的熟悉:Cocos2dxActivity.java、Cocos2dxGLSurfaceView.java、 Cocos2dxRenderer.java….。自此可以断定,rc2中Android平台的引擎设计退回到了2.x版:
    – 你的GameActivity要集成Cocos2dxActivity;
    – mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer())时,GLThread(渲染线程)诞生
    – 死循环调用Cocos2dxRenderer.onDrawFrame
    – 引擎逻辑就在Cocos2dxRenderer.onDrawFrame中被执行。

回到了2.2.2版本设计的引擎在性能上是否会像rc0那样给人以直观提升的感觉呢,即便渲染器是新写的?真机测试的结果表明,没有直观感觉到提 升。难道是Native Thread(pthread_create创建)和Java Thread之间的差别?不得而知,后续慢慢体会吧。

另外要提一句:javaactivity.cpp将以往2.2.2版本放在项目jni中的 Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit挪到了引擎中,本来就是基本不变的代码, 放在引擎中的确更好。rc2的设计回归也有一定好处,一是以前对引擎的认识还适用,二呢就是适合集成在2.2.2版本中的第三方工具的方法应该同样适合3.0rc2版本,这样移 植成本估计会小些。这样我们针对新的3.0引擎,重点还是去关注渲染器、事件分发机制以及物理引擎的变化吧。

事实上NativeActivity是在rc1就被移除了,这种较大的改动让人始料不急。这么大的改动,这么短时间发布,让人对目前的 3.0引擎,至少是Android版本引擎的质量表示些许担忧啊。不知道3.0正式版中这块的代码会变啥样,拭目以待吧。

BTW,rc2版本cpp-empty-test在Android 2.3.7模拟器上的帧数在10帧以下,我的Demo也只有5帧,而在4.4版本模拟器上,可以达到40帧,还好还好。

(0)

相关推荐

  • 用于cocos2d-x引擎(ndk)中为android项目生成编译文件列表

    复制代码 代码如下: package com.leeass.generate; import java.io.File;import java.io.FileFilter;import java.io.FileNotFoundException; /** * 用于cocos2d-x引擎中android项目编译文件列表生成 * @author leeassamite * */public class GenerateAndroidMakefile { /** 分隔符 */ private stat

  • Cocos2d-x学习入门之HelloWorld程序

    一.前言: Cocos2d-x是目前非常流行的开源移动2D游戏框架.本文HelloWorld示例程序中使用的Cocos2d-x版本是2.0,主要实现一个简单的入门程序. 二.HelloWorld程序: HelloWorld程序是很多编程语言的入门程序,对于程序员来说非常重要. 打开本文项目后可以看到AppDelegate.h/.cpp和HelloWorldScene.h/.cpp四个文件,比一般初学编程看到的HelloWorld要稍显复杂. 具体代码如下: #include "AppDelega

  • Cocos2d-x入门教程(详细的实例和讲解)

    智能终端上的游戏目前风头正劲,试问哪个智能手机上没有几款企鹅公司出品的游戏呢!之前从未涉猎过游戏开发,但知道游戏开发前要挑选一款合适的游戏引擎,自己从头开始敲代码的时代已经out了.在寻觅游戏引擎之前,我需要回答三道摆在我面前的选择题: 1.2D引擎还是3D引擎?    2.平台专用引擎还是跨平台引擎?    3.收费引擎还是开源引擎? 作为入门级选手,2D游戏显然更适合上手一些,另外适合果果这个年龄段的幼教类的游戏也多以2D游戏居多.3D游戏本身也太难了,不仅要 Programming能力,还

  • Cocos2d-x 3.0中集成社交分享ShareSDK的详细步骤和常见问题解决

    给自己的手机游戏增加些社交分享功能,有助于游戏宣传和提升知名度,是一种不错的社交营销手段.国内这方面的第三方插件有不少,比如ShareSDK.友 盟分享组件.Baidu分享组件等,之前在研究2.2.2版本时,集成了ShareSDK这个组件,这次迁移到Cocos2d-x 3.0rc2依旧选择集成ShareSDK,这里就来说说集成的过程,遇到的一些问题以及解决方法.这里仅以Android平台游戏集成为例. 一.功能描述.SDK版本和帐号准备 功能大致是这样的:在游戏中设置一个按钮,点击这个按钮,弹出

  • Win7上搭建Cocos2d-x 3.1.1开发环境

    开发工具的准备 搭建开发环境需要安装工具包括 Visual Studio python ---(本教程以python2.7.3版本为例),下载地址:http://www.python.org/download/releases/2.7.3/. Cocos2d-x ---(本教程以cocos2d-x-3.0版本为例),下载地址:http://www.cocos2d-x.org/download/version#Cocos2d-x . 安装配置过程 Visual Studio 的安装过程这里就不介绍

  • Cocos2d-x的内存管理总结

    Cocos2d-x引擎的核心是用C++编写的,那对于所有使用该引擎的游戏开发人员来说,内存管理是一道绕不过去的坎. 关于Cocos2d-x内存管理,网上已经有了许多参考资料,有些资料写的颇为详实,因为在内存管理这块我不想多费笔墨,只是更多的将思路描述清楚. 一.对象内存引用计数 Cocos2d-x内存管理的基本原理就是对象内存引用计数,Cocos2d-x将内存引用计数的实现放在了顶层父类CCObject中,这里将涉及引用计数的CCObject的成员和方法摘录出来: 复制代码 代码如下: clas

  • Cocos2d-x 3.0多线程异步加载资源实例

    Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版,其引擎驱动核心依旧是一个单线程的"死循环",一旦某一帧遇到了"大活儿",比如Size很大的纹理资源加载或网络IO或大量计算,画面将 不可避免出现卡顿以及响应迟缓的现象.从古老的Win32 GUI编程那时起,Guru们就告诉我们:别阻塞主线程(UI线程),让Worker线程去做那些"大活儿"吧. 手机游戏,即便是休闲类的小游戏,往往也涉及大量纹理资源.音视频资

  • 从Cocos2d-x2迁移到Cocos2d-x3的过程分享

    核心代码迁移相对顺利,大致流程如下: 一.创建项目 1) cd cocos2d-x-3.0rc0:    2) 执行setup.py,设置引擎依赖的环境变量,脚本会将COCOS_CONSOLE_ROOT和ANT_ROOT写入到~/.bash_profile中: 执行source ~/.bash_profile使得环境变量生效:    3) 在cocos2d-x-3.0rc0下建立projects目录:    4) 利用cocos2d-console工具建立新项目: cocos new GameD

  • 将Django使用的数据库从MySQL迁移到PostgreSQL的教程

    我们已对 Django1.6 app完成了数据库从mysql到PostgreSQL的迁移,如果你的环境很干净,这个过程就会很简单,只要允许syncdb 或者 migrate创建表,truncating表中的数据,然后运行dumpdata 和loaddatamanagement命令就完成了. 第一步,在你的PostgreSQL数据库中创建一个空的实例: CREATE DATABASE dbname OWNER rolename; 第二步,在你的Django中给创建的数据库加上配置 在setting

  • docker镜像导入导出备份迁移的操作

    导出: docker save -o centos.tar centos:latest #将centos:latest镜像导出为centos.tar文件 导入: docker load -i centos.tar #加载centos.tar,加载后的镜像各标签与原导出的镜像标签相同 补充知识:docker将镜像保存为tar文件 将单个文件保存为tar文件,并加载到本地 docker save ****.v1 > images.tar docker load < images.tar 将多个文件

  • 通过LogMiner实现Oracle数据库同步迁移

    目录 通过LogMiner实现Oracle数据同步迁移 一.实现过程 1.创建目录 2.配置LogMiner 3.开启日志追加模式 4.重启数据库 5.创建数据同步用户 6.创建数据字典 7.加入需要分析的日志文件 8.查看正在使用的日志文件 9.使用Lominer分析日志 10.查看分析结果 11.常见问题 通过LogMiner实现Oracle数据同步迁移 为了实现Oracle数据库之间的数据同步,网上的资料比较少的时候.最好用的Oracle数据库同步工具是:GoldenGate ,而Gold

  • 浅谈将three项目迁移至vue项目遇到的问题

    目录 通过npm下载的three依赖无法正常使用 导入模型的路径出现了问题 3D场景渲染后没有进行销毁 由于我的3D场景起初是自己为了测试搭建的,所以使用的是html + three,后来将代码迁移到vue项目的过程中出现了下面的几个问题: 通过npm下载three依赖无法正常使用 导入模型的路径出现了问题,导致模型无法正常渲染 3D场景渲染后没有进行销毁 通过npm下载的three依赖无法正常使用 在原项目中使用的是three相关的js文件,而迁移项目的时候本来准备直接通过npm下载相关依赖进

  • VPS主机快速搬家方法:边打包边传输边解压适合大中型论坛网站

    博客网站搬家总体做法就是将原空间上的程序代码和图片附件等所有文件移动到新的主机空间上,MysqL数据库文件也要搬家到新的空间上的数据库中,最后调整一下数据库配置文件和域名的DNS解析,等DNS生效后就算是完成网站搬家了. 但是在实际操作的过程中,遇到的最大的困难应该是文件打包下载和上传解压,对于一些大中型论坛或者网站,数据文件可能高达GB以上,MysqL数据库也可能非常大,用FTP来下载和上传文件和用PhpMyAdmin导入MysqL不仅浪费时间,还会经常崩溃失败. 本篇文章部落将为大家分享如何

  • 极酷的javascirpt,让你随意编辑任何网页

    javascript 的编程有时会非常有趣,其情形可以参考我们的煎蛋大师傅 sein 在偶然得知了一个 javascript 秘籍后的兴奋癫狂状(下面的留言更值得一看),现在有人挖掘出了一个蛮酷的技巧,只要打开一个网站,然后在地址栏内打入: 复制代码 代码如下: javascript:document.body.contentEditable='true'; document.designMode='on'; void(0) 请将其中的全角符号改为半角,回车,OK,你就可以随意编辑这个这个页面了

  • viewstate和datatable动态录入数据示例

    复制代码 代码如下: <%@ Page Language="C#" EnableViewState="true" %><%@ Import Namespace="System.Data" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xht

  • Cocos2d-x中使用CCScrollView来实现关卡选择实例

    类似关卡选择的这种功能游戏中经常看到,比如帮助场景,选择关卡,通过滑动的方式选择一些其他的东西等等.今天我们实现关卡的选择是使用CCScrollView这个类.当然还有一些其他的方法,比如使用cocostudio的page view也可以.我先说下整体的思路,CCScrollView这个类是继承自CCLayer的,本身的触摸事件有些bug,所以网上一般将这个层的touch事件处理为false,而使用它的父节点来处理触摸事件,我们也是采用这个做法.先定义一个LevelScene类,将CCScrol

  • Cocos2d-x中实现弹出对话框示例

    在游戏中我们经常会看到弹出一个对话框让我们进行选择,今天我们就在cocos2dx中实现这个对话框.对话框说白了也是一个层,当我们点击某一个按钮的时候这个层被加进了当前的场景中,同时场景中的其他的层都是不可点击的,这个时候就涉及到触摸的优先级的一些问题,当然有些时候你也可以根据自己的需要让其他的层也可以点击,但是道理都是一样的,学会了这个其他的按照自己的要求去实现吧.下面我将弹出层单独分装成一个类,供我们调用. /*对话框场景类的头文件*/ #ifndef _POP_SCENE_H_ #defin

随机推荐