一个由纯ASCII字符构成的3D赛博朋克城市,正在浏览器里等你漫步。这个看似复古的字符矩阵背后,是一套仅283KB的Rust WebAssembly引擎,配合WebGL渲染器,在网页端构建出一座可自由行走的文本都市。

独立开发者Grow Now! Games本周上线了这款可玩的城市浏览器版本,并同步发布了第二支视频《ASCII City Update: Interiors, Elevation & Skyscrapers》。此前首支展示视频已突破100万次观看9,000条评论

打开网易新闻 查看精彩图片

引擎藏在字符背后

页面加载时获取的ascii-city-engine_bg-DqjAhqbp.wasm模块,启动时预留了1,152KB线性内存,在浏览器外实例化时报告引擎版本为0.1.0。其导出函数包括initialise_native_gamestep_native_gamegenerate_native_local_map。二进制中保留的调试路径,指向了这些调用背后的Rust源码模块:city.rs、world.rs、population.rs、interiors.rs和rendering.rs。

世界生成在Rust中完成,随后将建筑高度、地块类型、表面、色调、饱和度、窗户样式、亮灯标志和户型ID等数据,以base64编码的字节数组交给JavaScript处理。

渲染管线:从字符到纹理

渲染器请求WebGL上下文后,编译一对顶点和片段着色器,片段阶段仅包含一次texture2D查找。每个字符先用fillText绘制到图集画布上,按字符与颜色组合缓存,再通过一次texImage2D调用上传至GPU,最终以六个顶点组成的纹理四边形绘制。

图集单元高11像素,宽为等宽字体宽度加2像素。每个可见单元格都会进入一次缓冲区上传,每帧执行一次drawArrays调用。底层还保留了两套降级方案:WebGL不可用时走Canvas 2D的drawImage路径,通过?direct URL参数可切换到逐单元格fillText模式。

性能与适配:桌面与移动端的差异

桌面端会话渲染180列×80行,即14,400个字符单元格,使用10px Consolas字体,每行9像素。触屏设备则降至48行、96至168列,Rust引擎另有一套160×112的独立配置。顶点缓冲区预分配2.76MB,当单帧数据量超出时会自动扩容一倍。

Grow Now! Games此前向PC Gamer描述这个演示时强调:"没有Unity,没有Unreal,没有3D模型、纹理或着色器。"这位开发者还曾为1994年的Sega 32X制作过一款第一人称Backrooms游戏,其光线投射引擎完全用C和SH-2汇编从零编写。此外,他还实现过一个多人Doom致敬作品,将光线投射和精灵投影做成了一组SQL视图,在128×分辨率下能达到约30 FPS。

从SQL视图到ASCII城市,这位开发者似乎一直在探索"用最不寻常的工具做游戏"的边界。而这次,283KB的Rust模块加上两个编译好的着色器,就撑起了一座可以漫步的字符都市。