随着 CPU 核心数量增加,主要的可扩展性瓶颈可能不再是算法复杂度,而是同步开销。传统锁耦合在二叉树中的表现尤其糟糕,因为每次查找都会在高度竞争的节点(尤其是根节点)上反复获取和释放共享锁,即使读者之间在语义上并不冲突。
乐观锁耦合将读者产生的写竞争移除。写入者更新数据并递增版本计数器;读者则在不加锁的情况下乐观地遍历结构,读取节点的版本和数据,然后在使用数据或移动到下一个节点之前验证版本。任何并发修改或正在进行的写入都会导致验证失败,使查找重新开始。
由于在验证之前使用数据可能引入难以察觉的竞态条件,该设计利用类型系统在编译时确保正确性。乐观访问器返回 `unvalidated<T>` 值;这些值在经过锁守卫验证之前无法使用。即使是锁的获取和指针传递,也必须遵循这一验证链。这样既能在编译时防止不安全的读取,又能保留接近无锁的查找可扩展性以及安全的并发写入。
SQLDoom 是一个从零开始移植的 1993 年《Doom》引擎版本,其游戏逻辑和渲染器完全在 CedarDB 中执行。精简的 Python/Pygame 客户端仅负责采集输入、以固定的 35 Hz 频率触发游戏逻辑帧,并显示 SQL 返回的 320×200 RGB 帧缓冲区。WAD 数据可以自然地映射为关系表,而 AI、移动、战斗、物品、门、投射物、动画、音效和扇区效果则通过约 5,900 行 SQL 和数据库函数实现。
渲染与模拟相解耦,并通过相机插值达到最高 60 FPS。其 SQL 渲染管线使用 BSP 排序、生成的像素扫描块、用于可见平面裁剪的窗口函数,以及用于深度解析的打包整数键。在 Ryzen 7 7840U 上,一个典型逻辑帧耗时 2.15 毫秒,观察到的最慢逻辑帧耗时 10.45 毫秒,远低于 Doom 所需的 28.6 毫秒时间预算。
数据库还便于进行数据驱动的模组开发,并提供事务一致性、身份认证、访问控制,以及四人多人游戏所需的一致性快照。SQLDoom 支持《Doom》第一集的分享版内容,并在 GitHub 上开源。