跳转至

Cocos Creator 会话重放(实验性)

本文说明 Cocos Creator Session Replay 初始化、Camera 选择、性能参数、触摸隐私和节点隐私规则。

实验性能力

Cocos Creator 会话重放目前为实验性能力,API、平台兼容性和回放效果可能在后续版本中调整。建议先在测试环境评估隐私、性能和回放完整性,再决定是否用于生产环境。

前置条件

Session Replay 依赖:

  1. Android 或 iOS 原生构建;
  2. 已初始化 RUM;
  3. 当前存在有效 RUM View;
  4. 当前 Native SDK 版本支持 Cocos External Replay。

如果没有有效 RUM Context,SDK 会跳过当前帧,不会生成独立于 RUM 的重放数据。建议开启 autoTrack.scenes,或在截帧前手动调用 guanceSdk.rum.startView()

初始化

说明

本页代码示例中的 ... 表示已省略 sdk 基础配置(例如 datakitUrl)。请先参照 SDK 初始化完成通用配置;本页仅展示 Session Replay 相关配置。

import { guanceSdk } from '@cloudcare/cocos-sdk/creator3';

guanceSdk.start({
  ...,
  rum: {
    androidAppId: 'android-rum-app-id',
    iosAppId: 'ios-rum-app-id',
  },
  replay: {
    sampleRate: 1,
    sessionOnErrorSampleRate: 0,
    captureFps: 2,
    maxImageDimension: 720,
    imagePolicy: {
      quality: 'medium',
    },
    touchPrivacy: 'show',
  },
  autoTrack: {
    scenes: true,
  },
});
字段 类型 必须 说明
sampleRate number Session Replay 会话采样率,范围 0–1
sessionOnErrorSampleRate number 错误会话补采样率,范围 0–1
captureFps number 每秒截帧数,只允许整数 1–5,默认 1
maxImageDimension number 截帧最长边像素,范围 1–2048,默认 720
imagePolicy FTReplayImagePolicy 图片编码、单帧大小和每分钟流量策略;显式传入后启用 V2 图片编码
maskInputs boolean 兼容保留字段;当前 Cocos 实现始终默认遮罩 EditBox,传入 false 不会取消该规则
touchPrivacy show / hide 触摸数据隐私级别;show 记录触摸按下和抬起的位置,hide 不记录触摸位置,默认 hide

非法采样率、FPS、图片尺寸或流量策略会在 TypeScript 层抛出 TypeErrorRangeError

图片流量策略

imagePolicy 用于限制已录制会话产生的图片 Resource 流量。只配置质量档位即可使用对应预设:

replay: {
  captureFps: 2,
  imagePolicy: {
    quality: 'medium',
  },
}
档位 默认最长边 编码质量 普通单帧上限 图片 Resource 滚动 60 秒预算
low 480 px 0.35 20 KiB 0.6 MiB
medium 720 px 0.45 40 KiB 1.5 MiB
high 960 px 0.60 80 KiB 4 MiB

imagePolicy 支持以下字段:

字段 类型 默认值 说明
quality low / medium / high medium 质量预设;不改变 captureFps
maxFrameBytes number 当前档位预设 普通图片 Resource 的最大编码大小,范围 1 KiB–1 MiB
maxBytesPerMinute number 当前档位预设 图片 Resource 的滚动 60 秒预算,范围 16 KiB–64 MiB,且不能小于 maxFrameBytes
adaptiveCapture boolean true 是否根据预算用量自适应降低有效图片输出频率、质量和尺寸

显式设置的 maxImageDimensionmaxFrameBytesmaxBytesPerMinute 会覆盖档位预设。captureFps 始终独立配置;提高到 2 fps 或更高时,预算控制器会限制实际输出,因此流量不会按标称 FPS 持续线性增长。

开启 adaptiveCapture 后,SDK 按最近 60 秒已经接受的图片大小调整采集:

预算用量 行为
低于 75% 按配置的 captureFps、质量和尺寸采集
达到 75% 有效图片输出频率降至约 0.5 fps
达到 90% 在降频基础上进一步降低编码质量和图片尺寸
达到 100% 暂停图片 readback,直到滚动窗口释放预算;待写入的触摸记录继续保存

新 View 或横竖屏变化的首帧可使用最多 100 KiB 的独立突发额度,保证页面切换后尽快出现完整画面。为避免质量频繁抖动,预算下降后使用较低的恢复阈值逐步回到正常采集状态。

V2 Native SDK 版本要求

精确的单帧限制和分钟预算依赖 replay.saveImageV2 返回真实编码大小。iOS V2 使用 JPEG,Android V2 使用 WebP;编码结果超过 maxFrameBytes 时会先降质、再缩小尺寸,仍然超限则不写入 Resource。

如果当前 Cocos Bridge 或 Native SDK 不支持 V2,SDK 只探测一次并自动回退到旧图片接口。旧接口保持回放兼容,但只能按单帧上限估算流量,实际消耗可能超过本页预算值。生产环境启用 imagePolicy 前,应同时升级 Cocos SDK 和配套的 Android/iOS Native SDK。

Camera 选择

默认使用当前场景中找到的第一个 Camera。多 Camera 项目应显式指定需要重放的 Camera:

import { setReplayCamera } from '@cloudcare/cocos-sdk/creator3';

export function selectReplayCamera(camera: unknown): void {
  setReplayCamera(camera);
}

setReplayCamera() 每次只保存一个 Camera。多次调用时,后一次传入的 Camera 会覆盖此前设置,SDK 不会同时采集或合成多个 Camera。如果调用时上一帧正在采集,新 Camera 将从下一次采集开始生效。

切换主 Camera 后应再次调用 setReplayCamera()。如果场景中没有可用 Camera,当前帧会被跳过。

触摸隐私

touchPrivacy 控制 Session Replay 是否记录触摸位置:

模式 行为
show 在 Replay 中记录触摸按下和抬起的位置
hide 不记录触摸位置,默认值

触摸采集属于 Session Replay,与 autoTrack.actions 相互独立:即使没有开启 autoTrack.actionstouchPrivacy: 'show' 仍会记录 Replay 触摸;反之,开启 Action 自动采集但保留 touchPrivacy: 'hide' 时,Replay 中仍不会出现触摸位置。即使前后两帧画面没有变化,待写入的触摸操作也会单独保存到 Replay。

当前 Cocos API 只支持全局触摸隐私设置,不支持按节点覆盖触摸隐私。guanceSdk.replay.setPrivacy(node, 'hide') 只隐藏节点画面,不会隐藏该位置上的触摸记录;敏感页面应在启动 Session Replay 时使用 touchPrivacy: 'hide'

触摸位置隐私

触摸坐标可能暴露用户在敏感页面上的操作位置。只有在完成隐私评估并取得必要授权后才应设置为 show;否则保留默认值 hide

节点隐私

所有 EditBox 节点默认使用 mask。还可以为指定节点设置规则:

guanceSdk.replay.setPrivacy(accountNode, 'mask');
guanceSdk.replay.setPrivacy(secretPanelNode, 'hide');
guanceSdk.replay.setPrivacy(publicNode, 'unmask');
模式 行为
mask 以遮罩色覆盖节点矩形区域
hide 以纯色隐藏节点矩形区域
unmask 删除该节点的自定义规则

unmask 只删除自定义规则。节点如果仍是 EditBox,默认遮罩继续生效。

隐私区域按节点的世界坐标矩形计算。自定义渲染、粒子、Shader、RenderTexture 或超出节点包围盒的视觉内容不会自动推导隐私区域,必须在接入测试中逐场景检查。

更多隐私建议见数据与隐私

运行行为

  • 使用 Cocos RenderTexture 截取 RGBA 画面。
  • 未配置 imagePolicy 时保留旧图片路径;显式配置后,Android 使用 WebP V2,iOS 使用 JPEG V2,并按实际编码大小记账。
  • 隐私遮罩在图片压缩前完成。
  • 内容完全相同或近似静止的帧会被跳过;View、画面尺寸或隐私规则变化会强制生成变化帧。
  • 图片因去重、预算或编码大小被跳过时,待写入的触摸记录仍会单独保存。
  • 上一帧仍在处理时,不会并发处理新帧。
  • 单帧捕获或编码失败只丢弃当前帧,不会停止后续 Session Replay 采集。
  • 临时图像写入 Native SDK 后会从应用临时目录删除。

流量估算

流量预算仅统计图片 Resource,不包含 Replay Segment、触摸记录和上传协议开销。连续战斗、镜头移动、粒子等高动态画面通常更接近档位上限;菜单、静态背景和少量 UI 动画会受完全相同帧与近似静止检测影响,实际消耗通常更低。

下表基于 V2 编码与对应档位的默认配置,按单个稳定 View 估算。它用于容量规划,不是实测数据或网络计费保证;显式修改 maxImageDimensionmaxFrameBytesmaxBytesPerMinute 后,范围和上限会随之变化。

档位 休闲场景图片流量估算 高动态场景图片 Resource 上限 低触摸密度下的高动态总量参考
low 0.1–0.4 MiB/分钟 0.6 MiB/分钟 约 0.7–0.9 MiB/分钟
medium 0.2–0.8 MiB/分钟 1.5 MiB/分钟 约 1.6–1.8 MiB/分钟
high 0.4–1.6 MiB/分钟 4 MiB/分钟 约 4.1–4.4 MiB/分钟

休闲场景范围假设画面持续存在少量变化;如果画面完全静止,去重后流量可能更低。高动态图片值是滚动 60 秒预算上限,不是固定消耗。总量参考在图片 Resource 的基础上估入低触摸密度下的 Replay Segment、触摸元数据和应用层上传开销,不包含生产网络中的 TLS、TCP/IP、蜂窝或 Wi-Fi 链路开销。

Android V2 使用 WebP,iOS V2 使用 JPEG。图片内容、压缩器的平台差异、实际变化帧数、View 或方向切换次数、触摸密度和上传重试都会影响最终流量;上线前应在目标平台和实际业务场景中测量。

可使用以下方式估算单个已录制会话的图片流量:

每分钟图片流量 ≈ min(每分钟实际变化帧数 × 平均编码大小, 图片滚动 60 秒预算)

例如 captureFps: 2quality: 'medium' 时,动态画面在预算达到 75% 后自动降频,并在 90% 后降低质量和尺寸,图片 Resource 受 1.5 MiB 滚动 60 秒预算约束,而不是按照 2 × 60 × 40 KiB 持续增长到约 4.7 MiB/分钟。每次新 View 或方向切换的首帧仍可使用最多 100 KiB 的独立突发额度,因此对应窗口可能短时高于常规图片预算。

预算控制的是每个已录制会话,不能代替会话采样。生产环境可先将普通会话 sampleRate 设为 0.01–0.05,再按排障需求配置 sessionOnErrorSampleRate;诊断环境可以临时使用 100% 采样。整体图片流量可按以下方式估算,错误会话补采样、Segment 和网络协议开销需要另外计入:

整体图片流量 ≈ 总会话分钟数 × sampleRate × 已录制会话的估算图片流量/分钟

启停

如果未在 guanceSdk.start() 中传入 replay,也可以在 RUM 初始化并启动 View 后单独开启:

guanceSdk.replay.start({
  sampleRate: 1,
  captureFps: 1,
  maxImageDimension: 720,
  touchPrivacy: 'show',
});

停止截帧:

guanceSdk.replay.stop();

guanceSdk.shutdown() 也会停止截帧。不要同时通过 guanceSdk.start({ replay: ... })guanceSdk.replay.start() 重复启动。

原生宿主 Hybrid 模式不使用上述启停接口。Session Replay 由原生宿主以原生 recorder 模式初始化,Cocos 在 enterCocos()leaveCocos() 之间自动切换到外部捕获源,详见原生宿主 Hybrid 接入

性能建议

  • captureFps: 1imagePolicy: { quality: 'medium' } 开始验证;需要更连贯画面时再提高到 2 fps
  • 只在需要重放的业务环境开启采样。
  • 低端设备出现 GPU、内存或磁盘压力时,优先改用 low,再降低最长边尺寸和采样率。
  • 在横竖屏切换、多 Camera、复杂 UI、低帧率场景下验证图像方向与遮罩位置。

iOS 兼容性

如果初始化时报错:

FTMobileSDK lacks external Session Replay API

表示当前 GuanceSDK 缺少 Cocos External Replay API。请升级到支持 Cocos 的 iOS SDK 版本,重新执行 pod install 并使用 .xcworkspace 构建;升级前可以移除 replay 配置,其他 RUM、Log 和 Trace 能力不受影响。

文档评价

文档内容是否对您有帮助?