时间超级分辨率 (TSR)是一个与平台无关的时间分辨率修改器,它使虚幻引擎能够渲染美丽的4K图像。由于它将一些开销大的渲染计算分摊到了许多帧,图像的开销只占一小部分。其做法是渲染比虚幻引擎4中的时间抗锯齿上采样(TAAU)更低的内部分辨率。
TSR提供了一种原生的高质量上采样技术,以满足次世代游戏的需求。它实现了Nanite几何体要求的保真度和细节所需的可能性,同时允许以低得多的分辨率渲染帧,从而为Lumen提供足够的性能。
下面的比较展示了在原生4K分辨率下渲染的帧与在1080p经分辨率修改而成的4K分辨率下渲染的帧之间的质量和性能差异。使用TSR,可以实现接近4K分辨率的图像质量,同时还可将GPU帧时减半。


在以上比较中,每个图像是限制为此页面宽度的4K图像。要按完全未压缩的分辨率查看,请右键点击任一图像并将其保存到计算机,或在新的浏览器窗口中打开。
时间超级分辨率具有以下属性:
- 在输入分辨率低至1080p的情况下,渲染帧接近原生4K的质量。
- 相比于采用虚幻引擎4的默认时间抗锯齿方法,高频率背景上的可见"重影"瑕疵更少。
- 减少高复杂性几何体频闪。
- 在主机平台上支持动态分辨率缩放。
- 可在支持D3D11、D3D12、Vulkan、Metal、PlayStation 5和Xbox Series S | X的所有硬件上运行。
- 着色器专门针对PlayStation 5和Xbox Series S | X GPU架构进行了优化。
在渲染链中,TSR在景深之后发生,后续所有内容都会进行分辨率修改。
TSR的可扩展性
你可以在各个支持的平台上使用时间超级分辨率,但你需要基于项目的需要自定义每个平台的分辨率修改设置。 探索以下小节,了解你可以在项目中检查TSR的一些方式,然后相应进行缩放。
理解时间性细节累积的注意事项
单纯宣传TSR通过降低分辨率渲染所实现的帧率增加并不完全公平,因为时间分辨率修改器通常也有自身的局限性。对于静态图像,只要有足够的帧时,任何时间分辨率修改器都可以渲染出完全相同的结果。此外,与所有时间分辨率修改器一样,TSR也会逐渐累积分辨率较低的帧以收敛图像,并且只有在累积了足够的细节之后才能知晓图像的细节。例如,在第一帧中 无法知晓 几何体的厚度。


渲染分辨率由屏幕百分比控制。它控制一帧的可用信息量。收敛所需的其余信息取决于该帧其余待渲染的部分。这意味着TSR显示的信息取决于所渲染帧的分辨率和帧率两个因素,因为后者会影响细节的累积速度。
并非只有GPU会限制影响TSR的帧率,在遇到CPU瓶颈或在固定刷新率显示器上开启VSync等情况下,也存在这种限制。
在这方面,控制台命令 stat tsr 有助于发现哪些因素可能影响TSR向整体图像的累积。调用时,该命令会在调用 stat unit 时通常显示的统计数据基础上添加两项统计数据。它们是 TSR输入 和 TSR1spp 。
TSR输入 将显示每秒送入TSR的像素数,这是一项重要的宏观指标,用于了解TSR需要收敛多少数据才能得到整体图像。 渲染分辨率宽度 * 渲染分辨率高度 * 帧率 = 显示分辨率宽度 * 显示分辨率高度 * 屏幕百分比^2 * 帧率 。该指标的优点是,可以在运动中表明宏观图像质量,无需考虑显示分辨率。下表说明了该指标如何修改分辨率:
| 显示分辨率 | 屏幕百分比 | 帧率 | TSR输入(MP/s) |
|---|---|---|---|
| 4k (3840x2160) | 50% | 60hz | 38402160(50/100)^2*60 = 124.4 MP/s |
| 4k (3840x2160) | 58% | 60hz | 167.4 MP/s |
| 4k (3840x2160) | 66% | 60hz | 216.7 MP/s |
| 4k (3840x2160) | 50% | 30hz | 62.2 MP/s |
| 4k (3840x2160) | 72% = 50% x sqrt(2) | 30hz | 124.4 MP/s |
| 1080p (1920x1080) | 100% | 60hz | 124.4 MP/s |
| 1080p (1920x1080) | 72% = sqrt(0.5) | 60hz | 62.2 MP/s |
| 1080p (1920x1080) | 50% | 60hz | 31.1 MP/s |
TSR 1spp 是TSR的收敛速率,即TSR获得足以达到每个像素一个取样的数据所需时间。这在运动中尤其重要,因为可能存在需要快速积累细节的解除遮挡。TSR 1spp = 1000 / (屏幕百分比^2 * 帧率)。
| 屏幕百分比 | 帧率 | TSR收敛速率 |
|---|---|---|
| 50% | 60hz | 1000 / ((50/100)^2 * 60) = 66.6 ms |
| 58% | 60hz | 49.5 ms |
| 66% | 60hz | 38.2 ms |
| 100% | 60hz | 16.6 ms |
| 50% | 30hz | 133.3 ms |
以下举例说明了如何使用这些数据:如果你的"屏幕百分比(Screen Percentage)"设置为50,这意味着你需要 (50/100)^-2 = 4帧,才能让每个像素至少有一个取样。如果每帧渲染需要16.6毫秒,这意味着屏幕上的解除遮挡区域将需要四倍的时间(即4*16.6 = 66.4ms)才能获得足够的数据。
TSR的分辨率修改GPU开销
TSR的主要目标是分辨率修改。其大部分GPU工作基于为其提供的分辨率进行缩放。这是由于TSR的部分GPU开销需要在比渲染分辨率更高的显示分辨率下完成。
使用 stat gpu 从控制台打开GPU统计显示。将其打开后,你可以调整主屏幕百分比,查看按100%和50%屏幕百分比渲染时性能有什么不同,就像以下从《遗迹峡谷》示例项目获取的例子那样。
| 在r.ScreenPercentage=100时约0.79毫秒 | 在r.ScreenPercentage=50时约0.43毫秒 |
| 点击查看大图。 | 点击查看大图。 |
TSR的视差启发法依赖深度和速度缓冲,而不是帧的场景颜色和半透明度,因为深度和速度缓冲在GPU上的完成时间通常远早于场景颜色和半透明度缓冲的完成时间。这样整个TSR视差启发法就可以在GPU上进行异步计算,用 r.TSR.AsyncCompute=2 填补因GPU未得到其他渲染算法充分利用而产生的空白。
在PlayStation 5和Xbox Series X上的《堡垒之夜》第4章,测试整个空降行动性能重播时,此做法可抵消TSR总GPU开销的约0.5ms。在重播中节省了约0.1ms,从而将有效TSR开销压低到1.5ms,并将完成帧渲染的关键路径GPU开销压低至1.1ms。
控制台变量
引擎可扩展性设置可在所有平台中缩放TSR的质量。它们使用从 低(Low) 到 电影级(Cinematic) 的预定义可扩展性组。每个组由影响不同渲染属性(包括抗锯齿)的一组控制台变量定义。
打开 [虚幻引擎根目录]/Engine/Config 文件夹下的 BaseScalability.ini 文件,可以检查可扩展性设置的使用情况。查看 AntiAliasingQuality 分段,了解TSR如何根据所用抗锯齿质量组进行缩放。更改 [你的项目根目录]\Config\DefaultScalability.ini 中的设置可修改自己项目的抗锯齿质量组。
你可能需要为项目做出调整,例如,TSR包括一种空间抗锯齿算法,每当需要拒绝历史记录以避免可能为当前帧引入重影错误的陈旧数据时,都会使用该算法。若游戏项目仍需要按更高分辨率或更高帧率渲染,可能就不需要此选项,因为所显示的锯齿可能不会被拒绝。TSR的历史记录拒绝通过 r.TSR.RejectionAntiAliasingQuality 控制。
时间分辨率修改的隐藏额外GPU成本
时间超级分辨率和其他任何时间分辨率修改器在渲染器的后期处理链中间发生。这意味着,动态模糊或色调映射器等在TSR之后运行的通道不再使用主屏幕百分比缩放。在缺少带空间分辨率修改器的辅助屏幕百分比(r.SecondaryScreenPercentage.GameViewport)的情况下,TSR的输出分辨率恰好按显示分辨率而不是渲染分辨率运行。 默认启用TSR的情况下,大量工作专注于减少在TSR之后发生的通道隐藏时间分辨率修改成本。
动态模糊
动态模糊优化在PlayStation 5和Xbox Series X上可带来3倍的动态模糊GPU性能成本改善,这些平台即使在较低分辨率的电视机上也始终显示2160p后台缓冲区。
- 使用
stat gpu时提高了TSR成本:- 比较启用和禁用动态模糊的情况时,TSR成本在使用
stat gpu时可能稍有增加。 - 启用动态模糊时,TSR会接管其通常按输入分辨率运行的 速度展平(Velocity Flatten) 通道。这使用控制台命令r.MotionBlur.AllowExternalVelocityFlatten进行控制,并已默认启用。
- TSR输出半分辨率场景颜色,以减少大型定向模糊核中可能出现的内存带宽瓶颈。这使用控制台命令
r.MotionBlur.HalfResInput进行控制,并已默认启用。
- 比较启用和禁用动态模糊的情况时,TSR成本在使用
- 定向模糊上的半分辨率:
- 按显示器分辨率发生的定向模糊经过优化,可在发生非常大的移动时自动按半分辨率运行。启用此功能将降低动态模糊的VALU成本。
- 使用控制台命令
r.MotionBlur.HalfResGather 1启用此优化。
- 动态模糊半分辨率和四分之一分辨率:
- TSR和动态模糊能够输出半分辨率或四分之一分辨率,这对于全都在动态模糊之后运行的高斯和卷积泛光、镜头光晕、眼部适应(自动曝光)和局部曝光很重要。
PostProcessQuality可扩展性组会对 Engine/Config/BaseScalability.ini 中的部分 r.MotionBlur.* 进行缩放。
附加说明
排除TSR故障
由于TSR是一个时序升频器,有些时候你需要诊断哪些构件影响时序升频器。首先,你可以使用 VisualizeTemporalUpscaler 显示标记查找原始输入和输出缓冲区。
你可以从关卡编辑器的 显示(Show)>可视化(Visualize) 菜单中选择 时序升频器(TSR、TAAU或第三方插件) 来访问这个显示标记。
有关更多信息,请参阅时序升频器。
针对像素闪烁进行调整
帧中发生像素闪烁的原因可能各种各样,有时问题可以得到缓解。你可使用一些控制台变量来定义像素闪烁之间的差异,比如以切线角看着一栋建筑时的像素闪烁,或像素着色器动画的像素闪烁。
你可以使用 r.TSR.ShadingRejection.Flickering.Period 来设置60hz帧中的周期,其中以相等或更高频率的亮度振荡会被视为闪烁,应加以稳定。但当这一稳定处理发生在图像上的非预期区域时,会引入重影。
![]() |
![]() |
|---|---|
| r.TSR.ShadingRejection.Flickering.Period:0 | r.TSR.ShadingRejection.Flickering.Period:3(默认值) |
| 屏幕百分比:100 | 屏幕百分比:100 |
TSR的这个设置之所以重要,是因为它可以将像素闪烁与其他理想的视觉效果(如像素着色器动画)区分开来。但一个重要区别是,闪烁会在任何帧率下发生。视觉效果基于时间,因此与帧率无关。这可能意味着,在60hz下表现平稳的视觉效果在较低帧率(比如24hz)下可能表现为"闪烁"。
注意,美术师创作的视觉效果必须始终不受帧率的影响,因为TSR可进行缩放来满足GPU性能。当玩家的机器以低于预期的帧率运行时,这可能带来意外影响,导致视觉效果发生变化。因此,控制台命令 r.TSR.ShadingRejection.Flickering.Period 会在帧率降至低于用 r.TSR.ShadingRejection.Flickering.FrameRateCap 定义的帧率(默认值为60hz)时自动减少闪烁。这意味着,在60hz下表现稳定的几何体细节在较低帧率下可能变得不太稳定。此行为默认情况下启用,但可以使用 r.TSR.ShadingRejection.Flickering.AdjustToFrameRate 选择退出该行为。
支持的平台
时间超级分辨率在支持Shader Model 5的所有台式机硬件中的台式机渲染器上可用。以下平台支持时间超级分辨率:
- Windows D3D11 SM5、D3D12 SM5、D3D12 SM6和Vulkan SM5
- Linux Vulkan SM5
- Mac Metal SM5
- PlayStation 5和Xbox Series S | X
TSR的分辨率修改质量和行为在所有支持的平台中完全相同。但是,TSR已针对PlayStation 5和Xbox Series S | X主机中使用的AMD RDNA GPU专门进行优化,利用16位类型和打包指令。
控制台变量
| 控制变量名 | 说明 |
|---|---|
r.TSR.AsyncCompute |
控制TSR如何在异步计算中运行。一些TSR通道可能与之前的通道重叠:
|
r.TSR.History.R11G11B10 |
当设置为 "1 "时,选择历史记录中的位深度。@@通过对在前一帧的历史重新投射和对输出的写出进行保存新的历史记录,节省了内存带宽,这在TSR的UpdateHistory的运行时性能中十分重要。当使用 r.PostProcessing.PropagateAlpha=1 时,无法进行此种优化。另外请注意,由于从TSR历史分辨率到TSR输出分辨率的降频过程,将 r.TSR.History.ScreenPercentage 增加到200,与TSR输出的位深度相比,在历史记录中增加了两个隐含的编码位。 |
r.TSR.History.SampleCount |
TSR历史记录中每个输出像素的最大样本数。更高的数值意味着在静态图像的高光部分更加稳定,但在某些VFX类型上可能会导致额外的重影,如萤火虫。由于TSR.History.Metadata的编码限制,你可以有最少8个样本,最多32个。默认样本数量是16个。 |
r.TSR.History.ScreenPercentage |
基于输出分辨率的TSR历史记录的分辨率乘数。提高分辨率会增加TSR的运行成本,但可以让它在整个@@重投过程中保持更好的清晰度和@@历史存储细节的稳定性。默认情况下,由于使用了一个基于NyQuist-Shannon采样定理的特性,该值被设置为200,这为历史记录中累积的细节的采样率建立了一个充分条件。就结论而言,此处只支持100和200之间的数值。这个值是用抗锯齿可扩展性组控制的。超高级和电影级的质量等级使用200,其他所有等级使用100。 |
r.TSR.History.UpdateQuality |
在TSRHistoryUpdate通道中选择更新历史的质量的着色器置换。目前这是由 sg.AntiAliasingQuality 可扩展性组驱动的。关于每个组的功能细节,请参阅TSRUpdateHistory.usf中的 DIM_UPDATE_QUALITY ,以进行自定义。 |
r.TSR.RejectionAntiAliasingQuality |
当需要由历史限制时,控制TSR内置的空间抗锯齿技术的质量。虽然在渲染分辨率不显著低于显示分辨率的情况下,这一点并不关键,但这种技术对于隐藏较低的渲染分辨率是必不可少的,原因有二:混叠的屏幕空间大小与渲染分辨率成反比,以及在较低的分辨率下进行渲染意味着需要更多的帧以达到每次显示至少有一个渲染像素。默认情况下,除了低可扩展性组,该选项对所有抗锯齿扩展性组都是启用的。 |
r.TSR.ShadingRejection.Flickering |
TSR输出的不稳定性在大多数情况下来自于着色抑制的不稳定性。这可能由于不同的理由发生,例如:
当启用时,任何存储在TSR.Moire.Luma资源中的半透明图画在连续的帧中演变之前都会由这个启发法监测帧的亮度。如果不断地检测到闪烁,并且经常发生在 区分闪烁像素与动画像素的另一个要点是,闪烁的发生与帧率无关,鉴于视觉效果是/应该是基于时间判断的,因此与帧率无关。这可能意味着,在每秒60帧时看起来很流畅的视觉效果,在较低的帧率,如每秒24帧时可能会出现 "闪烁"。为了避免美术师创作的视觉效果出现重影,控制台变量 默认情况下,这个控制台变量在 "高"、"超高 "和 "电影 "级别的抗锯齿扩展性组中被启用。 |
r.TSR.ShadingRejection.Flickering.AdjustToFrameRate |
当低于该帧率上限时,闪烁周期设置(r.TSR.ShadingRejection.Flickering.Period)是否应根据帧率进行调整。更多细节请参阅 r.TSR.ShadingRejection.Flickering。 |
r.TSR.ShadingRejection.Flickering.FrameRateCap |
以赫兹为单位的帧率上限,当渲染帧率较低时,会自动调整 r.TSR.ShadingRejection.Flickering.Period。更多细节请参阅 r.TSR.ShadingRejection.Flickering 条目。默认情况下,该值设置为60hz |
r.TSR.ShadingRejection.Flickering.MaxParallaxVelocity |
一些使用视差遮挡映射的材料,如城市样本,其建筑物的窗户内部往往不能准确渲染这种假的内部几何体的运动向量。这可能导致启发法认为发生闪烁,而实际上并非如此。这个变量定义了在由 r.TSR.ShadingRejection.Flickering.FrameRateCap 定义的帧速率下,1080p像素的视差速度,在这个时候,启发法应该禁用,以免造成重影。 |
r.TSR.ShadingRejection.Flickering.Period |
@@在帧中,以相同或更大频率的亮度振荡周期会被认为是闪烁,导致产生重影以稳定图像。更多细节请参阅 r.TSR.ShadingRejection.Flickering 条目。默认情况下,该值设置为3 |
r.TSR.ShadingRejection.SampleCount |
完全着色抑制后历史记录中每个输出像素的最大样本数。较低的数值意味着在历史记录中的着色抑制后,图像的清晰度更高,但在后续的新增帧上像素将会更不稳定,造成视觉上的干扰。默认情况下,该值设置为2.0 |
r.TSR.Subpixel.DepthMaxAge |
子像素用于再投射的历史深度的最大时长(以帧为单位)。默认值为3。 |
r.TSR.Subpixel.IncludeMovingDepth |
移动子像素的细节是否包括子像素用于再投射的历史深度。在大多数情况下,这个功能无需启用,因为当只有偶尔绘制速度时,无法得知运动物体的速度如何随时间变化。此设置默认禁用。 |
r.TSR.Subpixel.Method |
有时网格体的细节可能比渲染的像素更细,这导致只能渲染一些帧,这对于Nanite能够渲染的细节数量是一个挑战,当这种情况发生时,意味着深度和速度缓冲区都无法重新投射它们。你可以用 此设置控制了重新投影和废弃子像素细节的方法:
|
r.TSR.Velocity.WeightClampingPixelSpeed |
定义输出像素的速度,在这个速度下,历史高频将被限制贡献权重。当像素速度小于 r.TSR.Velocity.WeightClampingSampleCount 时,可以用它来插入 r.TSR.Velocity.WeightClampingPixelSpeed 的效果。 |
r.TSR.Velocity.WeightClampingSampleCount |
当输出速度达到 r.TSR.Velocity.WeightClampingPixelSpeed 时,在历史像素中用于限制历史所需要的样本数。更高的值意味着运动时更高的稳定性,但代价是由于每次历史重投影产生连续卷积会导致模糊。你可以通过控制台命令 vis TSR.History.Metadata 直观地看到TSR历史中的样本数量。请注意,此变量在历史像素而非输出像素中限制采样数。因此,设置较低的数值在较高的TSR屏幕百分比(r.TSR.History.ScreenPercentage)下不太明显。这样做是为了使单方面自动的增加能提供更多的时序稳定性,同时保持细节重投的清晰度,但代价是无论如何设置,都要耗费额外的运行时间成本。例如,一个以故事性驱动的游戏可能将这个设置保持在4.0,以获得 "电影 "级别的效果,而像《堡垒之夜》这样的竞技游戏则可能将其降低到2.0左右。(默认值为4.0f。) |
r.TSR.WaveOps |
是否在着色抑制启发法中使用@@波操作来加快卷积。着色抑制启发发优化对着色器编译器来说存在困难,致使它们损坏或出现质量损失。 |

