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大法好!

3 Responses

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注