这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
1.1 从场景到像素
渲染一帧到底发生了什么?本节把整条链路压成顶点变换、三角形组装、光栅化、逐像素着色四步,用一份 config/scene_spec.json 跑出 487 顶点、896 三角形、43731 个覆盖像素并落盘一张 PNG;每一步都只用整数与定点,为后面三种宿主消费同一份规格打下地基。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
渲染一帧到底发生了什么?本节把整条链路压成顶点变换、三角形组装、光栅化、逐像素着色四步,用一份 config/scene_spec.json 跑出 487 顶点、896 三角形、43731 个覆盖像素并落盘一张 PNG;每一步都只用整数与定点,为后面三种宿主消费同一份规格打下地基。
《计算机图形学》卷一《几何、变换与光栅化》目录:16 章 48 节,把渲染从 API 调用还原成可算的整数——Q16.16 定点顶点变换、整数边函数覆盖判定、定点重心插值、深度缓冲、裁剪、抗锯齿与纹理映射全部定点实现,让 Python 与 TypeScript 产出逐字节相同的 PNG。本页给出与站内既有内容的分工、六档可运行性口径、《烛影山谷》场景总览与全书 16 章 48 节完整清单。
把 library 的 class 文件打成可直接运行的 jar:读懂 jar 与 MANIFEST.MF,用 maven-jar-plugin 写 Main-Class,比较依赖复制与 maven-shade-plugin 的取舍,再补上 module-info、jar --describe-module、jdeps 与 jlink 的完整命令和真实输出。
正文不该是一段 HTML 字符串,而是一份可校验、可降级的块文档。本节定义段落、图片、视频、代码、引用五类块与行内标记,给出未知块降级、未来版本拒绝与确定性序列化的 TypeScript 实现,并用测试覆盖迁移、round-trip 与坏字段。
从 library 的 JUnit 测试依赖出发,讲清 Maven 坐标、传递依赖与 compile、test、provided、runtime 四种作用域的实际影响;再用真实的依赖树、冲突裁决记录和 NoClassDefFoundError,说明最近优先、dependencyManagement 与 BOM 的用法。
为什么卷一之后还要单独写性能与高可用:边界决策回答不了代价问题。这篇序用三个常见场景说明卷二的问题意识,交代四个立场、arch-lab 的延续方式、Go 主线与 Java 21 对照的口径,以及本书对实测数字、单机结论、复现环境和未覆盖范围的明确承诺。
测试写得吃力,往往不是测试技巧问题,而是设计没有留缝。本节从 library 的 Clock、Supplier、仓储接口出发,讲清构造器注入、纯函数、窄接口与确定性输入四个杠杆,并给出可复用的测试分层、真实 mvn test 输出与反模式清单。
把 Dummy、Stub、Fake、Spy、Mock 五种替身放回 library 的仓储接口上:用 Stub 制造「书不存在」,用 Fake 验证借还流程,用记录型 Mock 检查 save 调用次数,并说明什么时候不该验证交互、如何避免测试变脆。
下拉、轮询、回到前台是三种不同意图的刷新,用同一个定时器处理只会在用户阅读时把列表顶走。本节用一段可运行的 TypeScript 策略模块给出逐触发的判定、刷新合并与节流、锚点位置保护,并复盘一次前后台切换风暴导致的三连请求与列表跳动,给出参数取值的依据。
从手工跑 main 验证借阅规则的痛点出发,给出 Maven 引入 JUnit 5 的最小 pom、断言与异常断言、测试生命周期、嵌套与参数化测试;再用 library 的 LoanPolicyTest 和真实 mvn test 输出,说明一条测试应该验证什么。
分页只保证「不重不漏地取」,端上仍会遇到同一张卡片来自刷新、实时推送与翻页三条路径。本节用带假时钟的 TypeScript 窗口实现已见集合、按时间排序的实时插入、锚点 id 位置恢复与 epoch 乱序丢弃,并复盘一次淘汰条目后「越滑越少」的线上问题。
《游戏设计》卷三《原型、可玩性与品类》附录:把六个品类变体的规则段与参数段关键字段汇成品类参数表、把 6×10 整数特征向量与 6×6 机制距离矩阵(L1 与归一化千分比两级)汇成距离表、把全卷 16 章的 S/P/W/D/B 产物按章汇成数据集索引。距离与全部指标都是代理指标,只做相对比较,禁绝对化。
把涌现度写成「可达阵容数 / 规则条数 × 1000」的代理指标:本规格枚举出 9390 个可达阵容、16 条规则,涌现度 586875‰;但如实报告一个退化解——敌方强度扫到 20 时只剩 1 个阵容每回合都能赢,21 起无解,涌现度必须与退化检测同读。
把自走棋的三个花钱方向——存钱吃利息、刷新换棋子、升级扩容量——都写成整数模型,在 32 个种子上实测:利息是 min(金币整除台阶, 上限),刷新不亏利息的阈值是 12 金;实跑给出一条可算判据(升级换的是新位、刷新只换最弱)和两个平衡破坏点。
把自走棋拆成六个机制字段——商店刷新、购买、合成升星、上阵、利息、连胜连败——每格都绑到新建品类内核里的一段确定性代码:W 层把六格商店与待命、上阵画进单文件 HTML 并真玩,P 层逐字段做变异断言,改一格摘要必变,两处 digest 与基线逐字一致。
把「挑战(关卡要求的容差帧数)− 技巧(玩家可达到的容差帧数)」做成带宽区间而不是单点:扫第一块落点平台宽度得到单调不降的容差曲线,再给高手 / 熟练 / 休闲三档玩家各算一条带宽上下界与越界判据,全部读数都是代理指标,只做相对比较、禁绝对化。
把「技巧」操作化成一个可算的量:玩家每一跳的按压时刻相对帧级完美点偏移 ±n 帧,枚举 (2n+1)^跳数 条序列报通关率,得到一条单调不增的技巧曲线;n≤2 恒为 1000‰,tol1000 = 2 帧、tol500 = 8 帧。通关率是代理指标,只做相对比较。
把平台跳跃的六个机制字段——水平速度、跳跃高度、重力、土狼时间、输入缓冲、平台判定——各绑到 core/genre/platformer.ts 里一段确定性代码,位置与速度一律用千分格整数表达,禁浮点;规格骨架与 play_spec.json 同构、只覆盖 rules / params 两段,W 层把字段画进单文件 HTML 并真玩,P 层逐字段断言,两处 digest 与基线逐字一致。
三消没有回合,节奏量不出时长,只能量每步结算的形状:256 局 6144 步的连锁长度分布(1 层 639‰、2 层 232‰、尾巴拖到 10 层)与每步消除数分布(3-5 格 533‰、平均 6.182 格),加代表种子 70701 的24 步节奏线与 CSV + 纯 xml.etree SVG,并用 Python 镜像做跨语言逐字对账;节奏指标是代理指标。
三消的随机不是抽一张牌,是整块棋盘:每次补牌都可能补出一个没有任何合法交换的死局。本节用同一批 256 个种子量死局率,再把「连续 N 次无可消就重排整板」的保底写成可播种的整数代码——保底把死局率从 121‰ 压到 0‰,同时把分数标准差从 265 削到 132;死局率与方差是代理指标,只做相对比较。