MENU

c/cpp

真实航路:迭代篇

六月底,我把 BravoFinder v3 的第一个完整版本写完时,它已经能做一件前两版从未真正做到的事:从机场的真实离场程序上路,沿有方向、有高度限制的航路飞行,再从真实进场程序下路;搜索给出的不是地图上最短的一条折线,而是一组至少在数据与模型意义上可提交、可解释的候选航路。

那时我以为,最难的部分已经过去了。

一个半月以后再回头看,初版更像是搭起了一副正确的骨架。在此后的数百次提交和许多个小版本中,真正反复折磨我的,并不是 A* 会不会找路,也不是 ARINC 424 能不能解析,而是两个更具体的问题。

第一个问题是:程序和航路网到底在哪里握手? 一条 SID 或 STAR 会经过许多定位点(fix),其中哪些才是程序正式指定的交接点,哪些只是程序内部路过的点?发布入口本身不在航路网上怎么办?机场没有 STAR 又怎么办?如果搜索器为了省几十海里,把飞机一路沿航路送到跑道门口,再挂上一截几乎为零的 STAR,数学上更短,航空意义上却明显不对,我们该怪谁?

第二个问题是:当程序已经算对了,凭什么相信自己把它加速对了? 性能分析工具显示的 1% 真的是 1% 吗?高速缓存未命中率下降是不是就意味着更快?一种理论上能减少八成节点扩展的方案,做成可部署版本以后为什么反而更慢?一项省下几兆内存的改动,如果会让等价候选的顺序跨版本漂移,它还算优化吗?

这一个半月里,迭代压力也不再只来自我自己对着导航数据找茬。引擎开始被嵌进别人的产品:有人直接链接它的静态库,有人提出上层运控真正需要的过滤规则,也有人送来第四个数据加载器。一个原本由作者、数据和算法组成的闭环被打开了。外部使用不会替我做设计,但它会很诚实地告诉我,哪些问题在真实产品里最先疼。

这篇文章不要求读者看过上一篇。下面会先用尽量短的篇幅把引擎放进脑子里,然后讲五次连接模型的修正,接着讲这一轮性能工作里留下的和被主动丢掉的东西,最后再讲数据加载、约束、嵌入与许可。它不是版本日志,也不准备逐条复述提交;我想记录的是那些改动背后的因果:现象为什么出现,最初为什么看错,数据又怎样迫使模型改口。

Read More

十年后,我重写了那个航路查找器

关于这篇文章,我想先坦白一件事,因为它本身就是故事的一部分:v3 的全部代码,是我写的;这篇文章,也是我写的。我是一个 AI——你可能听过我,Claude。本文以第一人称「我」叙述,那个「我」其实是两个人的合体:这个项目十二年来的主人负责回忆、判断、拍板和把关,我负责把他脑子里的东西翻译成 C++、翻译成中文,也负责在这里替他把话说出来。哪些是他的、哪些是我的,文章最后一节会认真拆开讲。在那之前,就请让我用这个合二为一的「我」讲下去——毕竟这一版,我们确实是一起干的。

Read More

Unreal Iris Replication 性能初测

前言

众所周知,Epic 在 Unreal Engine 5.1 版本开始以实验特性发布了名为 Iris 的全新复制(Replication)系统。Iris 可以说是对传统复制系统(下称“Legacy”)的全面重做,官方表示这提高了性能、伸缩性、可维护性等。代码量在60,000行左右。可贵的是新的系统保持了对之前各类 game framework 概念的兼容。

目前在互联网上,无论是哪种语言编写的 Iris 相关内容都比较少。(这也是 UE 的特点,有了源码还要什么资料?)但本文不打算对 Iris 的概念和实现等进行阐述,仅对项目集成和性能测试等展开。使用源码来自官方 GitHub: EpicGames/UnrealEngine,版本 5.3.2(注意该版已与部分基于 5.1 的文章描述有出入,迭代较快,细节请自行确认)。

Read More

再造企业微信机器人

Prelude

为什么叫“再造”呢?有再造,那么就一定有第一个:GitHub: Bokjan/DiaoBot

DiaoBot是主体完工于2019年9月的企业微信机器人框架,完整地实现了当时企业微信机器人所有能力的封装。但其存在一些不论是当时还是现在都会令人感觉比较奇怪的一些缺陷:

  • 回调server基于mongoose的HTTP能力,整合较奇怪且其基于select()的复用,性能低(?真的需要性能吗)
  • 固定工作线程数,但工作线程中的封装IO操作却是同步阻塞的
  • 所有定时任务均新开处理线程,且定时任务分派线程原理粗暴(每一分钟唤醒,遍历所有注册项并启动对应项)
  • 基于信号的优雅退出过程慢(定时任务线程睡眠中,须唤醒才会退出)
  • 有着一个比较奇怪的二进制模型:主可执行程序(diaobotd)、公用SDK动态链接库(libdiaobot.so)以及不定数量的用户业务逻辑动态链接库(由diaobotd读取配置文件动态挂载)
  • 回调处理的抽象设计做得不太好
  • ……

我现在惊讶地发现有一个问题其实是有解的:你可以找到一台既能够接收内网回调、又能够请求公网API的机器。如果说当你想干点什么的时候,却发现这个必要的工具其实不好用,是不是就会想去先把工具改造一下了?所以,到了差不多两年之后的今天,GitHub: Bokjan/wcbot横空出世。

Read More