一个 HTML 文件里可行走的 ASCII 赛博朋克城市

查看原文 HN 讨论

文章摘要

这是 YouTube 频道「Grow Now! Games」在 2026 年 8 月 13 日发布的一段约 2 分 48 秒的演示视频,展示了一座完全由 ASCII 字符构成、可以第一人称行走的赛博朋克城市。视频发布不到一个月播放量已超过 170 万次,在 HN 上拿到 400 分。

作者在视频简介中说明了技术路线:这是一个用 JavaScript 和 Canvas 手写的小型自定义引擎——没有 Unity,没有 Unreal,没有 3D 模型、贴图或着色器。世界是一座基于网格的城市,包含道路、建筑、树木、汽车和行人。每一帧,引擎从摄像机发出射线(raycast)来计算透视、深度、碰撞以及什么该被看见,然后用字母、数字和符号把这一切绘制出来。用他自己的话说:这是一座由方块构成的微型 3D 城市,通过一屏 ASCII 字符来观看。项目仍在进行中,作者表示会继续推进氛围、细节和交互。

值得注意的是,HN 这个帖子在提交合并过程中出现了一次身份混淆,导致讨论从一开始就分裂在两个不同的项目上(详见下方评论部分)。视频对应的是 Grow Now Games 的闭源项目,其原型通过 Ko-fi 付费获取(约 2.5 美元起);而标题里「一个 HTML 文件」的说法以及可直接游玩的开源版本,实际来自另一位作者 Miguel Carino 的 CyberCity 项目(cybercity.carino.systems,源码在 GitHub 上)。作者本人也发布了两个后续更新视频:「ASCII City: Traffic and Detail Update」和「ASCII City Update: Interiors, Elevation and Skyscrapers」,分别加入了交通细节、室内、高程和摩天楼。

由于是视频形式,本文的正文信息主要来自官方简介与 HN 讨论;视频本身没有可抓取的文字转录。

HN 评论精华

帖子的最大争议其实是「东西在哪儿」。 andsoitis 直接发问:「说好的那个 HTML 页面呢?」Hugsbox 语气更冲:「标题说是一个 HTML 文件……那么,在哪儿?如果你能直接链接它,为什么要发个视频?我到处都找不到链接,而且我不打算为了看一个 HTML 文件去看 YouTube 视频。」goatking 回复说视频简介里有链接,但你得付费才能拿到 demo。Hugsbox 于是回了本帖最刻薄的一句:「啊是的,让我赶紧掏出钱包,为一个 HTML 文件的 demo 付费。我肯定会这么做的。」ivanjermakov 试图缓和:「公平地说,这是个很好的接受捐赠的方式。」Ey7NFZ3P0nzAe 反驳:「如果他们实际上是在卖一个文件,那就不叫捐赠。」Hugsbox 补充:至少要付 2.5 美元才能访问,这听起来是购买,不是捐赠。teddyh 的判断最不留情:「这是一则广告。而且被拿来卖钱的,是一个基本 3D 渲染器的简单原型。」nom 只回了一句「你在说什么鬼」。

混淆的根源被查明了。 naet 和 rocmcd 都反映了同一个现象:视频里看起来非常棒,但自己实际试的时候完全不是一回事,很难分辨在看什么。jayturley 一开始猜测是版本差异(视频是新版,线上是旧版)。fv3y 找到了真正的答案:发帖人把两个目标相似的不同项目搞混了——视频来自一个叫 Grow Now Games 的闭源项目。HN 版主 dang 亲自出来认领了这个错误:「哎呀,那应该是我的锅——我当时在合并几个提交,以为是同一个项目。抱歉!」并补上了被混进来的另外两个链接(cybercity.carino.systems 和 GitHub 上的 MiguelCarino/CyberCity)。

rpdillon 给出了两个项目的对比评估:视频版本的作者是 Rhys,附源码那版是 Miguel 写的;Miguel 版本里的 CONTRACT.md 和提交历史都提示了 AI 参与(他声明自己对此并不狂热,只是记录一下)。他认为 Rhys 的版本更「手工」,但也更难接触到——既要付费,交付形式还是混淆过的 WASM。ramoz 说他买了这个游戏就是为了研究代码,「不幸的是它是 WASM 而且被混淆了。我打算看看我那些聪明的大脑朋友们能干点什么。」unsane 帮后来的人整理了结论:想玩的话去 Miguel 那版,WASD 移动,按 1-2-3-4 切换 CyberCity / Frontier / Moonwalk / Edo 四个场景。

技术讨论最有价值的一支是关于「字符画该怎么画」。 felineflock 提出:用实心方块(ASCII 219)作为主要绘制单元,再用半块和不同密度的网点字符(220、223、176-178)来实现抖动(dithering),是不是效果更好?wewtyflakes 指出 127 以上的都属于「扩展 ASCII」而非严格 ASCII,如果这点重要的话。recursive 进一步纠正:「扩展 ASCII」不是单一的东西,而是一类以 ASCII 为超集的单字节编码。Darkphibre 则指出用普通字符本身就能实现某种抖动,并推荐了 alexharri.com 上一篇关于 ASCII 渲染的交互式博文,paavope 读后表示「真的真的很酷」。

aleyan 贡献了本帖最有实操价值的一条建议:如果你想做等宽字符艺术,强烈建议像 OP 那样在浏览器里做,而不是老派地在终端里做。他自己做过 ASCII 和 Unicode 图形项目,理由是:浏览器里你可以设定字体和比例,确切知道用户那边会渲染成什么样;鼠标输入、性能剖析等等都更好。「现在 TUI 在开发者工具圈子里经历一波复兴,而浏览器明明是如此强大的平台,这让我相当震惊。」

这条评论招来了一整片反对:holsta 说他的理由是能从孱弱的笔记本 SSH 到几百核几 TB 内存的机器上,用同一套熟悉的工具和工作流。saintfire 说他用 TUI 的唯一理由是能从已有的终端会话里不抬手就快速做点什么;「如果我必须打开一个键盘导航说实话相当平庸的浏览器,那我宁愿它干脆是个 GUI。」slowin 补充:命令行工具(以及 TUI)可以走 SSH,不用折腾 HTTPS 证书,而且天然带有你当前工作目录的上下文。qsera 最激烈:「认真的吗?为什么要开一个吃内存的浏览器标签页来跑一个 TUI?就是这种态度让我们有了 Electron。浏览器作为应用平台应该是最后的手段。」larme 一句话概括:「因为现代浏览器是怪物,我们很多人想避开它。」

关于 SSH 免证书这点,echoangle 提出了一个尖锐反驳:这也意味着对中间人攻击没有真正的防御——「至少我不认为有人会认真检查首次连接时的主机密钥。」slowin 回应说服务器密钥变了你会收到通知,说没有防御不公平。dolmen 指出那不能防护首次连接时就发生的中间人攻击。account42 用一个类比化解:「大多数正常国家对这种事的防御,和你被人捅刀子的防御是同一种。我没见几个安全专家坚持你必须穿着板甲走路。」

agys 带来了硬数据:他几年前对三种浏览器渲染技术做过详尽的基准测试——DOM 里的文本、2D canvas 和 WebGL canvas。DOM 方案最「纯粹」(因为它真的用字体),性能可以很好;唯一明显的减速出现在同一行内字符颜色频繁变化时,因为每个新字符都得包一层 span。2D canvas 更灵活一些但不一定更快。WebGL 显然最快,1000+ FPS,像素字体还能渲染得极其锐利。他还附上了可以现场感受 FPS 下降的演示页面。aleyan 回应说他怀疑 DOM 对多数用例已经够快;他自己的项目里 DOM 开始卡顿,是因为每个格子(hexwalker 里是两个半宽字符)都是一个 React 元素,这些元素会被成批垃圾回收从而造成卡顿。

终端图形的极限探索成了一条热闹的支线。thomasfromcdnjs 展示了他最近做的 sshfighter.com——直接 ssh sshfighter.com 就能玩,他说自己把终端图形推到了极限(且没用 Kitty 协议),建议缩小字号获得更多「像素」,按 v 切换渲染引擎。他坦白首页是 AI 生成的,真正的工作在 SSH 服务端。mspreij 惊呼「这看起来太他妈棒了,怎么做到的?」thomasfromcdnjs 说他折腾了好几个月,仓库完全开源;精灵图不是同一尺寸也没到应有的水准(在美术上已经花了太多钱);做法是把精灵图喂给算法,由算法决定用哪些字符在不同宽高比下看起来最好。mspreij 感慨自己原本还为终端里用半字符分辨率实现的生命游戏和 Wireworld 自豪,现在得升级技能了。thomasfromcdnjs 说自己正在做一个 SSH MMORPG,准备开始写世界观设定。alchemism 顺势报到:「我在做一个 SSH MUSH,复古风格的。」k7peak 也贴出了自己做的 sshwars.com(标注 NSFW),说玩法不同。

审美与情怀方面:postalcoder 说这让他深深怀旧——《刺猬索尼克》的 Starlight Zone 是他最喜欢的游戏关卡,这座城市的美学基本就是走进了那关的背景。pan_lid 联想到经典 DOS 文字冒险游戏加上现代赛博朋克的转译。Sorrel47 说这让他想起老 MUD,但升级成了一座真正可以走的城市。osener 贴出了 pouet.net 上的 textmode demo 作品作为参照。lenikirilov 说这是技术被用来做酷炫的事、做艺术而不只是做有用的东西的又一例。

kodoman 提出了一个有意思的疑问:随着你把它做得越来越真实,它会不会逐渐失去 ASCII 的本性,看起来越来越像一个普通渲染的游戏?他觉得现在这个状态就很美。mattgoupil 从相反方向表达了同一种感受:「我不想显得负面,但如果能看到一些可辨认的字母,会更能让人体会到这确实是 ASCII。」他还说,看评论才知道原来有一整个 ASCII 艺术的地下世界。

最后是一段社区元讨论:SpyCoder77 标记这是重复提交。ChrisArchitect 解释了 HN 的惯例:如果一段时间内没有讨论就不算重复,有时候东西就是没能获得关注,重新提交是可以的。rvz 反讽:「更像是已经被重发了一百次了。」yboris 则说他 15 天前就发过一次,「很高兴看到 HN 的访客终于在首页看到它了。」