这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
3.2 多分辨率适配与安全区
把设计分辨率到各种真实屏幕的映射拆成可算的整数像素:用千分比整数表达 fit/fill 缩放,算出内容区与居中偏移,再与刘海/圆角/指示条的安全区求交,四台设备逐档断言,并给出可切换设备与缩放模式的单文件 HTML 原型与 Playwright 无头验收脚本。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
把设计分辨率到各种真实屏幕的映射拆成可算的整数像素:用千分比整数表达 fit/fill 缩放,算出内容区与居中偏移,再与刘海/圆角/指示条的安全区求交,四台设备逐档断言,并给出可切换设备与缩放模式的单文件 HTML 原型与 Playwright 无头验收脚本。
把「小游戏没有 DOM」这件平台约束落成可运行的工程抽象:用一份不依赖任何引擎的最小 2D 绘制内核,把清屏/矩形/文本三类指令发到两个宿主——Node 里的整数像素缓冲与浏览器里的真实 Canvas,逐像素断言两边画出的非背景像素数一致、指纹稳定,并附可打开的单文件 HTML 原型与无头验证脚本。
分包方案定下来之后,还要回答一个问题:这份方案在真实构建里占多少体积、离上限有多近。本节把构建产物清单按包与类型聚合,算出各包占比并画出堆叠图,再用一段 B 层基准把每项体积按可播种的整数抖动跑 400 轮,看「main 越线」出现的概率,让余量从感觉变成数字。
分包不是把文件挪个位置,而是把「玩家什么时候会用到它」翻译成加载顺序。本节给出一份带依赖与体积的资源清单,再用一段 P 层 TypeScript 内核按「依赖闭包 + 体积预算」自动规划 main 与分包,并用四条不变量断言规划结果,让分包线由约束反推而不是拍脑袋。
引擎选型定下来之后,第一件事不是写玩法,而是把工程骨架的模块边界钉死。本节先把《合成小岛》的十个模块写成一份带层级与依赖方向的配置表,再用一段 P 层 TypeScript 内核做拓扑排序、无环校验与「依赖只能向下」的检查,让模块边界不靠口头约定,而靠一条跑得起来的断言守住。
把前面各节散落的检查(配置合法性、必需文件、体积预算、禁浮点、命名规范、随机数可播种)串成一条发布前流水线。真实 CI 平台的执行不可复现,本节给的是同一套检查逻辑的本地可运行版本:读一份 D 层流水线定义,在本地逐条真跑,产出 JSON、CSV 与报告文本。
配置表是小游戏里的唯一真源:关卡数值、合成链、掉落权重都写在 JSON 里,错的不只是一个文件,而是所有读它的仿真、内核与原型。本节先给出一份带字段、类型、取值范围与必填约束的 D 层 schema,再用一段 P 层校验器把类型、范围、引用完整性、禁浮点与唯一键一次查全,返回全部错误而非首个。
第 2 章把模块边界写成了一张可校验的配置表,但声明会漂移:有人新增一条跨模块 import,表还写着合规。本节把校验对象从声明换成真实源码,用一段 P 层 TypeScript 解析各模块的 import 声明,断言依赖不越界、无环,并顺带扫描 enum、namespace、参数属性、装饰器这些不可擦除构造。
把「在哪些设备上测、每台测什么、风险怎么加权」摆成一张可统计的真机兼容测试矩阵:设备档位、屏幕、内存、输入方式、已知风险与必测项写进一份配置,再用仿真统计屏幕/输入/内存三维覆盖度并按风险等级加权算出必测负担,避免「只在旗舰机上测过」的假安全感。
把小游戏的端到端链路变成可自动跑的断言:用带整数毫秒时间戳的输入序列做录制,按固定步长推进时钟回放,Node 侧与浏览器侧读同一份录制、跑同一段逻辑,断言终局摘要逐位相同;再用 Playwright 无头在单文件 HTML 里回放并对照两侧摘要。
把《合成小岛》最易出错的合成规则收敛成可测的纯函数,用 Node 内置 node --test 写四类断言:边界值(空/上限/越界)、确定性(同 seed 同输入同输出)、异常路径(非法输入被拒绝而非静默通过)、属性不变量(价值守恒、占用单调不增),并讲清哪些该测、哪些不值得测。
把每项优化写成一对整数增量:有的降包体却升内存,有的反过来。枚举所有子集,在包体 × 内存的平面上求帕累托前沿,找出「无法同时再降两者」的那些点,再用 B 基准扰动最不确定的内存增量看前沿怎么变——显式声明这是解析模型而非真机实测,帮你在取舍曲线上选点。
把一次运行拆成稳定帧与长帧两种:长帧占比极小时,平均帧耗时几乎不动,卡顿感知却直线下滑。用整数模型算出长帧频率、有效帧率与感知评分,再用 B 基准扫长帧频率,看评分在哪一档跌破软底线——全程显式声明这是解析模型而非真机实测,避免被平均值误导。
把冷启动耗时拆成下载 / 解析 / 编译 / 首帧四段可加的整数毫秒模型,比较同一包体在 Wi-Fi、4G、弱网三档下的分布,再用 B 基准扫包体看首屏时间在哪里越过预算——全程显式声明这是解析模型而非真机实测,用来判断该砍下载还是砍解析。
渐进式教学按连续失败次数把提示抬到三档,卡住不动时自动给提示,容错侧再给一个有限深度的撤销栈让误操作原路撤回;P 层内核加单测保证状态迁移,W 层单文件 HTML 原型用 Playwright 无头驱动,断言「连续失败→提示升级」与「误操作→撤销」并截图。
引导漏斗回答的是另一类问题:一万个玩家走到第几步会掉。用可播种 LCG 逐玩家逐步骤推进,每步含跳过、失败重试、直接流失三条分支,再跑两遍做对照——允许可跳过步骤跳过与强制逐步完成的最终完成率差多少,产出 JSON、CSV 与纯 Python SVG。
引导状态机把「教玩家认识玩法」变成一串可断言的步骤:每步只认自己的完成事件,未开始、已结束、事件不匹配、不可跳过的步被跳过、第一步没有可回退的步这五种非法迁移一律拒绝且不改状态;再配跳过、回退与幂等重入,用 P 层内核与单测把整条新手路径钉死。
音效与震动是同一个反馈模型的另外两个通道:用一张分级表把「事件 → 音效 → 震动档位 → 是否可关」写死,再用内核处理静音、震动开关、宿主能力探测与同一事件连点的频控,最后用可播种仿真统计一次会话的反馈预算、画出震动分级分布图供策划评估手感。
把「打击感」拆成可量化的三要素:屏幕震动(幅度按几何比衰减、方向交替)、命中停顿帧、缩放脉冲。三者全用整数、无随机,同一权重与同一时刻必得同一结果,最后用单文件 HTML 原型配 Playwright 断言「命中→震动→衰减到静止」的完整数值序列。
把手感拆成可计算的缓动曲线与时间轴:用整数定点实现线性、二次、三次、回弹、弹性五种缓动(进度取千分比、避开浮点),再搭一个支持并行串行、延迟、打断与 onComplete 的时间轴调度器,最后用单文件 HTML 原型配 Playwright 无头推进时间、采样动画值。