这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《游戏引擎实现原理》7.1 反射驱动的属性暴露
组件字段要能被脚本与编辑器读写,就不能靠字符串硬编码。本节把内核的类型描述符接到组件实例上,实现带类型强制、只读标记与隐藏字段的属性绑定,并用 vitest 把类型强制、快照与变更比对在本机真跑一遍,给出可供撤销栈与多选编辑复用的最小变更集。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
组件字段要能被脚本与编辑器读写,就不能靠字符串硬编码。本节把内核的类型描述符接到组件实例上,实现带类型强制、只读标记与隐藏字段的属性绑定,并用 vitest 把类型强制、快照与变更比对在本机真跑一遍,给出可供撤销栈与多选编辑复用的最小变更集。
资产浏览器要把引擎眼里的扁平「路径→资产」解释成一棵可展开的树,关卡编辑则把《微光岛》的关卡数据装进编辑器并校验引用。本节实现资产树构建、类型判定、稳定 GUID、拖放载荷编解码与关卡加载,并在本机真跑 13 条 vitest 用例;拖放交互属 L4,需在浏览器中手动验证。
编辑器视口要同时画场景、网格与选择描边,还要支持多相机切换。本节把卷二渲染器接进编辑器:用同一份实例数据分别喂给主相机与顶视相机、在片元里给选中实例描边、再单独叠一层世界网格,并在 headless Chromium 里回读像素逐条核对是否生效。
视口要回答的是「鼠标点在画面上究竟选中了谁、拖动了多少」。本节把拾取射线与变换 gizmo 的几何抽成纯数学:像素→NDC→世界射线、射线与有限轴线的最短距离、轴手柄与面手柄判定、沿轴拖拽位移的求解,并在本机真跑 12 条 vitest 用例;真实鼠标拖拽属 L4,需在浏览器中手动验证。
同时选中多个对象时,属性面板该显示什么?本节实现多选编辑的纯数据部分:求公共属性、把值聚合成「全等」或「混合」两种状态、再生成只包含真正变化项的批量命令。公共属性、混合值判定与批量命令生成都在本机真跑并有 vitest 用例;面板渲染与交互属 L3/L4,需在浏览器中手动验证。
面板拿到字段后,该给它配哪种控件?本节写一张字段类型到控件种类的映射表:数值对应数字框、bool 对应勾选框、vec3 展开成三分量、句柄对应对象引用,再叠一个可覆写的控件注册表处理个别特例。映射与解析逻辑在本机真跑并有 vitest 用例;真实 DOM 控件的创建属 L3,需在浏览器中手动验证。
属性面板不该为每个组件手写 UI。本节把卷一第 16 章的反射描述符接进编辑器:从类型描述与实例展开出纯数据的「面板描述模型」——字段名、标签、类型、当前值、只读与枚举候选,不含任何 DOM。该数据模型在本机真跑并有 vitest 用例;DOM 渲染属 L3,需在浏览器中手动验证。
提示注入、工具越权、供应链投毒——Agent 的安全面比传统应用多出一整层「把不可信文本当指令用」。本节给出攻击面 × 防护措施对照表,并真跑两个最小防线:输入侧剥离注入指令行、工具侧按收件人白名单拦截越权调用,再用审计轨迹证明每一次拦截都留痕可查。
路由、缓存、并发上限、降级——成本与延迟治理的四个旋钮,任何一个拧过头都会伤质量。本节用本地假模型真跑一条完整治理链:语义缓存命中即跳过、预算耗尽自动降级到小模型、Semaphore 把在飞请求压到上限内,再用评测集证明「降级后分数会掉」,并如实说明假模型为何量不出真实成本与延迟。
pydantic-ai 原生就吐 OTel span,smolagents 与 minagent 却只有各自的内部轨迹。本节在装了 opentelemetry-sdk 1.44.0 的环境里真跑:把三种来源的 trace 归一到一张中间表示,再统一 emit 成 GenAI 语义约定的 OTel span 树,并给出三框架 span 字段到 OTel 属性的逐项映射表。
玩法系统接进来之后,单服到底能带多少同屏玩家?本节用 B 层基准本机实跑:每个玩家每 tick 做移动、施法、掷掉落三件事,由小到大扫 50 到 1000 同屏玩家,落 JSON 并给出每 tick 成本表,再与卷一的端到端承载数字对照,说明为什么玩法不是瓶颈、网络路径才是。
装配完成不等于能玩。本节给出一条可复现的验收链路:登录 → 移动 → AOI 广播 → 打怪掉落 → 拾取入包 → 交任务 → 组队进副本,每一步都带断言。给出验收脚本 cmd/dawnrealm 与端到端测试两个真跑块,以及本机跑通的完整输出,最后交代验收失败时该往哪一层排查。
前十七节把十四个玩法域各自写成了能跑的包,但它们还是散落的零件。本节讲怎么把玩法系统接进卷一造好的 aegis:每个域往同一张 cmd→handler 路由表登记命令,复用卷一的 11 字节帧协议与分发模型,再用一个进程、一个世界的 Server 把世界、战斗、掉落、背包、任务、队伍装起来,并给出装配后的实测结果。
房间建好了,还得有地方装。本节实现单服内的实例池:预热一批容量不同的实例、按 best-fit 挑刚好够用的那个、用完置为 draining 并冷却一段时间再复用。测试覆盖分配、容量不足、池耗尽、冷却期不可复用与复用后状态复位,并说明跨服调度为何留到卷三。
幽灵房间是匹配系统最典型的线上事故:房间早就没人了,却还占着实例槽位,把新玩家挡在门外。本节用「租约 + 单入口 Tick」把房间生命周期钉死:成员不续约就掉线、空房立刻回收、卡在 Starting 等 ack 超时回滚,并用测试把四种幽灵逐一复现。
匹配的难点不是「把两个人放进一个房间」,而是在评分准确度与等待时长之间找平衡。本节从零实现 internal/match:Elo 期望胜率与 rating 更新、随等待时长放宽的窗口、确定性的 PairScore 评分函数,并用 128 人 400 轮的仿真证明 rating 真能排出真实实力的次序。
价格索引是经济风控的眼睛:它把散落的成交记录压成中位价与成交量加权均价,再用偏离度和对手方频次给每笔拟成交打分。本节用 internal/trade 的 PriceIndex 从零实现滑动窗口中位价、VWAP、对敲计数与三级风控打分,并用测试验证单笔异常价不污染中位价、滑出窗口的对敲计数会衰减、自买自卖与严重偏离会被拦下。
竞价并发要同时守住三条不变量:同一拍品任意时刻只有一个有效最高价、被顶掉的出价人金币分文不损、出价失败时拍卖状态一个字节都不变。本节用 internal/trade 的 Auctioneer 从零实现出价与回滚,把「先冻新、再退旧」这个固定顺序讲透,并用 60 个 goroutine 并发出价配合 go test -race 验收唯一赢家与金币守恒。
资产冻结与托管是拍卖行与玩家交易的地基:上架时物品必须离开卖家背包,出价时金币必须从可用栏搬进冻结栏,成交或流拍再按结果分流。本节用 internal/trade 的 Escrow 从零实现这套托管,硬约束是任何一步失败都不留下半冻结状态,并用 go test 把重复冻结、金币守恒、成交过户与已结算退回逐一钉死。
红点不是「数一数未读邮件」那么简单,它是整棵 UI 树的聚合;离线玩家上线后也不能整包重拉。本节给 aegis 写一棵可聚合的红点树和一个增量同步日志:计数怎么沿父链传播、重复上报为什么要夹在零、掉线太久为什么必须退化成全量,附真跑的 L1 测试。