P95 FrameTime:软件准备,非指标验收

2026-10-21;E2;35/66;P95 0/5;Lab27参考尚未实现实测。内部开发签名、公证暂缓。

持续记录

---
type: devlog
title: P95 FrameTime窗口合同、算术参考与专项准备
date: 2026-10-21
status: partial
kind: plan
stage: P4
evidence: E2
metric: ios.frame.time.p95
---

# P95 FrameTime当前唯一验收项

文档类型devlog。同一AI依Owner授权承担方案、实现、测试与证据核对,无子代理;不要求Owner额外复核。基线bcdddc72,GPU Device正式通过后整体35/66、剩31,P95专项0/5。历史FPS/FrameTime不重新做真机验收,GPU三项已封存不重开;不得把GPU Session旁路帧值充新P95正式轮。

## 已读合同与E2证据

唯一知识页为[FrameTime P95](/knowledge/metrics/frame-time-p95)。Registry实际metricID为ios.frame.time.p95,scope foreground-device、unit milliseconds、definitionVersion activitytrace-framelifetime-p95.v1。底层自研ActivityTraceFrameLifetimeRawAdapter经pymobiledevice3 DTX ActivityTraceTap/com.apple.instruments.server.services.activitytracetap,subsystem=com.apple.coreanimation、category=IOMFBServer、name=FrameLifetime(当前源码已核);schema和实际源时间转换仍须按原件固定,不能从旧文案猜测。

私有研究20261021-p95-frametime-research-01的baseline-contract-probe-a01.json,通过真实RealtimeMetricProjector消费合成规范化display.frame-lifetime.raw复现:六条80ms有效样本后,discontinuity、target generation变更、两次前后台状态切换之间不调用snapshot、host静默2秒,P95仍80/valid。前三项与知识页既定边界冲突,host静默是否应判陈旧需按当前窗合同显式决定。这是E2规范化输入链控制,不冒称原生decoder输出或真机bug发生率;尚未修改产品、未手机调用。当前共享DisplayPerformanceProjector只在epoch/reconnect和后台snapshot清窗口,targetGeneration仅赋值,断续保留历史;不同display帧被隔离不等于跨display身份切换已处理。

## 先冻结P95公式与质量语义

只接受同一来源合同、目标PID/代际、sourceEpoch/reconnectGeneration与主display下有效、有限非bool正数FrameTime,来源顺序和原生时间事实可追溯。原始帧间隔仍由endMach−prevMach及timebase转换,缺前驱/断续/source-gap不生成有效区间;不改底层已验FrameTime计算。

实时窗口右端T沿用现有短期显示时钟估计:最后有效呈现戳P与其host到达H,当前发表host N,T=P+(N−H),要求N≥H且来源仍新鲜。窗口为(T−10,000,000,000ns,T],禁止未来项;只纳入连续segment有效区间。n<5为null/warmup;否则rank=ceil(95*n/100)(以整数算术避免浮点边界),P95=sort(values)[rank−1],最终按现有Python round(value,6)的六位小数规则(ties-to-even);Session全量P95是另一统计,不混实时窗口。

epoch/reconnect、目标身份/代际、前后台转换立即清P95窗口(不依赖中间snapshot);明确discontinuity或source-gap开启新segment、不跨未知区间沿用旧历史。多display隔离,主display真实切换需新segment;外显示器偶发事件不得清主显示有效历史。host倒退/来源倒退/非有限/来源未验证/掉包或未解码异常不输出valid数值,缺值不补0。host静默严格>1秒时P95置null/stale-source,恰1秒允许;同设备时钟已证过期下界>2秒仍由现有display source clock总门置空,不把下界小或缺钟称新鲜证明。陈旧帧新到达不自动证明当前物理准确。

为P95增加可重算收据,包含算法版本、window右端/左开右闭、segment/身份、输入样本数、rank、首末原生呈现戳、最后source sequence/host、失效原因和原生时间桥资格。原始事件、来源与计算参照均保留;不凭receipt自己证明正确。

## 实施边界与独立参考

优先为P95单独维护有界状态与输出,实际trace来源/身份与前后台立即通知,保留FPS、单点FrameTime、Refresh/Jitter既有语义;不能为了新P95修复重构全部Display链。先核完整调用顺序、decoder边界和consumer字段,若必须共享变更,先追加明确影响和软件反控方案,不擅自把已验指标重新开五轮。

P95有可设计的独立算术参考:另进程从完整Raw原生区间、timebase、准确发表cut及segment事实重建10秒集合,以独立排序/整数nearest-rank计算,逐发表点核值/质量/窗口/样本数/身份。该参考验证派生算法与数据链,不宣称独立物理呈现真值。不得把同一projector调用或产品receipt算出来的值再作为对照。先证明可获得的Raw字段和cut可重建;若不能,补真实输入保管/时间契约,不能直接用无参考政策豁免。

物理来源准确度另核现存Apple原件/可用同场工具资格与自有测试App实际帧事实。CADisplayLink callback和requestedHz只作调度事实,不能冒充实际present;截图不作逐帧真值。若原生独立参考可在自有App设计,必须完成可控分布与实际完成量用例;只有当前实际调查无合格独立物理参考,才在完整无异常五轮后按Owner政策标记正式接受,referenceAccuracyValidated=false、ownerReviewRequired=false。派生算术参考仍必须通过,不得混淆两者。

## 测试App、效率与五轮门

既有Lab26 DisplayPlan实际60秒(10/15/10/15/10)、两段动画,尚非P95的140秒可控长尾分布。先核主线程可控帧扰动、正常/取消/恢复/冷请求的实际机制和采集开销。下一实施决策需固定140秒基线/正常节奏/可控稀疏长尾/恢复配方、目标分布及真实完成账;任何App变更需源码先落盘、匹配软件/开销/本机签名包与覆盖安装,保全旧run不卸载。禁止直接把30Hz请求换算P95真值。

期望单事件O(1)追加、发表在有界10秒窗口排序O(k log k)、内存O(k),明确最大120Hz×10秒与异常上界、超界fail-closed,不重复扫描整Session。新旧真实规模120Hz×10分钟加1小时有界最坏情况,记录wall/CPU、首响应/均值/P95/max、RSS与I/O;发表P95/均值≤1ms、相对完成wall/CPU≤1.15、RSS增≤8MiB,无额外手机服务/高频轮询。只有明确仍未关闭风险时再扩大测试,不以镜像实现单测替代实际消费者与独立算术。

软件先覆盖5点/nearest-rank边界/10秒左开右闭/未来/重复/乱序/缺前驱/非有限/断续/代际/前后台无中间snapshot/多display/host静默1秒边界、历史回放与其它Display字段不变,完整Core0skip、44Core/Codable/CSV/JSONL/SQLite真实链;新包冻结按内部授权,不公证、不伪称正式分发。

准备全部通过后另立P95专属独占attempt、真实枚举容量/源host SHA保全/新五名、五新Session和进程生命、140秒×5及600秒双钟、每轮固定前120机会≥119有效/gap≤2秒、范围/来源/公式异常0、独立算术全部核同、真实负载完成与恢复/成本门通过,首失败整attempt停,不拼轮、不缩分母。当前手机末实际64,下次采集先保全已验Device五run原件和导出后rename保留并真实准入,删除0。历史失败/过渡/尾段和必要回滚全部保留。

## 下一动作

先完成P95来源/decoder/segment与可独立重算时间cut资格、实际E2反控及自有App可控用例细化,再在本页追加具体最小实施决策后写产品代码。当前35/66、P95为0/5,软件调查不是指标通过。网站/GitLab/通知同步欠项按Owner授权partial,正式Developer ID/公证及GPL门保持。

## Minimal Implementation Decision · 2026-10-21

已核真实adapter_id=pmd3.activity-trace.frame-lifetime.raw、adapter_version=2、selector=onlySignposts、scope=foreground-device、raw_unit=signpost-framelifetime、schema=perfowl.display-frame-event/2。decoder规范化Raw确实保存end/previous Mach、numer/denom、quality、presentationNs、target/source/reconnect以及adapter观察host到达,可独立重算区间与发表cut;无须以产品FrameTime字段当真值。实时Realtime消费在Raw事件时先送现有Display,不经engine生成P95,故新机制必须从同一已保管Raw事实消费。

定稿最小实现:新增独立p95_frame_window.py/P95FrameWindow,仅新adapter Raw显式p95PublicationPolicy=p95-window-segment.v2启用,未标历史回放继续原路径。adapter只加policy,不改decoder/服务/transport。Realtime在bind身份及update_target_state立即通知P95专属状态,consume观察同一display Raw,snapshot只覆盖frameTimeP95Ms与其quality并增加p95FrameWindow收据;FPS/FrameTime/Jitter/Refresh计算及采集均不改。

窗口收据记录policy/formula、host发表N、source P/H、估计T、左开右闭边界、segment、目标/epoch/reconnect/display、lastRawSequence、有效n、rank和首末source seq/原生戳;未来/陈旧/无足够样本输出null。来源service/channel/selector/adapter/version/scope/rawunit、decoded/verified/drop0与payload和envelope身份字段必须一致;以整数原生差值换算验证payload有限positive FrameTime与presentationNs,不信伪造值。raw sequence、host与原生戳严格有序;epoch/reconnect/timebase切换清segment后重新warmup,包络与payload目标错配直接失效。重复序列/host倒退/原生倒退清窗口fail-closed;不同display事件隔离且不延长主display freshness。未取得新目标有效源不得沿用旧window。

valid区间追加O(1),每次追加按最新P剪除>10秒项;硬上界4096有效点/窗口,超界清空并锁定overflow直至显式身份/epoch/reconnect/timebase/前后台新segment,不丢最老点来伪造统计。正常120Hz最多约1200点,O(k)空间;snapshot≤4096项独立sort,先短路foreground/来源/host未来/静默,再evict/filter,n≥5用(95*n+99)//100整数nearest-rank与round(value,6)。不修改现有其它统计字段或metricID;只P95 definition增量记录,正式全量模型合同注册若需变更先记录,不用测试值冒充E4。

原生decoder→Raw→Realtime合成控制、独立整数原生区间oracle与多次发表cut逐点核同;边界、篡改、掉包/来源错配/乱序/overflow全反控;其它Display四字段旧/新同输入完全一致。之后完整Core和50k/实际120Hz×10分钟/一小时有界前后基准,达到上述预算才内部ARM201包。自有App140秒长尾用例仍需另落实施细案与资格,不能因软件修复完成就开正式P95轮。

## Implementation Update · 2026-10-21 · 软件控制进行中

新增P95专属有界窗口,adapter只增显式策略标记;Realtime只对新标记Raw覆盖P95,绑定与前后台转换立即清专属状态。保留旧回放与其余四字段链。首批10项原生合成decoder/adapter/实际Realtime控制通过(0.131秒,E2,手机调用0):独立整数区间重算多cut、无中间snapshot切换、断续/过长/epoch/reconnect、静默与未来边界、来源/原生值篡改、重复/漏前驱、外display隔离、4096超界锁及历史回放/四字段逐点一致。控制不代表E4,P95仍0/5。

分离代码检查发现超界后错误来源可能意外解锁,已将overflow锁限定为仅身份/前后台/source epoch/reconnect/timebase明确转换才可解除;补反控已通过。接着补valid原生区间的refresh倍数检查及最终同钟门的发表质量收据,完整软件与效率尚待执行,不宣布交付完成。

## Efficiency Decision · 2026-10-21 · a01未通过

原生decoder→Raw→Realtime前后各3次,同规模50k每事件发表、120Hz×600秒/3600秒每秒发表的合成推进a01实测wall比2.3733/1.3569/1.3387,CPU同样超1.15;发表均值/P95远低于1ms、RSS无增,但仍不合格,不进入包/真机。原始失败benchmark-p95-a01.json保留。

最小优化定稿:保持相同输入/公式/失效/4096锁和其它帧字段输出,专属窗口增加标准库bisect有序值索引,常态发表不重复扫描/排序全部帧。追加与驱逐由原O(1)改为最坏O(k)的有界C层数组搬运(k≤4096,约32KiB引用),常态查rank O(1),延后cut在确实有到期项时才重建子集O(k log k)。空间仍O(k),不增依赖/服务/线程;此复杂度偏差公开记录,以同一真实规模和效率门实测决定,不放宽预算。来源合同静态元组比较与原生整数检查合并以减少逐事件Python函数调用,语义不减项。优化后全部新异常控制及全量软件需要重新核同。

### Efficiency Update · 2026-10-21 · a02与等价热点优化

a02同规模各3次:50k发表已达wall1.1193/CPU1.1179;600/3600秒原生规模仍约1.25,门槛未通过。剖析发现既有extract_frame_lifetime_fields在每条消息的9字段循环中重复执行相同Mapping类型判定。定稿仅将这一不随字段变化的判定移到循环前,保留原字段顺序、int转换、camel/kebab fallback、错误预览与decoder算法。该共享热点属于性能等价优化,不改已验FrameTime/FPS语义;必须用旧commit的真实decoder对多形态原生合成输入逐条核输出,再完整软件回归。不得把等价优化当已验指标真机重开。

### Efficiency Update · 2026-10-21 · a03

a03 50k wall1.1025/CPU1.1028通过;600秒wall1.150033与3600秒1.1772仍不通过,未四舍五入伪装达标。继续同一extractor等价优化:常见dict直接类型快速判断;已成功解析字段本来都按同顺序存在result,只在错误诊断时生成present_fields=list(result),避免每条正常消息9次无用列表append。P95允许普通dict快速路径,非dict仍按Mapping资格检查。错误诊断字段/顺序和数据转换不变,沿用5000原生形态与全量控制核同;效率门不放宽。

### Order Guard Decision · 2026-10-21

分离状态检查进一步发现:异常清空窗口若同时遗忘顺序水位,旧Raw回放数条后可能重新凑够5点。定稿将顺序高水位与值窗口分离;同source内失效只清值、不降低最后已观察sequence/host/end/pts,明确身份/前后台/epoch/reconnect/timebase转换才重置水位。同目标下倒退epoch或同epoch倒退reconnect拒绝,不将旧source误当新segment。新增旧五条重放反控;该正确性变更完成后须重跑软件与效率,不沿用先前编译版本。

## Test App Decision · 2026-10-21 · Lab27候选,尚未实现

发现可设计的独立参考候选,不能此时宣称没有参考。Apple [MTLDrawable.presentedTime](https://developer.apple.com/documentation/metal/mtldrawable/presentedtime)给出实际上屏host秒数,未呈现或丢帧为0;[CACurrentMediaTime](https://developer.apple.com/documentation/quartzcore/cacurrentmediatime())由mach_absolute_time换算秒;[CAMetalLayer](https://developer.apple.com/documentation/quartzcore/cametallayer)要求及时释放drawable,避免池耗尽。以上是API合同,不证明本手机的全设备参考资格。

### 固定140秒刺激与独立上屏记录

另增自有Fixture的P95专属Core/View与`p95`入口,保持旧Display/GPU场景。新Lab27不卸载旧容器,先备份并核SHA,独占容量与冷请求沿用新鲜准入。四阶段固定20/40/40/40秒:30Hz低节奏基线、60Hz正常、60Hz且每12次请求施加一次有界80ms主线程延迟、60Hz恢复。每次渲染不同颜色的低成本Metal clear pass,单个CAMetalLayer,非截图/非注入;requestedHz、请求量、休眠次数均只作刺激事实,不作实际P95真值。140秒后完整保留尾部,不把计时器到点当所有命令已完成。

请求带schema/runName/recipe/referenceEnabled/用途、版本与源码digest、签发/过期/nonce;新增独占pending根和已消费intent,必须实际前台/温度0或1/canvas设备和queue可用,无GPU/Display/Startup/Memory等并发,旧或多pending直接拒绝。手工与冷请求共用同一执行状态机,不自动重放失败/旧队列。正式purpose必须referenceEnabled,OFF只用于成本资格。

每个drawable在commit前注册addPresentedHandler,记录提交序号、phase、请求/commit/callback的Mach ticks、drawableID、presentedTime和API状态。callback只作有界内存append,不写盘、不截图、不retain drawable到全轮;最多10000请求/10000上屏记录、callback队列峰值≤128,超限或缺drawable/command失败立即停止并partial封口。零presentedTime明确missing/dropped,绝不变成有效0ms。采样前后记录CACurrentMediaTime与Mach的括号时间及timebase,桥宽要求≤0.1ms;不从产品值拟合时间偏移。

正常结束、取消、后台、温度、view消失均停止link/定时器、关闭新提交;最多1秒异步排空已提交handler并保留未完成账。写plan/events/requests/presented/summary原件且不覆盖,明确state/reason、实际phase起止、请求/commit/呈现/丢失/未完成数、idle恢复、workloadReleased、所有成本/时钟证据;资源真正释放后才结束busy。取消并封口后重新运行须新名、新生命,旧partial不改。界面只显示实际状态,不把实现字段混入产品操作流。

### 参考资格与反控

1. 正常140秒、35秒取消、取消后新生命完整恢复、冷请求一次性/过期/重放/同时pending拒绝,各自原件保留;host纯Core先验证参数/阶段边界/计数守恒/溢出/未知phase/零或倒退上屏时间/部分尾部封口。
2. 独立oracle从presentedTime正数严格递增序列计算实际区间,明确该序列初始范围仅本自有Metal layer,不先称整机真值。与完整FrameLifetime Raw在无需拟合偏移的设备同钟下双向逐帧匹配,窗口端点、全部Raw与drawable计数、主display与每个source surface事实都核对;不能单向找近邻、丢弃外来系统帧或只看相关性。
3. 同窗匹配要求时钟桥宽≤0.1ms、双向唯一对应时间差≤0.25ms,所有固定发布机会使用同一原生10秒窗、有效n/rank相同,P95绝对差≤1ms。任何系统额外帧、缺呈现、时钟不明、窗边缘不确定均记参考资格未成立,保留差异,不调时间偏移/缩分母。严格阈值是本次资格目标,不是已证硬件精度。
4. 正常与稀疏尾的实际区间分布和恢复均按真实呈现账判定;若休眠未产生预期分布,case本身未完成,不能用requestedHz推断通过。派生Raw整数算术对照始终独立必测,不因物理参考未资格而豁免。
5. OFF/ON同配方140秒,参考记录增量CPU≤2个百分点、footprint≤8MiB,记录首/平均/P95/最差handler耗时,平均/P95≤1ms;无周期I/O,完整封口≤2MiB,主机处理O(n)、有界匹配O(n)、额外手机服务0。软件与成本门通过才可正式五轮。

上述候选只有实测后才能判定资格。若不能覆盖整机scope,继续核实际可用Apple工具的同层/同窗资格并记录候选表;只有实际调查当前候选均不合格且完整无异常五轮,才适用Owner无独立参考正式接受政策并保留标记,不要求Owner再复核。当前Lab27未实现/安装、手机调用0,P95仍0/5。

### Final Invalid-Number Guard · 2026-10-21

最终输入审计发现Python math.isfinite对异常巨大整数可能抛OverflowError。定稿把与原生有限期望区间的等值检查放在isfinite之前,巨大且不匹配整数短路置空;不改变任何真实decoder浮点值。增加巨大整数反控。ARM201已完成内部安装但不用于正式轮;该最后修正随ARM202重新冻结/包核同,201原件作为可追溯候选保留,不以旧包冒充最新源码。软件/效率对最终修正重新验证后再交付。

巨大整数反控实际进入Realtime全链后进一步定位到旧共享Display的float转换也未接住OverflowError。最小扩充已有数值转换异常捕获(typed字段int转换、FrameTime与Refresh float转换)包含OverflowError,合法值算法不变,非法值按原unsupported-schema/缺值分支处理;属于异常输入保护,不宣称已验指标获得新真机证据。a06基准启动后发生该源码增量,不能作为最终固定源性能结论,保留为中间结果;待固定源后重跑a07。

## Validation Update · 2026-10-21 · ARM202软件准备完成,指标未验收

固定源完整Core a05 **2851/2851、0skip**,135.293秒,全部源码/测试pins前后核同;原a02有175项分片60秒超时未计通过、a04启动前后有最后异常输入修正,均保留,不混称最终固定源验证。最终13个新专项测试包含多cut原生整数oracle、左开边界、最少5点、来源/顺序/目标/前后台/timebase/overflow、巨整数异常,以及其它四Display字段逐点等价;5000条10形态原生decoder与旧commit输出核同。

最终效率a07每场景基线/当前各3次:50k每事件发表、120Hz×600秒/3600秒每秒发表,wall比依次 **1.111098 / 1.136757 / 1.121459**,CPU/RSS与发表平均/P95均符合冻结预算。真实规模是合成事件推进,不是实等1小时手机测试;实际I/O物理峰值未知,rusage block I/O/首响应/最差延迟保留私有收据,不外推手机成本。早期a01/a02/a03效率失败、a06中途源码变化均保留。

真实44个Swift Core源及新增P95Consumer通过8个实际Python原生decoder→Realtime样本的模型/Codable/CSV/JSONL控制。首版控制把整数Mach差换算误写为16.666667,实际应为16.666666;输入生成断言及后续缺输入失败保留,新a02用正确独立整数期望并核原编译源/二进制后全部通过,没有修改产品来配合错误期望。

ARM202开发签名、源码/ARM依赖、严格签名、独立只读解包 **12931** 文件/链接及模式核同,实际同址安装/签名/所选证书核同。包为`MacApp/dist/Perfowl-1.0.0-202-arm64-internal.dmg`,116312539字节,SHA-256 `b23a215ea288aea71f5ff1782c313ca088487edffab3ac3ea6a232ad300001a6`。ARM200与中间ARM201 App/DMG均私有保留,删除0;dist仅当前包及校验文件。Gatekeeper exit 3,不是Developer ID包/已公证分发;沿用Owner仅本机内部授权,公证暂缓与GPL门保留。

软件与主机安装准备完成不等于P95验收。整体仍 **35/66**、P95 **0/5**,本批手机调用 **0**,Lab26及末实际64仅历史实况、下一采集必须重新枚举/全源SHA保全。Lab27新Metal上屏参考用例已定稿但**尚未实现/安装/实测**,尚不能判定没有合格参考;不得提前套用无参考正式通过政策。下一实现上节Lab27、来源/同窗资格、完整正常/取消/恢复/冷请求与OFF/ON成本,再另立独占五轮;旧GPU五轮不能充P95数据。交付同步与网站/通知配置欠项单列partial,不要求Owner额外复核。