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
}
}