@@ -1,5 +1,3 @@
1−// TODO: Refactor update into 2 calls: metalRendering() and textureToImage()
2−// TODO: Use async dispatch to free up main queue
3// TODO: Use two textures/images to alternate the 2 calls (like OpenGL double buffers)
1// TODO: Use two textures/images to alternate the 2 calls (like OpenGL double buffers)
5// TODO: Make graphics have edges only according to graph (instead of being a complete graph)
3// TODO: Make graphics have edges only according to graph (instead of being a complete graph)
@@ -36,18 +34,24 @@ class MetalMetaballRenderer: MetaballRenderer {
36 func updateTargetView() {
34 func updateTargetView() {
37 let metaballs = dataSource.metaballs
35 let metaballs = dataSource.metaballs
39− // Re-alloc buffers if frame has changed
37+ // Re-alloc buffers if the size has changed
40 if previousSize != targetView.size {
38 if previousSize != targetView.size {
41 previousSize = targetView.size
39 previousSize = targetView.size
42 updateFrame()
40 updateFrame()
43+ dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INTERACTIVE.rawValue), 0)) { () -> Void in
45− // Render graphics to metal texture
45+ // Render graphics to metal texture
46− renderToRenderingTexture(metaballs: metaballs)
46+ self.renderToRenderingTexture(metaballs: metaballs)
47− // Transform metal texture into image
47+ // Transform metal texture into image
48− let uiimage = image(texture: renderingTexture)
48+ let uiimage = self.image(texture: self.renderingTexture)
50+ dispatch_async(dispatch_get_main_queue(), { () -> Void in
49− // Send image to view
51+ // Send image to view
50− targetView.image = uiimage
52+ self.targetView.image = uiimage
53 func renderToRenderingTexture(metaballs metaballs: [Metaball]) {
57 func renderToRenderingTexture(metaballs metaballs: [Metaball]) {