Slide 1

Slide 1 text

Metal Accelerated͔Ͳ͏͔Λௐ΂Δํ๏ ͋ͳͨͷΞϓϦͷͲ͜ͰMetal͕҉༂͍ͯ͠Δͷ͔ Shuichi Tsutsumi @shu223

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

WWDC17ͷ͜ͷਤͰɺUIKitΛؚΉ ଟ͘ͷϑϨʔϜϫʔΫ͕಺෦Ͱ MetalΛ༻͍͍ͯΔ͜ͱ͕Θ͔ͬͨ

Slide 4

Slide 4 text

͕ɺ

Slide 5

Slide 5 text

ࡉ͔͍͜ͱ·Ͱ͸৭ʑͱΘ͔Βͳ͍ • UIKitͷԼճΓ͸͍͔ͭΒMetalʹͳͬͨͷ͔ʁ • UIKitͷͲͷॲཧ͕Metal AcceleratedͰɺͲͷॲཧ͕ͦ͏͡Όͳ͍ͷ͔ʁ • OpenGL΋ʢiOSͰ͸ʣࠓ͸Metalͷ্ʹ࣮૷͞Ε͍ͯΔͱAppleͷਓ͕WWDC ͷϥϘͰݴ͚ͬͯͨͲɺެࣜ৘ใ͸ͳ͍ • 2014೥ͷWWDCͰCore Animationͷ௿ϨΠϠʹ͍ͭͯղઆ͕͋Δ͚Ͳɺ͜ ΕͬͯͲ͔͜ΒͲ͜·Ͱ͕ࠓ΋༗ޮͳ৘ใͳͷ͔ʁ • etc.

Slide 6

Slide 6 text

Appleͷެࣜ৘ใཔΈ • API Reference • Programming Guide • Forum • WWDC Session • ʮWWDC LabͰதͷਓ͕ݴͬͯͨʯ ͔͠΋ɾɾɾ ͕࣌ؒܦͭͱɺެࣜ৘ใͰ΋ϝϯς͞Ε͍ͯͳ͍΋ͷ͸ূڌͱͯ͠ෆे෼ʹͳΔ

Slide 7

Slide 7 text

ʮཪऔΓʯ͸େมˍ೉͍͠

Slide 8

Slide 8 text

ʮMetal Accelerated͔Ͳ͏͔ʯ Λࣗ෼Ͱௐ΂ΒΕͳ͍͔ʁ

Slide 9

Slide 9 text

Metal Accelerated͔Ͳ͏͔Λͳͥ஌Γ͍ͨͷ͔ʁ • தͷਓʹΑͬͯϝϯς͞Ε͍ͯͯɺ࠷దԽ͞Ε͍ͯΔ͜ͱ͕Θ͔Δ • ࣗ෼ͷ࠷దԽख๏͕ద੾͔Ͳ͏͔ͷ൑அࡐྉʹͳΔ • ௿ϨΠϠʹ౿ΈࠐΜͰࣗલ࣮૷͢Δ͔Ͳ͏͔ͷ൑அࡐྉʹͳΔ

Slide 10

Slide 10 text

XcodeͷGPU Report͸ʁ

Slide 11

Slide 11 text

MetalΛ໌ࣔతʹར༻͍ͯ͠ͳ͍ͱɺ XcodeͷGPU Report͸ग़ͯ͜ͳ͍

Slide 12

Slide 12 text

ͦ͜ͰInstruments

Slide 13

Slide 13 text

Metal System Trace

Slide 14

Slide 14 text

UIKit͔͠࢖ͬͯͳ͍ʢʹMetal࢖ͬͯͳ͍ʣ ΞϓϦͰࢼͯ͠ΈΔ

Slide 15

Slide 15 text

τϨʔεͰ͖ͯΔʂ

Slide 16

Slide 16 text

UIKitͷԼͰʮ҉໧తʹʯ࢖ΘΕ͍ͯΔ MetalͷଉਧΛײ͡Δ͜ͱ͕Ͱ͖Δʂ

Slide 17

Slide 17 text

࣌ܥྻํ޲ʹ֦େͯ͠ΈΔ

Slide 18

Slide 18 text

ͬ͘͟Γͨ͠ݟํ GPUͰ࣮ߦ͢ΔίϚϯυͷ࡞੒ʢonCPUʣ GPU΁ίϚϯυΛૹ৴ʢon CPUʣ γΣʔμͷ࣮ߦʢon GPUʣ σΟεϓϨΠ΁ͷඳը CPUͰͷॲཧ → GPUͰͷॲཧ → ը໘දࣔ ͷҰ࿈ͷྲྀΕͱෛՙ͕ՄࢹԽ͞Ε͍ͯΔ

Slide 19

Slide 19 text

“Launching” Comand Buffer (SpringBoard) ͦͷޙඳըλεΫͳ͠ ʢUIKit͸ඞཁ͕ͳ͚Ε͹ߋ৽ॲཧΛ͠ͳ͍ʣ “Foreground” ͜ͷ͋ͨΓ͸ΞϓϦىಈ࣌ͷඳը ॲཧͬΆ͍

Slide 20

Slide 20 text

ϘλϯΛԡͨ͠ΒUIImageViewͰը૾Λදࣔ͢Δ ʢ΋ͪΖΜMetal͸࢖Θͳ͍ʣ

Slide 21

Slide 21 text

ΞϓϦىಈ࣌ͷॾʑ ϘλϯԡԼʙ UIImageViewͷը૾දࣔ

Slide 22

Slide 22 text

࣌ܥྻํ޲ʹ֦େ

Slide 23

Slide 23 text

ʮMetal Accelerated͔Ͳ͏͔ʯ Λࣗ෼Ͱௐ΂ΒΕͳ͍͔ʁ → InstrumentsͰௐ΂ΒΕͦ͏

Slide 24

Slide 24 text

໰୊఺

Slide 25

Slide 25 text

ϦΞϧλΠϜʹݟΕͳ͍ ʮͲͷάϥϑ͕ͲͷॲཧΛද͍ͯ͠Δͷ͔ʁʯ ͕Θ͔ΓͮΒ͍

Slide 26

Slide 26 text

MetalͷlabelػೳΛར༻ͯ͠͸Ͳ͏͔ʁ private func pushLabel(_ label: String) { let commandBuffer = commandQueue.makeCommandBuffer()! commandBuffer.label = label commandBuffer.commit() } ʮԿ΋͠ͳ͍MetalͷίϚϯυόοϑΝʯΛGPUʹϓογϡ͢Δ ϝιουΛ͓͍ͭͬͯͯ͘ɺ @IBAction func btnTapped(_ sender: UIButton) { pushLabel(“start”) imageView.image = UIImage(named: "highsierra") pushLabel(“end”) } ͜Μͳײ͡ͰݺͿͱɾɾɾ label͚͍ͩ࣋ͬͯΔ

Slide 27

Slide 27 text

Instruments্Ͱͦͷlabel͕දࣔ͞Εɾɾɾ ͳ͔ͬͨɾɾɾ

Slide 28

Slide 28 text

ʮۭͷίϚϯυόοϑΝʯ͸ InstrumentsͰ͸ݟ͑ͳ͍ ࣮ߦ࣌ʹGPUʹૹΒΕͳ͍ͷ͔ɺ ͦ΋ͦ΋Ϗϧυஈ֊Ͱ࠷దԽ͞ΕΔͷ͔ɺetc… ʢͲ͔͜ʹ࢓༷ͱͯ͠ॻ͍ͯ͋Δ͔΋ʣ

Slide 29

Slide 29 text

த਎ͷ͋ΔίϚϯυʹ͢Δ private func pushLabel(_ label: String) { let textureLoader = MTKTextureLoader(device: device) let srcTex = try! textureLoader.newTexture(name: “hoge”, scaleFactor: 2.0, bundle: nil) let descriptor = MTLTextureDescriptor.texture2DDescriptor( pixelFormat: srcTex.pixelFormat, width: srcTex.width, height: srcTex.height, mipmapped: false) let destTex = device.makeTexture(descriptor: descriptor)! let commandBuffer = commandQueue.makeCommandBuffer()! commandBuffer.label = label let blitEncoder = commandBuffer.makeBlitCommandEncoder()! blitEncoder.copy( from: srcTex, sourceSlice: 0, sourceLevel: 0, sourceOrigin: MTLOriginMake(0, 0, 0), sourceSize: MTLSizeMake(srcTex.width, srcTex.height, srcTex.depth), to: destTex, destinationSlice: 0, destinationLevel: 0, destinationOrigin: MTLOriginMake(0, 0, 0)) blitEncoder.endEncoding() commandBuffer.commit() } ຊ౰ʹཉ͍͠ͷ͸͚ͩ͜͜

Slide 30

Slide 30 text

੒ޭʂ ηοτͨ͠label͕ݟ͍͑ͯΔ

Slide 31

Slide 31 text

·ͱΊ • ͍··ͰɺMetal Accelerated͔Ͳ͏͔Λ֬ೝ͢Δʹ͸ɺެࣜ৘ใཔΈͩͬͨ - Guide, API Reference, Forum, WWDC Session, WWDC LabͰݴͬͯͨ, etc…ʮཪऔΓʯ ͕೉͔ͬͨ͠ - MetalΛ໌ࣔతʹ༻͍͍ͯͳ͚Ε͹ɺXcodeͷGPU Report͸൓Ԡ͠ͳ͍ • InstrumentsͷMetal System TraceΛ༻͍ΔͱɺMetalΛ໌ࣔతʹ༻͍͍ͯͳ ͍৔߹ʹ΋ɺMetalͷಈ͖Λ஌Δ͜ͱ͕Ͱ͖Δ • ϦΞϧλΠϜʹ͸τϨʔεͰ͖ͳ͍ͷͰɺ໨ҹͱͯ͠labelΛషΔํ๏΋ݕ౼ - ҰԠ͏·͍ͬͨ͘ - ͕ɺ೿खʹMetalΛ࢖͏ख๏ʹͳͬͯ͠·ͬͨͷͰɺ͓͢͢Ί͠ͳ͍