浏览器里的HUD突然倒过来了 🙃
2026年11月7日
随着版本 2026.10.10,我们在底层迈出了两大步:游戏现在运行在 Unity 6.6 上,而浏览器版本在浏览器支持的地方(比如最新的 Chrome 和 Edge)会用WebGPU启动,其他情况下还像以前一样用 WebGL 2。这两者都是网页和显卡对话的方式。WebGL 已经有很多年历史了,WebGPU 是它的接班人,也更贴近今天显卡的工作方式。没过多久,我的HUD就倒过来了。🙃
只见过一次,之后再没出现。我在笔记本电脑上用 Chrome 打开游戏,HUD是倒着的。我们试着重现,但没成功。我自己也再没见到过。所以我们暂时把这件事搁下了。
后来它又出现了,还带着照片证据。10月19日,在一个全新的世界里,它又发生了。这一次我立刻发了一份带截图的错误报告。可惜只有截图本身是坏的:并排三份,全是条纹。背后的侦探工作是这样的:图片是由像素组成的,每个像素通常有红、绿、蓝三个值。游戏以为每个像素是三个值,但 WebGPU 给的是四个,多出来一个表示透明度的值。把同样的数据按每像素四个值来读,图片就看得清了。世界是正的,但整个HUD是镜像的:快捷栏贴在上面,VEGA 那句“要我给你演示一下基础操作吗?”是倒着的。顺藤摸瓜还发现,自从改用 WebGPU 以来,浏览器里的每一张截图都是坏的。一直没人发现,因为在那之前,浏览器发来的报告都没带过截图。🔍
为什么只有HUD?从“中”画质等级起,开启头盔显示效果的话,会有一台单独的摄像机把HUD画进显存里它自己的一张图。专业人士管这叫渲染纹理。然后游戏再带着头盔显示效果和它的光晕,把这张图叠到世界上。棘手之处在于:对于这样一张图,各种图形系统在“上”是哪边这件事上并不一致。有的从上往下数行,有的从下往上数。通常游戏引擎会把这个差别抹平。但在浏览器里用 WebGPU 时,HUD这张图有时会出错。为什么只是有时,我们到现在也不能完全确定。
重现它?没有成功。为了自己找出浏览器里的错误,我们搭了一条小小的试验场。我们下载某个版本做好的游戏包,在自己的电脑上启动。然后用一个支持 WebGPU 的遥控浏览器点过菜单、启动世界并截图,由我们的AI来看这些截图。我们这样试了三次,用的正是我的链接,也是同一块显卡芯片,三次HUD都是正的。只有我真正的 Chrome 里才有这个错误。
既然没法逼它出现,就得把它检测出来。所以现在HUD摄像机会在它那张图的左上角画一个很小的洋红色点,只有四个像素大。在HUD叠到世界上之前,头盔显示着色器会看两个左边的角,找出这个点落在了哪里。(着色器是一种直接在显卡上运行的小程序。)如果点在下面,着色器就把HUD翻过来。翻的时候它会把角落遮住,所以你永远看不到这个点。但只要错误还躲着,这样的修复就很难测试。所以我们加了一个测试开关,可以故意把点放到错误的角上。这样HUD必须倒过来,而它真的倒过来了,和我那张截图一模一样。这就证明检测是有效的。✅
显而易见的修复反而会是个错误。“那就在 WebGPU 上一律翻转好了!”我们在正式加入之前,先在试验场上试了试。那样会让所有人的HUD都出问题,因为大多数时候它本来就是正的。
一路上的三个陷阱。WebGPU 还给我们使了几个别的绊子。第一,一个简单的复制步骤在 WebGPU 上自己就可能把图片镜像。所以用镜像的副本来重现错误是行不通的。第二,我们想交给着色器的一个新开关,在浏览器里就是怎么也送不到。第三,我们读回像素来检查行的顺序,结果得到了互相矛盾的答案。所以现在着色器把它的判断写进唯一的一个像素里,我们读的就是这个像素。单独一个像素没有上,也没有下。😄
你能从中得到什么。从版本 2026.10.24 起,浏览器里的HUD方向是对的,浏览器里的截图也重新成了真正的图片。错误报告现在还会附带一个图形部分,其中会写明HUD当时的朝向等信息。这样下次即使没有图片,我们也能知道。同一个更新包里,我们还修好了 Lyxette 报告里的一个错误:动物不会再飘在你挖出来的沟上面了。🐾
如果哪天你还是看到HUD倒着:在浏览器里,按 F2 就能打开错误报告。我们会去看看。🙏
留言