移动设备的帧平滑

为移动设备启用并自定义帧平滑

Windows
MacOS
Linux

帧平滑(Frame Pacing) 用于限制应用程序的渲染帧率不超过设备的本地刷新率。它使应用程序能够在渲染中优先考虑一致性和稳定性,避免无止尽地提升帧率,从而提供更为流畅的用户体验。在虚幻引擎4(UE4)中,你可以借助项目配置文件中的 设备描述(Device Profiles),为每台设备单独设置帧率。

在设备描述中编辑帧平滑设置

你可以通过 DeviceProfiles.ini 文件中的CVar控制帧平滑;该文件包含了你的目标设备信息。

  • 如果是iOS设备,你可以在 [/Script/IOSRuntimeSettings.IOSRuntimeSettings] 下添加设备描述

  • 如果是Android设备,你可以在 [/Script/AndroidRuntimeSettings.AndroidRuntimeSettings] 下添加设备描述

控制帧平滑的参数如下:

参数

使用

说明

FrameRateLock = [value]

FrameRateLock=True

若设置为true,则允许所有帧平滑。

bEnableDynamicMaxFPS = [value]

bEnableDynamicMaxFPS=True

若设为true,则只要设备支持,刷新率最高就允许为120Hz。

适用于4.24和更早版本

rhi.synchinterval = [value]

rhi.synchinterval = 1

4.24和更早版本中的参数,用于设置帧平滑的刷新率。当值为1时,表示刷新率为60Hz。

适用于4.25和更高版本

r.setframepace [value]

r.setframepace 30

4.25中推荐用于iOS和Android设备的新方法。刷新率直接为设置的数值。

a.UseSwappyForFramePacing = [value]

a.UseSwappyForFramePacing=1

默认设为0。将此值设置为1将启用Google的Swappy帧平滑解决方案,以替代Android设备的标准UE4帧平滑器。Swappy使用的CVar和UE4帧平滑器所用的相同。

高刷新率指南

帧平滑的最大刷新率通常被限制为60Hz,但启用 bEnableDynamixMaxFPS 会将这一限值提高到120Hz。支持60Hz以上刷新率的移动设备包括:

  • Samsung Galaxy S20

  • OnePlus 7T

  • Google Pixel 4

  • iPad Pro第2代及更高型号

适用于Android的Swappy帧平滑

除传统帧平滑系统外,虚幻引擎4.25还从 Android游戏SDK 集成了Google的 Swappy帧平滑器

在检测到帧提交延迟后,Android硬件的通常做法是,使用帧缓存来显示之前的帧,从而防止画面撕裂。但游戏渲染器往往不知道此过程,导致同步失效,进而先于显示的帧。这会导致帧的显示时间发生大幅变化,而且由于停滞通常发生在输入取样后,这还会导致触屏控件发生明显的输入延迟。

Swappy是Android专门用于解决此问题的帧平滑解决方案,它不仅能提供帧平滑的优势,还能让游戏的渲染周期和Android设备的刷新周期能更有效地通信。这种方法可以取代传统的、在所有其他硬件上使用的UE4帧平滑器, 它是用于所有其他硬件的传统UE4帧平滑器的替代方案。

启用Swappy

在4.25中,由于还需进行测试,Swappy目前还不是虚幻中Android项目的默认帧平滑器,但与传统帧平滑器相比,它始终保持着更流畅的性能。我们建议你启用它,并且我们还计划在未来的引擎版本中,将Swappy作为Android新的默认帧平滑器。

若要为Android项目启用Swappy,请将 UseSwappyForFramePacing=1 添加到对应的Android描述文件中。你可将它添加到 Android_Default 来让所有Android设备启用它。

在C++中控制帧平滑

要在C++中控制帧平滑,你可以从 FPlatformRHIFramePacer 接口调用静态函数。在此类函数中,帧平滑以32位整数的形式作为参数传递。

FPlatformRHIFramePacer::SupportsFramePace 用于检查指定的帧平滑是否与当前设备的刷新率兼容。FPlatformRHIFramePacer::SetFramePace 用于将帧平滑设为指定的整数值,而 FPlatformRHIFramePacer::GetFramePace 则会返回当前帧平滑。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback