文档章节

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

 为往圣继绝学
发布于 2015/06/04 15:24
字数 1024
阅读 64
收藏 0

编译修改和编译报错处理

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














© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 4
码字总数 2798
作品 0
朝阳
高级程序员
私信 提问
64 位 ARM 处理器意味着什么?

64位计算的历史相当丰富有趣。Cray等公司在70年代就已经开始在自己的系统当中使用64位寄存器,但真正纯粹的64位计算直到90年代才真正到来。 首先是MIPS的R4000,然后是DEC的Alpha处理器。到9...

oschina
2014/09/15
9.7K
34
为什么64位手机处理器比你想象地重要?

全世界都知道苹果发布了64位处理器的手机,有人说它只是一个营销噱头,有人说它这是在长线布局,但今天theverge给了我们另一个说法,力图证明64位处理器的伟大意义。 ARMv8架构其实并不新鲜,...

oschina
2013/09/14
6.3K
41
Nvidia宣布集成192个GPU核心的64位ARM处理器

Nvidia在CES上宣布了集 成192个GPU核心的系统级芯片Tegra K1。Tegra K1的两大亮点是使用了192个 Kepler架构的GPU核心,其性能逼近Nvidia的低端桌面显卡GeForce GT 630 或635;另一大亮点是高...

oschina
2014/01/07
4.4K
20
游戏引擎 Unity 5 发布,支持 iOS Metal 技术

今天是个非常棒的日子,Unity 在 2015 游戏开发者大会上公布 Unity 5 正式发布! Unity 5 现已提供下载,包括上千个改进。 Unity 5 重大改进:采用升级动画和物理效果系统,全新光影系统和声...

oschina
2015/03/04
5.9K
16
iOS 11 将不支持多年没更新的 32 位应用

在未来版本的 iOS 系统中,苹果可能要移除对 32 位应用的支持了。几天前,苹果发布了 iOS 10.3 第一个测试版,在 iOS 10.3 中开启 32 位应用时,提示窗口上显示应用需要更新才能在未来版本的...

局长
2017/02/01
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
3
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
12
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
3
0
聊聊GarbageCollectionNotificationInfo

序 本文主要研究一下GarbageCollectionNotificationInfo CompositeData java.management/javax/management/openmbean/CompositeData.java public interface CompositeData { public Co......

go4it
昨天
3
0
阿里云ECS的1M带宽理解

本文就给大家科普下阿里云ECS的固定1M带宽的含义。 “下行带宽”和“上行带宽” 为了更好的理解,需要先给大家解释个词“下行带宽”和“上行带宽”: 下行带宽:粗略的解释就是下载数据的最大...

echojson
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部