feat: frameProcessorFps="auto"
and automatic performance suggestions (throttle or increase FPS) (#393)
* 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
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
//
|
||||
// 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()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user