Cocos2dx3.10游戏移植到Windows平台遇到的坑总结

前言:由于公司项目需要将Cocos2dx游戏移植到Windows平台,之前一直只是移植IOS和Android,第一次尝试移植到Windows平台,并且使用到JNI调用第三方SDK的jar包,因此遇到无数的坑,这里做一个总结!(完全是小白摸索之路啊。。。)

PS:引擎源码使用的Cocos2dx3.10,操作系统win7 64位, VS2013,jdk 1.7 32位


一、Cocos2dx工程文件太大,在Windows上使用sourceTree里check不下来?(第一次用windows版的sourcetree,不知道是软件问题还是配置问题,卡到爆,砸电脑的心都有)

在Cocos2dx项目中包含了各个平台的工程目录,移植到过平台之后都会编译生成对应平台相关的文件,导致整个项目文件夹内容越来越大,在windows平台上就很难将项目check下来。因此提交代码的时候最好只提交代码和资源以及最简单的工程配置文件,而不要提交编译后自动生成的文件夹,(比如Android studio工程中gen目录、bin目录已经生成的.so动态库;windows工程目录下编译生成的Debug.win32和Release.win32文件夹已经log日志文件等),这些文件都可以在重新编译后自动生成,且非常大,一般都是一两个G,完全没必要。


二、中文编码问题?

先编译生成一遍win32工程,有中文的文件会提示编码错误,将文件在“高级选项设置”中保存为UTF-8带签名模式。如果代码中使用到中文了,出现中文乱码的问题,可以考虑使用XML文件配置后,在代码中读取,这个问题网上教程很多!这样也方便实现国际化。

PS:1、在XML文件中配置的中文如果带有空格,在Windows中显示出来会比在IOS和Android中要宽一半。

2、不建议在代码中使用中文注释,有时候会出现有中文注释的下一行代码没有执行,这种莫名其妙的错误很坑,又不会明显报错,表面看上去没有任何问题;将中文注释删除,再次运行就可以了。

3、如果将XCode工程生成的源文件移植到windows平台,改了编码格式之后,中文就能正常显示;但是在windows平台下开发新建的文件默认保存格式为简体中文,再移植到XCode中,中文就会显示一串乱码。所以如果全用英文,就不存在这种问题了。


三、使用到JNI调用第三方的SDK jar包,无法实例化JVM?

首先确定JDK环境配置是否正确。如果你最终要打包生成.exe可执行文件,那么代码和工程中配置就不能使用绝对路径了。

详细步骤请参考另一篇博客:http://blog.csdn.net/u013058216/article/details/53028862


四、使用JNI后回调到Cocos2dx中执行逻辑,游戏图片纹理变成黑色或者crash ?

问题描述:1、如果在回调中执行了改变精灵纹理的操作,那么纹理会变成黑色。

  2、如果在回调中执行了帧动画,游戏crash。

原因:jni回调回来是在子线程中执行的,但是opengl es的API不是线程安全的,因此只能保证在cocos主线程中执行才是安全的。如果回调中使用到纹理等操作,就要想办法将这段处理逻辑转到主线程中去执行。这里刚开始接触cocos 多线程时,就走了弯路! 开始为了方便,直接将逻辑放在CallFunc::create()方法中,用action包装一下,当做一个p普通的actiton对象使用,开始的时候感觉很正常。但是后面发现,程序偶尔会crash到源码中ActionManager类的update方法里,在遍历节点的actions时会出异常。看注释:

// The 'actions' MutableArray may change while inside this loop. 提示很明显,jni回调触发的时机不确定,在遍历的过程中actions有改动,但是也不是100%会触发,而且概率相对还很小。 因此这种方法治标不治本,走了弯路。最后再阅读引擎源码HttpClient类时,了解源码中的多线程处理方式后,就发现了一个Schedule类中有这么一个方法:

voidScheduler::performFunctionInCocosThread(conststd::function<void ()> &function),看这货的名字就知道,就是专门往cocos主线程中插入用的。具体使用流程可参考HttpClient类

了解更多cocos多线程原理,可以参考这篇博客:http://blog.csdn.net/u013058216/article/details/53117748


五、如何监听游戏退出?

如果想在游戏退出之后,做一些资源清理工作,做必须要监听程序退出,在网上搜了好久,也没怎么看明白!(主要是对Windows上开发win32程序不熟悉)。通过跟踪游戏主循环执行的逻辑,我发现在main函数中可以简单实现。(不知道会不会有什么后遗症,但是貌似适用我的项目需求)

这里有篇类似的博客,感觉很高级,不了解windows,没看懂,但是感觉有点复杂的样子,可以参考一下:http://blog.csdn.net/lolinzhang/article/details/7432173


六、移植到XP系统?

很遗憾,没有移植成功!放弃了!!!

XP系统最高只支持VS2010,而Cocos2dx3.x开始官方就不测试XP系统了,并且v3.x版本使用了C++11新特性,至少要使用VS2012(部分支持)。看懂了吧!还没开始测试我就选择了放弃,坑太多。。。

PS:知乎上有个哥们儿貌似跟我问了一样的问题,看看官方怎么回答的吧:https://www.zhihu.com/question/31430252


七、打包发布?

由于项目中使用到了jni调用第三方SDK jar包,因此也给打包带来了困难,关键就是jdk环境怎么打包,如果搞定了这个问题,打包就很简单了,网上随便找篇文档照做就是了,这里只记录怎么配置jdk环境,详细步骤之前已经写在这里了:http://blog.csdn.net/u013058216/article/details/53028862 ,问题三中也提到了


八、VS开发中有音效,打包之后没有音效?

问题描述:开始遇到这个问题的时候感觉很神奇,在VS中是有声音的,在Debug.win32或者Release.win32中也有声音,但是打包之后就没有声音了。原来是在打包的时候,将所有需要被打包的文件和资源拷贝到一个空文件夹中的时候,这个文件夹是以中文命名的,改成英文就好了。切记这里不能以中文命名文件夹!


你可能感兴趣的:(Cocos2dx,JNI,Windows,Java,C++)