SwiftUI应用最大每秒帧数(FPS)的查询及修改方法咨询
SwiftUI 设备FPS查询与上限设置解决方案
SwiftUI 目前没有提供独立的对应接口,所有相关能力均可通过桥接 UIKit 的 UIScreen 体系实现,两个问题的具体实现方案如下:
1. 查询当前设备支持的最大FPS
直接读取屏幕对象的 maximumFramesPerSecond 属性即可,兼容多系统版本的代码示例:
func getDeviceMaxFPS() -> Int { // iOS 16+ 兼容写法 if #available(iOS 16.0, *) { guard let scene = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene, let screen = scene.screen else { return 60 // 兜底默认值 } return screen.maximumFramesPerSecond } else { // iOS 15及更低版本写法 return UIScreen.main.maximumFramesPerSecond } }
你可以在 SwiftUI 工程的任意位置直接调用该方法获取数值,返回值就是当前设备硬件支持的最大FPS,60或者120取决于设备型号。
2. 为SwiftUI应用设置FPS上限
分全局生效和单视图生效两种场景实现:
全局生效(全应用统一FPS上限)
在 App 入口的初始化方法中修改全局屏幕的偏好最大FPS即可,示例代码:
@main struct MyFPSLimitApp: App { init() { let targetFPS = 60 // 你要设置的上限值,比如高功耗场景降为60FPS if #available(iOS 16.0, *) { guard let scene = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene, let screen = scene.screen else { return } screen.preferredMaximumFramesPerSecond = targetFPS } else { UIScreen.main.preferredMaximumFramesPerSecond = targetFPS } } var body: some Scene { WindowGroup { ContentView() } } }
单视图生效(仅特定页面使用FPS限制)
- iOS 16+ 可直接使用 SwiftUI 原生修饰符
preferredMaximumFramesPerSecond(_:):
struct LowPowerPage: View { var body: some View { VStack { Text("该页面最高仅运行在60FPS") } .preferredMaximumFramesPerSecond(60) } }
- 低版本系统兼容方案:在视图的生命周期回调中动态修改屏幕FPS,离开页面时恢复默认值即可:
struct CompatibleLowPowerPage: View { @State private var originalMaxFPS = 60 var body: some View { VStack { Text("兼容低版本的限FPS页面") } .onAppear { originalMaxFPS = getDeviceMaxFPS() // 进入页面时设置为60FPS上限 if #available(iOS 16.0, *) { guard let scene = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene, let screen = scene.screen else { return } screen.preferredMaximumFramesPerSecond = 60 } else { UIScreen.main.preferredMaximumFramesPerSecond = 60 } } .onDisappear { // 离开页面时恢复设备最大FPS if #available(iOS 16.0, *) { guard let scene = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene, let screen = scene.screen else { return } screen.preferredMaximumFramesPerSecond = originalMaxFPS } else { UIScreen.main.preferredMaximumFramesPerSecond = originalMaxFPS } } } }
注意:设置的FPS上限不能超过设备硬件支持的最大值,超出的数值会被系统自动修正为设备最大FPS。
内容的提问来源于stack exchange,提问作者Nick Rossik
相关产品推荐
相关产品推荐

