[iOS] Metal에서 GPU 컴퓨팅(4) MTKView

이 기사는 Metal Advent Calendar2016의 7일째 기사입니다.

지금까지 Metal의 GPU 컴퓨팅에 대해 해설 기사를 써 왔습니다.
[iOS] Metal에서 GPU 컴퓨팅 (1)
[iOS] Metal에서 GPU 컴퓨팅 (2)
[iOS] Metal에서 GPU 컴퓨팅 (3)
이 기사에서는 지난 번에 계속해서 Apple이 제공하는 샘플 코드에 대해 설명합니다.

취급하는 샘플 코드는, 전회와 같은 라이프게임의 앱, MetalGameOfLife입니다.
MetalGameOfLife


(실행 화면)

이번에는 GPU 컴퓨팅과는 조금 떨어져 있지만 샘플 코드의 MTKView에 대해 설명합니다.
MTKView는 MetalKit 프레임워크에 포함된 UIView를 상속한 클래스로, 비교적 간단한 방법으로 Metal에 의한 그리기를 할 수 있습니다.
MTLView에는 다음 세 가지 드로잉 모드가 있습니다.
  • 내부 타이머로 자동 다시 그리기(기본값)
  • setNeedDisplay를 호출하여 그리기
  • MTKView의 draw 메소드에 의한 드로잉

  • 이 샘플 코드는 기본값인 1. 모드를 사용합니다.

    이전의 반복이 됩니다만, 이 샘플 코드는, 주로 이하의 파일로 구성되어 있습니다.

    AAPLRender.h
    AAPLRender.m
    AAPLViewController.h
    AAPLViewController.m
    Sharder.metal

    이 중 AAPLRender.m에는 병렬 컴퓨팅 및 드로잉의 CPU측의 로직이 Shader.metal에는 정점 셰이더, 프래그먼트 셰이더, GPU 컴퓨팅용 셰이더가 쓰여져 있습니다.

    여기에서는 샘플 코드 내에서 MTKView의 사용 부분을 설명합니다.
    Storyboard의 Custum Class에 MTKView를 설정한 다음 AAPLViewController.m에 다음과 같은 설명이 있습니다.

    AAPLViewController.m
    self.metalView = (MTKView *)self.view;    
    ...
    self.metalView.device = MTLCreateSystemDefaultDevice();
    

    MTLCreateSystemDefaultDevice()는 MTLDevice 프로토콜을 따르는 객체를 반환하지만 MTKView 객체는 Metal 관련 객체를 만들고 제어하는 ​​데 필요합니다.

    그런 다음 AAPLRender.m 쪽 코드입니다.

    AAPLRender.m
    MTLRenderPassDescriptor *renderPassDescriptor = self.view.currentRenderPassDescriptor;   
    ...
    [commandBuffer presentDrawable:self.view.currentDrawable];
    

    MTLRenderPassDescriptor 객체의 취득과, draw area(currentDrawable)의 취득에 이용하고 있습니다.
    MTLRenderPassDescriptor는 명령 인코더를 생성하기 위해 텍스처와 같은 부착물을 저장합니다. 명령 인코더에 대해서는 나중에 설명합니다.

    다음은 MTLView에서 호출하는 대리자 메서드입니다.

    AAPLRender.m
    - (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size
    //描画領域変更時の処理
    }  
    ...
    - (void)drawInMTKView:(nonnull MTKView *)view
    {
    //描画毎の処理
    }
    

    화면의 재묘화가 요구될 때마다, 델리게이트 메소드인 drawInMTKView:가 불려지거나, MTKView의 서브 클래스의 drawRect: 메소드가 불려 갑니다. 이 중 하나를 구현해야합니다.

    이번에는 라이프 게임 샘플 코드 내에서 MTKView의 해설을 실시했습니다.
    다음 번 이후, 또 다른 개소에 대한 해설을 실시해 갑니다.

    좋은 웹페이지 즐겨찾기