提高 Swift Charts 性能

nik*_*ers 6 ios swift swiftui

我想制作一个在每一帧上更新的 Swift 图表 - 我希望监视不断更新的数据源。我制作了一个小演示视图来执行此操作,但 CPU 使用率非常高 - 恒定为 90%

我该怎么做才能更好地使用 SwiftUI,并将 CPU 使用率降低到更适度的水平,同时仍以屏幕刷新率进行更新?

我的例子在这里:

import SwiftUI
import Charts

struct DataPoint: Identifiable {
    var id: Int { return x }
    
    let x: Int
    let y: Float
}

class ViewModel: ObservableObject {

    @Published var data: [DataPoint] = []
    
    init() {
        data = _regen()
        
        Task {
            await loop()
        }
    }
    
    func regen() {
        data = _regen()
    }
    
    func loop() async {
        try? await Task.sleep(nanoseconds: 1_000_000_000 / 120)
        Task { @MainActor in
            regen()
        }
        await loop()
    }
    
    private func _regen() -> [DataPoint] {
        let start = Int(Date().timeIntervalSince1970 * 60) % 100
        let end = start + 300
        let vals: [DataPoint] = (start..<end).map {
            DataPoint(x: $0, y: sin(Float($0) / 10.0))
        }
        return vals
    }

}

struct ContentView: View {
    
    
    @ObservedObject var viewModel: ViewModel = ViewModel()
    
    var body: some View {
        VStack {
            
            Chart(viewModel.data) {
                LineMark(
                    x: .value("", $0.x - viewModel.data[0].x),
                    y: .value("Value", 1-($0.y))
                )
            }

            Chart(viewModel.data) {
                LineMark(
                    x: .value("", $0.x - viewModel.data[0].x),
                    y: .value("Value", $0.y * 0.2)
                )
            }

            Chart(viewModel.data) {
                LineMark(
                    x: .value("", $0.x - viewModel.data[0].x),
                    y: .value("Value", $0.y)
                )
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)