我把一千多个博客做成了一个可以飞进去的城市。每栋楼就是一个博客。
-
楼有多高 = 有多活跃。 最近发过文的楼在市中心,很高,窗户几乎全亮;三年没更新的缩在城郊,又矮又暗,得放大才看得见。
-
楼有多宽 = 标签有多少。 写代码的、写生活的、拍照片的,楼的胖瘦不一样。
-
位置 = 活跃度。 最新发文的那一批挤在正中心,越往外越旧。整座城的形状就是一份「中文独立博客还活着吗」的地形图。
市中心是一个转盘,环岛中间立着 BLOG CITY 八个字母,绕过去能看到字的背面。
怎么玩: 拖动旋转(鼠标左键旋转,右键拖动)、滚轮缩放、点一栋楼飞过去,右侧会告诉你这个博客多高、多活跃、最近什么时候发文、有哪些标签,以及打开它 / 订阅 RSS 的入口。右上角「搜索」能搜全部名单,「随机」带你去一个你大概没听过的博客。按 R 随机,Esc 收起。
三个我比较满意的地方
1. 1581 栋楼,一次 draw call 画完。 不是 1581 个 mesh,是一个 InstancedMesh。每栋楼的窗户、楼层线、亮灯比例全在 fragment shader 里按 UV 程序化算出来 —— 没有一张贴图,没有一次贴图切换。整座城的渲染开销和画 10 栋楼差不多。
2. 天空、星星、月亮也是算出来的。 月亮的月海、明暗界线、外晕都在 shader 里,本体是一张永远面向相机的面片 —— 所以绕到城市任何一侧看它,都是一轮正圆,不会变成椭圆。星星有各自的相位在缓慢明灭。
3. 浏览器不发任何网络请求。 所有数据在构建时算成一份 350 KB 的 JSON,页面打开就是城市,没有 loading 画面(因为不需要)。没有后端、没有数据库、没有账号、没有统计脚本。
数据是怎么来的(这点我想说清楚)
-
名单和标签来自 chinese-independent-blogs(MIT);
-
「最近发文时间 / 是否失效」来自列表站自己的公开状态接口 —— 它的 Worker 每小时检查一轮 RSS,我只是消费结果,没有自己爬任何站;
-
活跃度用了一个衰减公式:
1 天前 ≈ 0.99,30 天 ≈ 0.75,90 天 ≈ 0.5,一年 ≈ 0.2。
一开始我用的是「在名单里的排名」,但排名会把时间轴压扁:前 100 名可能只差几天,却全挤在最高处;而两年没更新的还有 0.2。换成按天衰减之后,塔高才真的对应「多久没写了」。
数据每周四自动更新一次:拉一次接口 → 有变化才提交 → 重新构建上线。所以你看到的是最多一周前的快照,不是实时。
已知的问题
-
手机上没有专门优化;
-
442 栋黑楼里有少数是「站还活着但 RSS 挂了」,判定以 RSS 为准,不是以网站能否打开为准;
-
楼高上限214 单位封顶,所以最活跃的那批博客高度会有点接近。
就当是个可以玩的东西。如果你自己也写博客,搜一下自己的名字,看看它在城里哪个角落、有多高。
开源(欢迎star和贡献!) :

