You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:48:02