// 在 service 插件页面里渲染缩略图:加载对应版本运行时 → 解析骨骼 → 绘制 → 导出图片。 // 两条产物,互不影响,由插件面板选择: // 静帧(setup pose)—— 原来的那条路,导出 PNG,一直保留; // 动态(animated WebP)—— 参数与主插件默认值一致:画布 200×200、分辨率优先档位表、 // 目标体积由动画时长决定(每秒 25 KB,夹在 25–100 KB),取骨骼里的第一个动画。 // 这里用页面自己的 DOM canvas,不需要 @napi-rs/canvas 那类原生模块。 (function () { 'use strict'; const fs = require('fs'); const path = require('path'); const runtimeCache = new Map(); // 长动画不截断时间轴,只降低采样密度:18 fps 采样,最多 240 帧。 const SOURCE_SAMPLE_FPS = 18; const MAX_SOURCE_FRAMES = 240; // 时长小于这个值的动画按静帧处理。 const STATIC_EPSILON = 1e-6; // 逐帧编码时轮转使用的离屏画布数量:成批提交比逐帧等待快得多。 const FRAME_POOL_SIZE = 4; // 生成策略: // 'size' = 十档全部生成,取实际体积最小的那一档(最省体积,也就是主插件画廊默认打勾的); // 'speed' = 只用粗估挑出体积最小的两档真正生成(最快,其余开销跟着一起砍)。 const DEFAULT_STRATEGY = 'size'; const SPEED_PROBE_SIZE = 256; const SPEED_PROBE_POSES = 12; const SPEED_ESTIMATE_POINTS = 8; const SPEED_CANDIDATES = 2; /** * 让每个版本在自己的 iframe 里加载,返回它的 spine 命名空间。 * * 不能在主页面上用