Skip to content

动态分辨率组件

动态分辨率(Dynamic Resolution, DR)是一种根据当前帧的性能动态调整渲染分辨率的技术,旨在在保证目标帧率的前提下,最大化画质。其典型应用场景为 GPU 负载较高时自动降低分辨率,负载降低后再提升分辨率。

工作流程

  1. 性能采样 每帧采集 GPU(或 CPU)渲染耗时,通常通过帧时间(Frame Time)或帧率(FPS)来衡量。

  2. 目标帧率与当前性能对比 设定目标帧率(如 60FPS),计算目标帧时间(如 16.67ms)。将当前帧的实际耗时与目标帧时间进行比较,得到“headroom”(裕量)。

  3. 分辨率缩放因子调整

    • 如果当前帧耗时高于目标(headroom < 0),则降低分辨率(减小 scale factor)。
    • 如果当前帧耗时低于目标(headroom > 0),则可以尝试提升分辨率(增大 scale factor),但通常会有计数器和阈值,避免频繁抖动。
    • 分辨率缩放有最小/最大限制,防止画质过差或资源浪费。
  4. 应用缩放因子 将新的 scale factor 应用到渲染目标(Render Target),动态调整渲染分辨率。

  5. 平滑与抗抖动 通过滑动窗口、计数器、阈值等机制,避免分辨率频繁波动,提升用户体验。

关键参数

  • 目标帧率/帧时间:决定性能基准。
  • 最小/最大缩放因子:限制分辨率变化范围。
  • 采样帧数:用于统计平均性能。
  • 调整步长/阈值:控制分辨率调整的灵敏度和幅度

属性面板

alt text

注意事项:

  • 动态分辨率脚本只能挂载在相机下,其他场景对象无法挂载
  • 动态分辨率功能只在运行时工作,编辑器只用来配置参数
  • 动态分辨率需要实时检测GPU Frame Time,因此依赖timer_query扩展,如果当前硬件不支持该扩展将自动转为CPU帧时间计算,动态调节效果可能无法达到预期

主要参数介绍

参数描述
Enable是否启用功能
TargetFPS目标帧率
MinScaleFactor最小缩放系数,例如0.5代表最小减少到分辨率的一半
MaxScaleFactor最大缩放系数,例如1.0代表最大提示到原始分辨率
FrameTimingCount统计帧时间数量,例如5代表选取最近5帧时间计算一次缩放系数
TimingFrameInterval帧时间计算间隔,例如5代表间隔5帧计算一次缩放系数,0代表每帧都计算
DelayInitFrames延时初始化帧数,为了避免刚开始运行时帧时间波动,可以延时帧数启动动态分辨率计算
DeltaThreshold“帧耗时变化量”阈值,衡量 GPU 耗时的波动幅度,用于判断当前帧 GPU 耗时的变化是否足够小,系统是否处于稳定状态。
HeadroomThreshold“性能余量”阈值,衡量当前帧 GPU 耗时与目标帧耗时的差距(headroom)是否足够大,用于判断当前 GPU 性能是否有足够的富余,可以考虑提升分辨率
ScaleHeadroomClampMin限制分辨率提升时“裕量百分比”映射的最小值,防止分辨率提升过于激进,保证分辨率提升的平滑性和可控性
ScaleHeadroomClampMax限制分辨率提升时“裕量百分比”映射的最大值,防止分辨率提升过于激进,保证分辨率提升的平滑性和可控性
ScaleIncreaseSmallFactor控制分辨率提升时的最小步进,防止分辨率提升过快导致画面抖动
ScaleIncreaseBigFactor控制分辨率提升时的最大步进,防止分辨率提升过快导致画面抖动
ScaleRaiseCounterLimit控制分辨率提升操作的触发频率,用于防止分辨率因性能波动而频繁变化,保证画面平滑过渡
ScaleRaiseCounterSmallIncrement控制分辨率提升计数器的“小步进”累加速度,决定了在性能充裕但变化平稳时,分辨率提升的“等待时间”
ScaleRaiseCounterBigIncrement控制分辨率提升计数器的“大步进”累加速度,用于性能明显变好时加速分辨率提升,数值越大,分辨率提升触发得越快,画质恢复更迅速
UseCpuWhenGpuInvalid当GPU无法支持帧时间获取时采用CPU代替
ApplyToXR是否应用到XR平台

运行时脚本

动态分辨率组件在运行时的脚本是NDynamicResolutionComponent,主要提供如下接口

接口描述
IsEnableDynamicResolution是否启用动态分辨率
SetEnableDynamicResolution设置启动/禁用动态分辨率
Reset重置当前计算
GetResolutionScaleFactor获取当前分辨率缩放系数
SetTargetFPS设置目标帧率
GetTargetFPS获取目标帧率