将一个cocos2dx1.0游戏改成支持苹果64位

编译修改和编译报错处理

1,修改项目属性,不仅包括主项目,还包括导入的项目,都修改Architecture为$(ARCHS_STANDARD)改了之后编译就会报错,咱们一个个看。

2,curl报错,更换curl库,以支持64位。这个百度能搜到,将新的代码下下来,覆盖原来的目录

3,EGOTextFieldAlertView.h里的CGFloat命名冲突,会遇到两个CGFloat,报错重定义,苹果也事先考虑到了这个问题,所以根据他们提供的宏CGFlOAT_DEFINED就可以解决

4,将CCLuaEngine和PCEventDispatcher里的使用lua有关的指针修改为long。

5,jsonkit.m按照xcode提示修改,这里有一些旧的写法不支持了,所以xcode会提示怎么改成新的正确形式,他怎么提示,就怎么改。

改到这里编译基本能过了。


运行时报错和闪退

6,同事用两种方法输出log时:NSLogv和vsprintf共用变参修改,这个百度搜一下c语言的函数用法,vsprintf,va_copy,va_start,fflush等,

这个报错可能是64位的问题也可能是64位+ios8的问题,两个记录log的函数共用一个变参,有概率闪退。


1,黑屏或卡死,表现为进入游戏黑屏,或者玩了几步之后卡住不动。

原因:结构数据未初始化和系统函数gettimeofday配合使用在64位机器上有系统bug

旧的方式:struct cc_timeval now; gettimeofday((timeval *)now,  0);

now没有初始化,所以里面的值有时候是随机的。

在32位机上正常,但是到了64位机上,这么取值就有问题,得到的结果会非常大。我查了一下苹果的系统函数gettimeofday()文档,没找到跟机器位数相关的说明。至少有一点可以肯定的是,他计算的时候没有严格覆盖now的值,怀疑是其内部实现的时候只计算了低位。

算出来的值在CCDirector中用于计算帧率。所以64位机上帧率变得非常大,大概几十分钟才会走一帧,看上去卡死。

为什么本地调试却没有问题?是因为CCDirector有这么一段实现:

#ifdef DEBUG
// If we are debugging our code, prevent big delta time
if(m_fDeltaTime > 0.2f)
{
m_fDeltaTime = 1 / 60.0f;
}
#endif

解决方案:struct cc_timeval * now=new struct cc_timeval();这里初始化,保证now里是0,0

2,摇一摇无法使用

原因:ios8 64 api废弃

老的实现方式使用UIAccelerometer,在ios5.x的时候就已经宣布要废弃了,但是仍然可以用,直到

64位机出来,才真正的废弃了。

解决方案:使用苹果提供的替代方案<CoreMotion/CoreMotion.h>,网上有很多加速器的使用例子,找个看看。

3,使用obj_msgSend时会闪退

原因:ios8+64位时,苹果的api obj_msgSend出现不兼容。

看看苹果的做法吧,第三个参数看情况用int或id

- (int) doSomething:(int) x { ... }
- (void) doSomethingElse {
    int (*action)(id, SEL, int) = (int (*)(id, SEL, int)) objc_msgSend;
    action(self, @selector(doSomething:), 0);
}

苹果原文:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html 

4,提包时报错:最低系统支持不能低于5.1.1

原因:苹果的xcode编辑代码时,修改成64位之后,会自动将最低版本修改为5.1.1,但是如果是使用命令行打包,就不会自行检查最低版本对不对。我们的游戏里,打包系统会读取另一个文件xcconfig里的内容,而且最终编译的值以这里的参数为准,会覆盖project.pbxproj里的值,所以把这里的最低版本改为5.1.1














转载于:https://my.oschina.net/TAjaoSMd/blog/424825

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值