确定性重放
THotPDF.DeterministicReplayLog 捕获可能使操作在不同运行中表现不同的外部决策,然后在重放期间替换记录的结果
捕获的决策
- 取消检查点记录操作名称以及是否请求取消
- 渐进随机访问探测记录精确字节偏移、字节数和可用性结果
- 布尔和 64 位整数回调辅助函数记录稳定的回调名称、两个调用方定义的上下文值和返回的结果
- 批注过滤和平铺渲染取消在通过
THotPDF记录或重放时自动使用重放日志
记录与重放
var
ReplayJSON: AnsiString;
begin
PDF.DeterministicReplayLog.BeginRecording;
PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
ReplayJSON := PDF.DeterministicReplayLog.ExportJSON;
PDF.DeterministicReplayLog.ImportJSON(ReplayJSON);
PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
if not PDF.DeterministicReplayLog.CompleteReplay then
raise Exception.Create(PDF.DeterministicReplayLog.LastDiagnostic);
end;
排序与验证
每个事件携带单调序列号、事件种类、名称、两个有符号 64 位参数和类型化结果
重放按顺序消费事件,并在返回记录结果前验证其完整签名;严格模式在耗尽或不一致时引发 EHPDFDeterministicReplayMismatch,而非严格模式保留不匹配计数和诊断并使用观察到的结果
CompleteReplay 仅在每个保留事件都被消费且无不匹配或丢弃记录事件后成功
边界与性能
EventLimit 默认为 100,000 个事件,DroppedEventCount 报告溢出,事件存储按几何级数增长,因此追加成本保持摊销常数时间
JSON schema 是 hotpdf-deterministic-replay-v1;64 位参数和整数结果编码为十进制字符串,以在 JSON 实现之间保留精确值