这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《MMO 服务器开发》14.2 延迟补偿裁决
「我屏幕上打中了,为什么没伤害」和「我躲进掩体了,为什么还被击中」是同一枚硬币的两面。本节实现延迟补偿裁决:为每个实体保存历史位置,按「服务端当前时间 − 半程 RTT − 插值延迟」把世界回退到射手当时看到的那一刻再做命中判定,并用确定性测试复现这两种不公。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
「我屏幕上打中了,为什么没伤害」和「我躲进掩体了,为什么还被击中」是同一枚硬币的两面。本节实现延迟补偿裁决:为每个实体保存历史位置,按「服务端当前时间 − 半程 RTT − 插值延迟」把世界回退到射手当时看到的那一刻再做命中判定,并用确定性测试复现这两种不公。
「现在几点」这个问题在服务器上比想象中难:墙钟会被 NTP 校时、被 GC 暂停打断,客户端时钟和服务端更是各走各的。本节把逻辑时间与墙钟彻底分离,用单调钟搭一条只向前走的时间线,用 NTP 四时间戳估出客户端时钟偏移,并用确定性测试演示一次向后跳变是怎么被时间线吸收掉的。
逻辑层拿到权威状态了,渲染层还没完:远端玩家的位置是离散快照,直接画会一顿一顿地跳。本节给 aegis 的 predict 包补齐渲染侧的三件工具——用位置插值把快照之间补平、用速度外推兜住「快照还没到」的空档、用误差平滑把 13.2 的校正摊到多帧上,并给出各自的取舍与真跑测试。
预测让客户端先走一步,但权威永远在服务端:一旦服务端的答案和本地不一致,客户端必须回滚到权威状态、把未确认的输入重放一遍。本节把 13.1 的输入缓冲接到和解逻辑上,讲清裁剪-复位-重放三步、用一条测试给回滚的代价定上界(重放条数只跟 RTT 有关),并给出和解误差阈值的取法与「小误差平滑、大误差瞬移」的判据。
客户端先走一步能掩盖一个 RTT 的延迟,代价是服务端必须记住每个玩家「已经确认到哪一条输入」。本节给 aegis 的 predict 包写一个真实的输入缓冲:客户端给每次输入编号、本地立刻前进、把未确认的输入排进重放队列,服务端回一个确认号。最后用固定随机种子跑 500 步确定性回放,验证「服务端同意时客户端预测与权威状态逐字节相等」。
本节讲清审计日志与普通日志的区别:普通日志可丢可采样,审计日志必须完整、必须能证明没被改过。用追加式加哈希链实现审计日志,每条记录带前一条的哈希,改任何一条都会让链断掉。真跑:写 5 条记录、校验链完整、篡改中间一条再校验,打印「第 N 条校验失败」,并给出审计字段表与保留策略表。
本节给 ResearchCopilot 补上输出侧三道关:① 敏感信息用正则加结构化检测,命中就脱敏或拒答,并讨论误伤;② 越狱与不当内容靠独立于模型的检查层,不指望提示词;③ 幻觉引用校验把每条引用回语料核对(存在吗?支持吗?)。真跑三条答案,打印三道关各自的判定与最终处置,并给出校验项清单表。
本节给 ResearchCopilot 立起输入侧护栏:先讲清 Agent 特有的四个注入面,重点剖析检索文档里的间接注入为何最危险,再落分层防御——内容与指令分离、工具白名单与参数校验、危险动作人审、长度与频率限制。用一段自造的含注入指令假文档,真跑无防护版(删除真被执行)与有防护版(注入被当资料、危险工具被拦)两次轨迹。
讲解 .NET Aspire 的应用模型与资源编排,覆盖 AppHost 分布式应用构建、服务发现与依赖注入、OpenTelemetry 遥测与健康检查、Dashboard 本地开发体验,以及从本地到生产部署的资源供给差异与清单生成的落地实践。
调试信息把机器码映射回源码。本文讲解 DWARF 的 DIE 树与节区组织、行号状态机与行号表生成,分析优化导致的变量位置变化与 location list、内联调用点信息,再落到 JavaScript Source Map 的 VLQ 编码、分离调试信息与调试体验优化。
ABI 是编译器与操作系统之间的契约。本文讲解 System V AMD64 的寄存器与栈传递规则、参数分类算法与结构体拆分、返回值与变参约定,对比 Windows x64 与 ARM64 的差异,并给出跨语言 FFI、栈对齐、名字修饰与常见踩坑的排查手段。
协程编译器把可挂起的函数改写成状态机。本文对比有栈与无栈协程的实现路径,推导状态机变换与帧布局,讲解挂起点分析、跨挂点变量提升与帧内存复用,再落到帧分配策略、与垃圾回收及栈复制的交互,以及 C++20、Rust、Go 的工程实践、取消语义与常见坑。
分离编译切断了跨模块优化的可能。本文对比全程序 LTO 与 ThinLTO 的架构取舍,讲解摘要索引、按需导入与跨模块内联的决策机制,分析增量构建、缓存与可复现性,并给出 GCC、Clang、Rust 的配置实践与构建时间、产物大小的实测权衡。
逃逸分析决定一个对象能否留在栈上、锁能否被消除。本文从逃逸状态的格与传播规则讲起,用连接图刻画方法内的指向关系,讲解过程间摘要与参数、返回值逃逸的推断,再落到标量替换、栈上分配与锁消除的实现细节,最后讨论精度与编译时间之间的权衡取舍与常见排错手段。
SSA 是现代优化器的通用表示。本文从支配树与支配边界推导最小 SSA 的 φ 函数插入算法,讲解变量重命名与版本管理,再落到剪枝 SSA、Braun 算法与 out-of-SSA 的并行复制、交换与丢拷贝问题,附可运行的 Python 实现与工程取舍。
Clojure 配置与密钥管理实践:环境分层与深合并优先级、Aero 的 reader tag 与 Integrant 生命周期集成、environ 与 cprop 方案对比、密钥注入与轮换策略、配置校验与启动失败快,以及配置漂移的可观测与审计。
Clojure 报表与文档生成实战:PDFBox、OpenPDF 与 clj-pdf 的选型对比,Apache POI 与 docjure 导出 Excel,模板与数据绑定,大报表流式写出与内存控制,以及中文字体嵌入、自动换行与列宽等排版细节处理。
Clojure 集成大语言模型的完整工程实践:多供应商 API 封装与 SSE 流式解析、core.async 管道编排与背压、工具调用与结构化输出校验、向量检索与 RAG 拼装、token 计量与并发限流、两级缓存去重,以及可观测指标与评测回放方法。
对比 clojure.spec 与 Malli 两大数据校验方案:schema 表达力与组合能力、开放与封闭 map、递归与条件依赖、生成式测试集成、错误信息可读性、解释与编译模式的运行时开销,并给出 coercion、JSON Schema 导出与选型决策依据。
系统讲解从 Java 渐进迁移到 Clojure 的工程路径:绞杀者模式与切入点排序、互操作边界与数据语义设计、Maven/Gradle 与 deps.edn 混合构建、AOT 与 uberjar 打包部署、团队技能矩阵与代码评审清单,以及常见陷阱与量化验收度量。