编程学习札记

WebGL 下别从 GPU 读回网格

2026-10-21

现象

同一个 Godot 4 项目,桌面浏览器里一切正常,iPhone 的微信里却一直停在"引擎初始化中"。

原因

首页在搭场景时,会多次调用 surface_get_arrays() 和 get_mesh_arrays() 读取网格顶点,用来合并网格、重新上色、生成图标面片。在 Compatibility 渲染器(也就是网页上用的 WebGL 2)下,引擎不在 CPU 上保留网格的副本,每次调用都要通过 glGetBufferSubData 把数据从显存读回来。

iPhone 上的微信默认走自己的一套 GL 路径,这种读回在那条路径上第一次就报错了。就算路径能用,这也是同步等待:首页一次加载要读几十到上百次,进对局还要再来一遍。

做法

收获

画面逐像素不变,iPhone 上能进首页了,桌面上第一次进对局的卡顿也少了。最大的教训是:在 WebGL 上,从 GPU 读任何东西都要当成"很贵而且可能失败"来对待。需要的数据,从一开始就在 CPU 上留一份。

← 返回目录