下载 App

这届聚光灯的主题是「涌现」我决定做一个只有一种东西的世界尘埃

10/185 浏览
10/09 立项:
这届聚光灯的主题是「涌现」。我决定做一个只有一种东西的世界:尘埃。
规则只写三条:
  1. 看见光就往光的方向走。
  2. 和身边的同伴互相牵引。
  3. 能量攒够就分裂,能量耗尽就消失。
写完第一次运行,散开的粒子自己聚成团,然后开始旋转。代码里没有"旋转"这个动作,这个形状是三条规则叠加出来的。
模拟层要求可复现:不用随机数,分裂方向用种子、粒子编号、tick 做整数哈希。当天跑完三千多条断言。
horizontal linehorizontal line
同日测出性能问题:尘埃要互相牵引,最直接的写法是每颗跟每颗比一遍,180 颗一帧三万多次比较,低端机直接卡死。
horizontal linehorizontal line

10/11 空间网格

把 1200×820 的场地切成 27×18 个小格,每颗尘埃只跟相邻 3×3 格里的邻居计算。
同一局从 366ms 降到 186ms。比这更重要的是比较次数不再随粒子数平方增长。
这次改动只影响速度,不影响结果:粒子该抱团还是抱团,规则一行没动。
horizontal linehorizontal line

10/12 开场只留三句话

加了一页开场,只讲三句话:
尘埃是物质。光是能量。毒域是扰动。 你命令不了任何一颗尘埃,只能改变它们身处的环境。
同时把 90 秒计时改成点「放下第一束光」之后才开始走,避免读开场的时间被算进观测窗口。
放置也加了即时反馈:落点一圈扩散的冲击波,尘埃分裂时闪一下光。
horizontal linehorizontal line

10/13 操作改成固定左右键

原来的做法是"左键放当前选中的工具"。问题在于:选过一次毒域之后,左键就会一直放毒,容易放错。
改成桌面端左键固定放光源、右键固定放毒域;触屏没有右键,保留「光源 / 毒域」两个按钮。
顺手做了首屏减法:观测目标、倍速、重放收进「更多」,第一屏只剩尘埃、光和毒。
horizontal linehorizontal line

10/14 自查抓出两个 bug

没有加新功能,做了一次全面自查。
倍速按钮无效。实测同样 400 帧,x1 走 82 tick,x4 走 83 tick,完全没有加速。原因是速度只提高了每帧的预算上限,时间累加器本身没有乘速度。当时的测试是绿的,因为只断言了"tick 在涨"。修完把断言改成"x2 的 tick 必须明显多于 x1"。
结算面板关不掉。按返回键收起来,下一帧又被主循环显示回来。加了一个每局只自动弹一次的标记。
同一天加了结算对比:用同一种子跑一遍什么都不放的基准局,结算里多一行——
「对比同种子不放任何东西:你多养出了:漩涡」
horizontal linehorizontal line

10/16 背景音乐和音效是自己合成的

音频没有用任何现成素材,用 Python 标准库写了一个合成器,正弦波、噪声、钟声从零生成。
背景音乐分两层:平时只有暗底噪,场上出现星云、漩涡或流动群落时,第二层在约 1.5 秒内淡入,形态散掉再退回去。无缝循环的做法是把每个频率量化为整数周期,接缝处波形能接上。
另外加了三个音效(放置光源、放置毒域、出现新现象),以及一个很轻的按钮点击音,和全局静音开关。
horizontal linehorizontal line

10/17 背景音乐改了两版

第一版只有一个持续的低音,听了两遍就腻。第二版做了完整的和弦进行:Am–F–C–G,64 秒一圈。结果还是不对——声音从第一秒到最后一秒都在响,密度没有变化。
做了能量分析才发现,安静窗口的占比是 0%。问题不在旋律,在于不给耳朵留空隙。
最后一版做减法:删掉持续铺底和噪声床,每小节只保留两个事件,其余时间安静。实测安静窗口占 13%–23%,中位音量只有峰值的三分之一。
环境配乐的第一要务不是填满,是留白。
horizontal linehorizontal line

10/18 让颜色带信息

尘埃的颜色现在跟能量走:暗红(接近消散)→ 蓝白(平稳)→ 金黄(接近分裂),分裂时带两层金色光晕。背景从单一的蓝黑改成青绿和淡紫两团星云。
界面也按语义配色:光源金、毒域紫、动作青、中性淡蓝白,按钮的颜色和它在场内的颜色一致。
对渲染截图做了色调统计,亮像素里能分出 5 个色调族。颜色确实在传递状态,不是装饰。