【开源】我把一千多个中文博客做成了一个可以飞进去的城市。

我把一千多个博客做成了一个可以飞进去的城市。每栋楼就是一个博客。


  • 楼有多高 = 有多活跃。 最近发过文的楼在市中心,很高,窗户几乎全亮;三年没更新的缩在城郊,又矮又暗,得放大才看得见。

  • 楼有多宽 = 标签有多少。 写代码的、写生活的、拍照片的,楼的胖瘦不一样。

  • 位置 = 活跃度。 最新发文的那一批挤在正中心,越往外越旧。整座城的形状就是一份「中文独立博客还活着吗」的地形图。

市中心是一个转盘,环岛中间立着 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和贡献!) :

1 个赞

哇,这个好酷

有创意 :04-moyu:

蛮不错的。一栋楼是一个博客啊,一扇窗是一个就好了。

1 个赞

:xhj001:

我发现,按住r可以一直变:face_savoring_food:

多谢分享

哇,好厉害

酷斃了

好酷关注下

厉害厉害

nb大佬,太厉害了吧

这个是怎么想到的,厉害

这个有意思啊

牛逼

感谢分享

看着还挺好看的

太有创意了,很有意思

牛 :04-zan:

可以玩捉猫猫游戏,很有创意,不错