请教个问题——(我失业的那些日子21)

“Cocos不能兼容iPhone12这个机型吗?”随着周老板的话,发来的还有一段视频。

视频里的游戏画面全部错乱了,UI被3D部分挡在底下,然后场景上的跑道出现了重叠。看到临近上线,还能出现这个问题,真的是让我的心头一凉。

此时距离这个项目开始的日子已经过去了整整两个月了,按照最初的合同,预定是这个项目应该在十一月一号就正式上线的。而现在已经比我预期的时间超过了太多太多,而且工作量也是比我的预期增加了太多太多。

在交付完第一个版本后,周老板那边就开始了测试,在测试过程中反馈一些Bug这点无可厚非,本来就在我的职责内。但是同时还追加了许多新的需求,这些需求你说它不合理吧也不对,因为按照我的理解来说,这些需求确实是合情合理的,应该加上这些东西,或者改成这个样子,但是累计的数量多了,导致我的工作量也增多了不少。而且这些需求,也很分散,大概一周提一两个,这就导致我得时刻关注这个项目。也很让人疲惫不堪。

正常来说,如果是一个全职的工作流程,这些情况都是游戏开发中非常普遍存在的反复,这个没什么好抱怨的,但是按照外包的模式来做的话,我是觉得自己血亏的。拿到的报酬至少得再增加一倍,我的心理才能平衡。也怪我第一次接外包没什么经验,就当花钱买教训了,而且合同都签完了,只能是亏本赚口碑了。

出现问题的是小美的iPhone12。我抓紧买完菜回家,和小美拉了一个单独的视频会议,让她现场演示给我看,幸好我在提供测试版本的时候,把vConsole打包进去了,所以请她打开控制台,让我看看Log。

Log里没有输出任何的报错信息,而且和服务器的消息请求全部都是正常打印出来了。也就是说不是代码崩溃导致的问题,整个游戏都是在正常的运行的,只是渲染错乱了。

我第一时间怀疑的是微信的版本太老了,但是检查了她的微信版本,是最新的版本。

“你们办公室还有谁是iPhone12的手机吗?可以看看他的手机能正常运行吗?”

等了一会,小美拿了另一个iPhone12手机过来,这台手机上运行是好的。我仔细比较了一下两台手机,发现他们的微信版本都是相同的,只是小美的手机是ios 15.4.1的版本,而好的手机是 ios 18。

这个时候,小美又反馈了一个新的信息。不光是微信浏览器里运行异常,在 Safari 浏览器打开也是如此。

听到这里,我顿时有了一个推断,这个不是微信自己的问题,应该是这个版本的苹果浏览器的问题啊。于是我又给小美发了一个我上架store的试玩游戏,她反馈运行是正常的。这就奇了怪咧。

我再次仔细观察小美发的渲染错乱的视频,发现画面错乱的原因似乎是第一个相机的Clear Flags根本没起作用。导致每一帧的画面都重叠到了前一个画面上,所以才会出现场景上有两个跑道的感觉。想到这里,我的心中有了一些眉目。试玩游戏是正常的,而现在的游戏不正常。他们之间存在两个不同。一个是引擎版本号的不同,一个是相机的设置不同。

试玩游戏里是创建默认的2个相机。

3D相机——Clear Flags (SkyBox)

Canvas相机 —— Clear Flags (DEPTH_ONLY)

而现在的游戏里有三个相机。

Canvas1 相机 —— Clear Flags ( SOLID_COLOR)

3D相机 —— Clear Flags (DONT_CLEAR)

Canvas2 相机 —— Clear Flags (DEPTH_ONLY)

因为SkyBox的效果不好,所以我在这个项目里,使用了一个背景层的Canvas1,上边放了一些精灵来显示蓝天白云。从现在的表现来看,Canvas1相机的 Clear Flags 没有起作用。

于是我就先将现在的游戏的相机的Canvas1删除了,改成试玩游戏里类似相机设置,重新打了包,请小美再实验一下。这下子估计稳了,我暗想。

“还是一样的,画面会错乱。”小美又录了视频给我看。

于是我又发了试玩游戏《兄弟向前冲》给小美,这个游戏的相机设置也是三层,但是只是引擎版本不同。如果《兄弟向前冲》也运行正常,那就可以断定是 3.8.7 的引擎在 ios 15.4.1上运行有问题咯。

“没法打开哎。”小美发来了一张截图,Safari 浏览器上显示的是“你确定要下载index.html吗?”小美的 Safari 浏览器行为也非常奇怪。很多网址它都会识别成一个要下载的文件,而别的 ios 18就没有这个问题。

这个问题排查到这里,已经进入了一个死胡同。我只得表示无能为力了,这个属于 ios 的bug了。周老板也表示理解,先放下这个问题,不要耽误上线。

在这里,我想问一下论坛的朋友,你们有什么思路吗?

往期回顾:

追文更新:

1赞

没人水了吗

有的有的,兄弟

我在cocos技术论坛里追小说~!

所以是引擎的bug吗?引擎的问题应该交给引擎解决

我更关心小美

有没有用了压缩纹理

虽然你已经决定暂时搁置,但为了让你心里有个底(或者如果周老板之后又让你修),我提供几个非常有针对性的“破案线索”。

线索一:罪魁祸首可能是 MSAA (抗锯齿)

在 iOS 15.4.x 这个特定版本上,WebGL 的 MSAA (Multi-Sampling Anti-Aliasing) 实现有过严重的 Bug,特别是在处理多相机叠加和 Clear Flags 的时候。

现象: 画面不清除,产生重影(Ghosting),或者 depth buffer 错乱。
原因: 苹果的 GPU 是 TBDR(Tile-Based Deferred Rendering)架构。为了省电,如果开启了抗锯齿,GPU 需要额外的显存来处理多重采样。在 iOS 15.4 的 WebGL 实现中,当一帧结束时,Resolve(将多重采样合并为最终图像)的过程可能没有正确清空 Buffer,导致下一帧直接画在了上一帧的“残影”上。

验证/解决办法:
你可以尝试在 Cocos Creator 的 项目设置 (Project Settings) -> Macro Config 中,找到 ANTIALIAS 相关的设置,将其关闭(或者在代码构建出的 application.js/cc.game 配置里把 anti-aliasing 设为 false)。
很多时候,关掉抗锯齿,iOS 上的渲染错乱立马就好了。

线索二:透明通道 (Alpha) 的陷阱

你说 Canvas1 是背景层(SOLID_COLOR),中间是 3D(DONT_CLEAR)。

在 iOS Safari 上,如果 WebGL 上下文的 alpha 属性是 true(Cocos 默认通常是 true,为了让 Canvas 背景透明),而你的游戏逻辑里又试图手动用相机的 Solid Color 去覆盖背景,有时候底层的 Compositor 会出问题,导致看起来像没清屏。

尝试:
如果你的游戏背景不需要透明(即不需要透过 Canvas 看到网页底部的 HTML 元素),可以在构建配置或者 cc.game.init 的时候,强制设置 alpha: false。这会让浏览器知道这个 Canvas 是不透明的,强制每一帧都必须有一个底色,这通常能解决“透视/重影”问题。

线索三:关于 Safari 下载 index.html 的怪事

小美的 Safari 也是 iOS 15.4.1。那个“确定要下载 index.html 吗?”的弹窗,其实暴露了一个服务端配置问题,而不是浏览器坏了。

原因:
iOS 15 以前或某些旧版本 Safari 对 Content-Type 非常敏感。
你发给她的链接(不管是本地服务器还是远程),服务器返回 index.html 时,Header 里的 Content-Type 可能没有正确设置为 text/html,或者被错误地设置为了 application/octet-stream(二进制流)。
iOS 18 比较智能,它会嗅探文件内容觉得“哦,这是 HTML,我给你渲染出来”。
但在 iOS 15.4 上,由于 Header 不对,它就老老实实地问用户:“你要下载这个文件吗?”

这说明: 那个试玩版游戏《兄弟向前冲》如果能正确配置服务器 MIME Type,大概率是能跑起来的。

我帮你发给AI了

2赞

15.4.1这种上古版本,我都不想管。更何况引擎组呢。

没有的说呢

ios的问题

666, AI破案大师