下载 App
开发者日志03 爬出泥潭篇
修改于10/1921 浏览综合
这段时间差点被自己挖的坑埋掉。
一、卡住:游戏里解方程
给随机大陆加气候和水文,本来想着:有行星风、有季风、有地形,水汽吹过来,遇到山就下雨,雨水汇成河,低洼处成湖,多么优雅。
我仿佛回到了两年前在科室做有限元模型的那个后半夜。
结果还真和有限元一样越做越细。我想让每个地块都满足来水、排水、蒸发、入土的收支平衡,想让相邻水节点之间的水头和流量关系合理,还想处理分汊、汇流、多出口甚至环路。于是写了一个迭代求解器,反复遍历水网,调整各节点水头,真实盆地和缺水河段还要多次试算求根。
更糟的是,水文和空气之间又套了一层循环:水汽降雨,降雨去求水土平衡,平衡后更新实际蒸发,蒸发再回去影响水汽和降雨。单次水文计算已经不便宜,外层反馈还可能反复调用。
停止条件也迟迟达不到。我已经允许“大致稳定就停”,但某些水网的收支余量就是降不下来,计算只能继续迭代。分帧只是让画面不卡,总工作量一点没少。之前整岛验收跑了很久很久,截止我放弃暂停,一次暴扣四万积分呜呜。
回退后我没再跑那项长测试。
二、想通:宏观层面不需要精确平衡
我停下来问自己:我到底要什么?是搞科研搞傻了吗?
我为什么要在游戏里解一套耦合平衡方程?
想通后,我决定把“解方程”降维成“记账”。
三、动手:把水汽和水文都简化
首先是水汽。以前我把水汽当成大量粒子,每个粒子每帧算移动、抬升、降水,计算量随水汽总量爆炸。现在改成每个格子只存一个有限的等级,不再用连续数值。海洋是水汽源,湖泊和湿地给一个保底,河流基本只做视觉,不参与复杂反馈。风只决定水汽往哪走,抬升只决定哪里下雨,降水用事先定好的简单规则查一下就行。每个阶段只跑固定的轮数,跑完就停,绝不无限迭代。
然后是水文。我放弃了水头求解,不再求根,也不再反复调整节点。做法很直接:把所有陆地格子按海拔从高到低排个序,从最高的地方开始,把水往周围最低的邻居送。只有一个低处就全给它,有多个就按高度差大致分一分。如果周围没有更低的格子,水就留在原地,标记成湖泊。一遍遍历,水全部流到海里或洼地,分汊、汇流、环路这些问题自动消失,因为水不会往高处流。
最关键的一刀,是斩断水文和水汽之间的反馈。流程改成单向:先算水汽和降雨,再把降雨变成水,然后单向流水算出河流湖泊,最后算一下蒸发量只做界面展示,不回去重算天气。停止条件也改成硬性预算,全局最多跑几轮,局部最多调几次,时间一到强制停止,不管余量多少。误差在可接受范围内,玩家根本看不出来。
至于首次生成太慢的问题,我打算先用最低精度快速跑一遍,让游戏立刻能玩,高精度部分放到后台慢慢补,算好一块替换一块。这样等待时间被切碎,玩家感觉不到。
四、重新理解涌现
这一路折腾让我更明白了涌现的真意:基础规则形成闭环,核心不是闭环,而是基础规则。规则简单,但组合起来能解决同一个问题,就是闭环体系。
气候和水文也一样。我不需要模拟真实物理,只需要让“水汽分档、风向、地形抬升、单向流水”这几条基础规则互相作用,就能自然出现沿海多雨、内陆干旱、迎风坡多雨、背风坡雨影、大河大湖。看到的是一个符合科学直觉的大陆,而不是一堆方程的解。
下一步
气候已经差不多敲定,该做地貌了。
目前来看,只能做到原本计划的1/3。












