git.iko.soy/metal-metaballs
on master help sign in
Added code for swapping contexts; metal rendering and image creation now run in parallel.
commit6d6256aa65659f5fb87ccdab7928a2b12dbe5a91 authorvinivendra <vinivendra@gmail.com> dateWed 10 Feb 2016, 21:38 (11 years ago) parent52468ee
1 file changed+13−6
PixelImage/MetalMetaballRenderer.swift+13−6
PixelImage/MetalMetaballRenderer.swift+13−6
@@ -23,6 +23,8 @@ class MetalMetaballRenderer {
2323
2424 let dataSource: MetaballDataSource
2525
26+ let semaphore = dispatch_semaphore_create(2)
27+
2628 enum RendererState {
2729 case Idle
2830 case Running
@@ -57,6 +59,9 @@ class MetalMetaballRenderer {
5759
5860 func updateTargetView() {
5961
62+ let timeout = dispatch_time(DISPATCH_TIME_NOW, 1000000000)
63+ dispatch_semaphore_wait(semaphore, timeout)
64+
6065 print("Update \(i++)!")
6166
6267 state = .Ending
@@ -69,18 +74,20 @@ class MetalMetaballRenderer {
6974 // Render graphics to metal texture
7075 self.renderToContext(computeContext)
7176
77+ if self.state != .Running {
78+ self.state = .Idle
79+ } else {
80+ self.updateTargetView()
81+ }
82+
7283 // Transform metal texture into image
7384 let uiimage = self.createImageFromContext(computeContext)
7485
86+ dispatch_semaphore_signal(self.semaphore)
87+
7588 dispatch_async(dispatch_get_main_queue(), { () -> Void in
7689 // Send image to view
7790 self.targetView.image = uiimage
78−
79− if self.state != .Running {
80− self.state = .Idle
81− } else {
82− self.updateTargetView()
83− }
8491 })
8592 }
8693 }