diff --git a/ScreenShader.xcodeproj/xcshareddata/xcschemes/ScreenShader.xcscheme b/ScreenShader.xcodeproj/xcshareddata/xcschemes/ScreenShader.xcscheme new file mode 100644 index 0000000..e8f75e6 --- /dev/null +++ b/ScreenShader.xcodeproj/xcshareddata/xcschemes/ScreenShader.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScreenShader.xcodeproj/xcuserdata/branpk.xcuserdatad/xcschemes/xcschememanagement.plist b/ScreenShader.xcodeproj/xcuserdata/branpk.xcuserdatad/xcschemes/xcschememanagement.plist index ae3457b..26f94ec 100644 --- a/ScreenShader.xcodeproj/xcuserdata/branpk.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/ScreenShader.xcodeproj/xcuserdata/branpk.xcuserdatad/xcschemes/xcschememanagement.plist @@ -10,5 +10,13 @@ 0 + SuppressBuildableAutocreation + + 4159FE5B2D497D4400B79670 + + primary + + + diff --git a/ScreenShader/metrics.swift b/ScreenShader/metrics.swift index ec19185..15969a0 100644 --- a/ScreenShader/metrics.swift +++ b/ScreenShader/metrics.swift @@ -6,48 +6,60 @@ class Metrics { private var numRenders: Int = 0 private var totalLatency: Double = 0 private var prevUpdateTimestamp: Double = 0 + private let dispatchQueue = DispatchQueue(label: "metrics.dispatchQueue") var screenCaptureFPS: Double = 0 var renderFPS: Double = 0 var averageLatency: Double = 0 func newFrameID() -> Int { - let frameID = self.nextFrameID - self.nextFrameID += 1 + var frameID: Int! + self.dispatchQueue.sync { + frameID = self.nextFrameID + self.nextFrameID += 1 + } return frameID } func recordScreenCapture(frameID: Int) { let timestamp = ProcessInfo.processInfo.systemUptime - self.screenCaptureTimestamps[frameID] = timestamp + self.dispatchQueue.async { + self.screenCaptureTimestamps[frameID] = timestamp + } } func recordRender(frameID: Int) { let timestamp = ProcessInfo.processInfo.systemUptime - if let screenCaptureTimestamp = self.screenCaptureTimestamps[frameID] { - let latency = timestamp - screenCaptureTimestamp - self.numRenders += 1 - self.totalLatency += latency + self.dispatchQueue.async { + if let screenCaptureTimestamp = self.screenCaptureTimestamps[frameID] { + let latency = timestamp - screenCaptureTimestamp + self.numRenders += 1 + self.totalLatency += latency + } } } func updateStats() { - let now = ProcessInfo.processInfo.systemUptime - let delta = now - self.prevUpdateTimestamp - self.prevUpdateTimestamp = now - - self.screenCaptureFPS = Double(self.screenCaptureTimestamps.count) / delta - self.renderFPS = Double(self.numRenders) / delta - self.averageLatency = self.numRenders == 0 ? 0 : self.totalLatency / Double(self.numRenders) - - self.screenCaptureTimestamps.removeAll() - self.numRenders = 0 - self.totalLatency = 0 + self.dispatchQueue.async { + let now = ProcessInfo.processInfo.systemUptime + let delta = now - self.prevUpdateTimestamp + self.prevUpdateTimestamp = now + + self.screenCaptureFPS = Double(self.screenCaptureTimestamps.count) / delta + self.renderFPS = Double(self.numRenders) / delta + self.averageLatency = self.numRenders == 0 ? 0 : self.totalLatency / Double(self.numRenders) + + self.screenCaptureTimestamps.removeAll() + self.numRenders = 0 + self.totalLatency = 0 + } } func printStats() { - print("Screen capture FPS: \(self.screenCaptureFPS)") - print("Render FPS: \(self.renderFPS)") - print("Average latency (ms): \(self.averageLatency * 1000)") + self.dispatchQueue.async { + print("Screen capture FPS: \(self.screenCaptureFPS)") + print("Render FPS: \(self.renderFPS)") + print("Average latency (ms): \(self.averageLatency * 1000)") + } } } diff --git a/ScreenShader/overlay.swift b/ScreenShader/overlay.swift index 6e66510..57b200c 100644 --- a/ScreenShader/overlay.swift +++ b/ScreenShader/overlay.swift @@ -11,6 +11,7 @@ class OverlayController: NSObject, MTKViewDelegate { private var renderer: MetalRenderer! private var contentBuffer: CVPixelBuffer? private var frameID: Int? + private let dispatchQueue = DispatchQueue(label: "overlayController.queue") init(config: Config, metrics: Metrics, errorMessage: ErrorMessage) { self.config = config @@ -52,8 +53,10 @@ class OverlayController: NSObject, MTKViewDelegate { let frameID = self.metrics.newFrameID() self.metrics.recordScreenCapture(frameID: frameID) - self.frameID = frameID - self.contentBuffer = contentBuffer + self.dispatchQueue.async { + self.frameID = frameID + self.contentBuffer = contentBuffer + } // self.render() } @@ -65,12 +68,19 @@ class OverlayController: NSObject, MTKViewDelegate { } func render() { - if let contentBuffer = self.contentBuffer, let frameID = self.frameID { + var contentBuffer: CVPixelBuffer? + var frameID: Int? + + self.dispatchQueue.sync { + contentBuffer = self.contentBuffer + frameID = self.frameID + self.frameID = nil + self.contentBuffer = nil + } + + if let contentBuffer = contentBuffer, let frameID = frameID { self.renderer.renderContentBuffer(window: self.window, contentBuffer: contentBuffer) - self.metrics.recordRender(frameID: frameID) - self.frameID = nil - self.contentBuffer = nil } }