Cocos2d-x 2.x 项目匹配 iPhoneX 和 iOS11

每年的9月都是一个鬼门关,你永远不知道库克老爷子又能掏出什么宝贝来折腾一下开发者了。本来想着今年总算是例外了,第一时间升级到iOS 11后竟然发现自己做的几个游戏都能正常跑起来,真是活久见。第三方服务竟也没有火急火燎的给我发邮件让赶紧更新sdk。直到年底入了一个iPhoneX真机后,再次感受到了苹果爸爸的爱。

出问题的是一个基于Cocos2d-x 2.1.3 + Box2D的远古项目。简而言之就是在iPhoneX真机上严重掉帧,几乎一秒只有两三帧那种。但是同样一个包,同样一个系统版本号却能在iPhone 7上跑得好好的。

// 因此可以确定是硬件优化相关,跟高层代码逻辑没什么关系了

摊手,隐隐有种直觉觉得可能得升级cocos2d-x到3.x才能搞定,但是仍然抱着试一试的心情更新了一下Xcode,用最新sdk编译了一个新版本,连上iPhoneX真机调试,惊喜地发现什么都不用改问题就解决了。但是没高兴太久,几天后AppStore审核通过,发现从商店上下载的版本在iPhoneX真机上仍然严重掉帧。

// 此时问题就进一步缩小到“Run版本”和“Archive版本”使用的配置区别上

在未经修改的情况下,经由Xcode的Run运行的为Debug版本,经由Archive上传到AppStore或AdHoc的为Release版本。相关配置如下图所示。

为方便调试,我把Run的Build Configuration设置为Release,运行起来果然能重现Bug了。 因为iPhoneX出问题,iPhone7上好好的。直觉上觉得这个问题应该与较底层的代码优化、硬件优化相关,仔细比对了Release和Debug的配置项后,发现了这两者在LLVM优化级别上的不同,如下图所示。

反复测试了Run(Release)模式下不同LLVM优化级别下的表现,发现-O0虽然完全无Bug,但是游戏运行时存在随机掉帧。-O1, -O2,-Os则均会导致另外一些Bug,而-O3则完美解决了所有问题。也就是说Run(Release) -O3是没问题的了。但是吊诡的是,正当我信心满满的准备打包提交时,Archive(Release) -O3下却又发现了另外的诡异Bug,很难描述,反正很诡异就是了>_<。 这个点我至今也没搞明白,Archive和Run在同样由Release导出时为什么表现仍有差别。绝望之时,把Debug的LLVM优化级别改为-O3,再到Scheme里把Archive的导出配置设置为Debug,问题竟然解决了。一脸蒙蔽~~~

解决方案总结为一句话:

Archive(Debug) + LLVM Optimization Level [-O3]

也就是说我导出了一个名为Debug但又有Release级优化的版本,囧。不过问题解决了,丑陋点就丑陋点吧。总好过把Cocos2d-x 2.x项目升级到Cocos2d-x 3.x的逆天级工作量。奉劝各位Cocos2d-x开发者一句,都2018年了,还是早日下定决心脱离Cocos2D这无间地狱吧。
请跟我念:Unity大法好!

6 Responses

  1. 在玩正常的大冒险,发出了在看三体的时候那种骂人的激赏,恨的牙痒但又非常的喜欢这些创意和脑洞还有一点点嘲讽在里面。非常喜欢您的游戏!希望我能早点通关。

  2. 初中时候玩的简单的大冒险,记得这个是那时候做得最精良的,有比较简单的剧情和有意思难度适中的关卡,所以给我留下了挺深刻的印象。那时候还是IPhone 6上玩耍,哈哈。白驹过隙,一转眼2019的春雷都响过了,也算是机缘巧合吧,发现作者又做了another adventure,这次更注重艺术性,弱化了游戏性。四个故事也确实引发了我的共鸣。本人不才,去年高考失利就垃圾三本,复读了一年,按今年的成绩也就2本吧,一本,真的很难。复读时下的决心是真的,复读时和游戏里大学生那样假装自己很努力,但又每天混吃等死也是真的。胸怀大志,可能真的只能烂在胸里了吧。不知道有没有人和我一样,迷迷茫茫不知道自己的未来在哪里。哎。我很羡慕有能力独立开发游戏的人,真希望自己也能做出一些精致又能引发玩家共鸣和思考的作品。能不能就看以后吧,毕竟我还年轻,时间还站在我这边嘛。
    期待作者的下一步作品,不论是讲故事还是虐手我都爱玩,加油哦

Leave a Reply

Your email address will not be published. Required fields are marked *