我想制作一个在每一帧上更新的 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)
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |