114 lines
2.8 KiB
Swift
114 lines
2.8 KiB
Swift
//
|
|
// Example
|
|
// man
|
|
//
|
|
// Created by man 11/11/2018.
|
|
// Copyright © 2020 man. All rights reserved.
|
|
//
|
|
/*
|
|
import Foundation
|
|
import UIKit
|
|
|
|
public class FPSCounter: NSObject {
|
|
|
|
internal class DisplayLinkProxy: NSObject {
|
|
|
|
@objc weak var parentCounter: FPSCounter?
|
|
|
|
@objc func updateFromDisplayLink(_ displayLink: CADisplayLink) {
|
|
parentCounter?.updateFromDisplayLink(displayLink)
|
|
}
|
|
}
|
|
|
|
|
|
// MARK: - Initialization
|
|
|
|
private var displayLink: CADisplayLink
|
|
private var displayLinkProxy: DisplayLinkProxy
|
|
|
|
|
|
public override init() {
|
|
self.displayLinkProxy = DisplayLinkProxy()
|
|
self.displayLink = CADisplayLink(
|
|
target: self.displayLinkProxy,
|
|
selector: #selector(DisplayLinkProxy.updateFromDisplayLink(_:))
|
|
)
|
|
|
|
super.init()
|
|
|
|
self.displayLinkProxy.parentCounter = self
|
|
}
|
|
|
|
deinit {
|
|
self.displayLink.invalidate()
|
|
}
|
|
|
|
|
|
// MARK: - Configuration
|
|
|
|
public weak var delegate: FPSCounterDelegate?
|
|
|
|
@objc public var notificationDelay: TimeInterval = 1.0
|
|
|
|
|
|
// MARK: - Tracking
|
|
|
|
private var runloop: RunLoop?
|
|
private var mode: RunLoop.Mode?
|
|
|
|
|
|
@objc public func startMonitoring(inRunLoop runloop: RunLoop = .main, mode: RunLoop.Mode = .common) {
|
|
if CocoaDebugSettings.shared.enableFpsMonitoring == false {return}
|
|
|
|
self.stopMonitoring()
|
|
|
|
self.runloop = runloop
|
|
self.mode = mode
|
|
self.displayLink.add(to: runloop, forMode: mode)
|
|
}
|
|
|
|
|
|
@objc public func stopMonitoring() {
|
|
guard let runloop = self.runloop, let mode = self.mode else { return }
|
|
|
|
self.displayLink.remove(from: runloop, forMode: mode)
|
|
self.runloop = nil
|
|
self.mode = nil
|
|
}
|
|
|
|
|
|
// MARK: - Handling Frame Updates
|
|
|
|
private var lastNotificationTime: CFAbsoluteTime = 0.0
|
|
private var numberOfFrames = 0
|
|
|
|
private func updateFromDisplayLink(_ displayLink: CADisplayLink) {
|
|
if self.lastNotificationTime == 0.0 {
|
|
self.lastNotificationTime = CFAbsoluteTimeGetCurrent()
|
|
return
|
|
}
|
|
|
|
self.numberOfFrames += 1
|
|
|
|
let currentTime = CFAbsoluteTimeGetCurrent()
|
|
let elapsedTime = currentTime - self.lastNotificationTime
|
|
|
|
if elapsedTime >= self.notificationDelay {
|
|
self.notifyUpdateForElapsedTime(elapsedTime)
|
|
self.lastNotificationTime = 0.0
|
|
self.numberOfFrames = 0
|
|
}
|
|
}
|
|
|
|
private func notifyUpdateForElapsedTime(_ elapsedTime: CFAbsoluteTime) {
|
|
let fps = Int(round(Double(self.numberOfFrames) / elapsedTime))
|
|
self.delegate?.fpsCounter(self, didUpdateFramesPerSecond: fps)
|
|
}
|
|
}
|
|
|
|
|
|
public protocol FPSCounterDelegate: NSObjectProtocol {
|
|
func fpsCounter(_ counter: FPSCounter, didUpdateFramesPerSecond fps: Int)
|
|
}
|
|
*/
|