一个由纯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_game、step_native_game和generate_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模块加上两个编译好的着色器,就撑起了一座可以漫步的字符都市。
热门跟贴