ad5e131f6a
* Add `onFrameProcessorPerformanceSuggestionAvailable` and make `frameProcessorFps` support `auto` * Implement performance suggestion and auto-adjusting * Fix FPS setting, evaluate correctly * Floor suggested FPS * Remove `console.log` for frame drop warnings. * Swift format * Use `30` magic number * only call if FPS is different * Update CameraView.swift * Implement Android 1/2 * Cleanup * Update `frameProcessorFps` if available * Optimize `FrameProcessorPerformanceDataCollector` initialization * Cache call * Set frameProcessorFps directly (Kotlin setter) * Don't suggest if same value * Call suggestion every second * reset time on set * Always store 15 last samples * reset counter too * Update FrameProcessorPerformanceDataCollector.swift * Update CameraView+RecordVideo.swift * Update CameraView.kt * iOS: Redesign evaluation * Update CameraView+RecordVideo.swift * Android: Redesign evaluation * Update CameraView.kt * Update REA to latest alpha and install RNScreens * Fix frameProcessorFps updating
64 lines
1.5 KiB
Swift
64 lines
1.5 KiB
Swift
//
|
|
// FrameProcessorPerformanceDataCollector.swift
|
|
// VisionCamera
|
|
//
|
|
// Created by Marc Rousavy on 30.08.21.
|
|
// Copyright © 2021 mrousavy. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
// keep a maximum of `maxSampleSize` historical performance data samples cached.
|
|
private let maxSampleSize = 15
|
|
|
|
// MARK: - PerformanceSampleCollection
|
|
|
|
struct PerformanceSampleCollection {
|
|
var endPerformanceSampleCollection: () -> Void
|
|
|
|
init(end: @escaping () -> Void) {
|
|
endPerformanceSampleCollection = end
|
|
}
|
|
}
|
|
|
|
// MARK: - FrameProcessorPerformanceDataCollector
|
|
|
|
class FrameProcessorPerformanceDataCollector {
|
|
private var performanceSamples: [Double] = []
|
|
private var counter = 0
|
|
private var lastEvaluation = -1
|
|
|
|
var averageExecutionTimeSeconds: Double {
|
|
let sum = performanceSamples.reduce(0, +)
|
|
let average = sum / Double(performanceSamples.count)
|
|
|
|
lastEvaluation = counter
|
|
|
|
return average
|
|
}
|
|
|
|
func beginPerformanceSampleCollection() -> PerformanceSampleCollection {
|
|
let begin = DispatchTime.now()
|
|
|
|
return PerformanceSampleCollection {
|
|
let end = DispatchTime.now()
|
|
let seconds = Double(end.uptimeNanoseconds - begin.uptimeNanoseconds) / 1_000_000_000.0
|
|
|
|
let index = self.counter % maxSampleSize
|
|
|
|
if self.performanceSamples.count > index {
|
|
self.performanceSamples[index] = seconds
|
|
} else {
|
|
self.performanceSamples.append(seconds)
|
|
}
|
|
|
|
self.counter += 1
|
|
}
|
|
}
|
|
|
|
func clear() {
|
|
counter = 0
|
|
performanceSamples.removeAll()
|
|
}
|
|
}
|