【iOS】Metal Best Practices의 해설 (3) 리소스 옵션

6447 단어 iOSSwift금속
Metal Best Practices 은 iOS/MacOS/tvOS API인 Metal을 사용한 설계 모범 사례 가이드입니다.

이 논문에서는 여러 번 나누어이 가이드를 읽고 코드에서 실험을 섞어 설명합니다.
읽고 그대로 이해할 수 있을 것 같은 곳은 날리기 때문에, 원문을 읽으면서 원문의 가이드로서 이용해 주세요.
또, iOS의 기사이므로 다른 OS(MacOS, tvOS)에 대한 기재는 생략합니다.

다른 기사의 일람은, 첫회 기사보다 참조해 주세요.

Resource Options(자원 옵션)



모범 사례: 적절한 리소스 저장 모드와 텍스처 사용 옵션을 설정합니다.

리소스 스토리지 모드 정보



iOS, tvOS의 경우 다음 두 가지 유형이 있습니다. 이와 같이 CPU와 GPU가 메모리를 공유하는 모델을 통합 메모리 모델이라고 합니다.


모드
설명


공유 모드
CPU와 GPU 모두에 액세스 가능

Private 모드
GPU에만 액세스 가능


【iOS, tvOS의 리소스 스토리지 모드의 개요도】



그리고, iOS에서의 리소스 스토리지 모드의 선택은, 통상은 Shared 모드가 올바른 선택인 것. 개인 모드는 CPU가 리소스에 액세스하지 않는 경우에만 선택합니다.

적절한 텍스처 사용 플래그 설정



Metal은 그 사용 목적에 따라 특정 텍스처의 GPU 조작을 할 수 있다. 미리 알고 있다면 명시적인 텍스처 사용 옵션을 선언합니다.

Unknown 옵션에 의존하지 않는 것. 이 옵션은 텍스처에 가장 유연성을 제공하지만 상당한 성능 비용이 발생합니다.

코드로 확인해보기



텍스처의 사용 플래그의 설정에 의해 어느 정도 퍼포먼스에 차이가 나오는지 검증해 보겠습니다.
이 리포지토리에는 샘플 코드가 있습니다.

샘플 코드 안에, Particle 라고 하는 샘플이 있으므로 이것을 변경하면서 계측해 갑니다.

(실행 이미지)


텍스처의 사용 플래그를 설정하는 개소의 발췌입니다. 코멘트와 같이, texDesc.usage 의 설정을 Unknown 로 하는 경우와 명시적으로 지정하는 경우의 양쪽 모두를 준비해, 실행할 때 한쪽을 코멘트 아웃 하면서 계측합니다.

ParticleMetalView.swift
func initTexture() {
    func makeRenderTexture() -> MTLTexture {
        let texDesc = MTLTextureDescriptor()
        texDesc.width =  100//(parent.mtkView.currentDrawable?.texture.width)!
        texDesc.height =  100//(parent.mtkView.currentDrawable?.texture.height)!
        texDesc.depth = 1
        texDesc.textureType = MTLTextureType.type2D

        texDesc.storageMode = .private
        texDesc.pixelFormat = .bgra8Unorm

        texDesc.usage = .unknown // Unknown版
        texDesc.usage = [MTLTextureUsage.renderTarget, MTLTextureUsage.shaderRead] // 明示指定版

        return metalDevice.makeTexture(descriptor: texDesc)!
    }
    texture = makeRenderTexture()
}


측정은 Metal System Trace를 사용합니다. 사용법은 여기를 참조하십시오.

앱을 실행하고 일정 시간 측정한 후 GPU 요약에서 Fragment와 Vertex의 소요 시간을 살펴보겠습니다.





<명시 지정판의 결과>



"Avg CPU to GPU Latency"를 참조하십시오. Vertex는 왠지 Unknown판이 빠르지만 Fragment는 명시 지정판이 1ms 가까이 있습니다. 전체에서도 명시 지정판 쪽이 0.77ms 빠른 결과가 되었습니다.

설정을 1개 바꾸는 것만으로 1ms도 빨라진다면, 노동력에 대해 상당히 좋은 느낌의 성과가 아닐까요😄

결론



모범 사례에서 알 수 있듯이 텍스처 사용 플래그를 명시하는 것이 더 효율적이라는 것을 알았습니다.

마지막으로



iOS를 사용한 AR이나 ML, 음성 처리 등의 작품이나 샘플, 기술 정보를 발신하고 있습니다.
작품이 생기면 Twitter로 발신해 가므로 팔로우를 부탁합니다 🙏

Twitter는 작품과 기사의 링크를 붙이고 있습니다.
htps : // 라고 해서 r. 코 m / 주게 m 주게 m 주게 m

Qiita는 iOS 개발, 특히 AR 및 기계 학습, 그래픽 처리 및 음성 처리에 대해 발신하고 있습니다.
htps : // 코 m / 토요 요시다

Note에서는 연재 기사를 쓰고 있습니다.
htps : //에서. 코 m / 토요 요시다

Zenn은 기계 학습이 많습니다.
htps // // 천. 에서 v / 토요 요시다

좋은 웹페이지 즐겨찾기