개요
Metal은 Apple 플랫폼에서 GPU 연산을 효율화할 수 있는 저수준 그래픽 API이자 GPU 프로파일링 및 디버깅을 제공하는 프레임워크이다. Metal을 저수준 작업이 필요하기 때문에 이를 위해 다양한 프레임워크와 함께 쓰이거나 특정 프레임워크의 기반이 되곤 한다.
Metal을 이해하기 위해서 GPU연산의 개념과,
API와 라이브러리, 프레임워크의 개념과 차이에 대해 알아보았다.
그리고 MetalKit의 역할에 대해 생각해보는 시간을 가졌다.
API와 라이브러리, 프레임워크의 차이
API(Application Programming Interface)
- API는 정의(함수, 변수, 데이터 구조) 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘이다.
- 두 애플리케이션 간의 요청과 응답을 통한 통신 방법을 정의하여 통신할 수 있는 다리를 제공한다.
- 웹에서 특정 정보를 불러와 앱이나 다른 프로그램에 활용하도록 연결하는 수단이 있다면 API라고 할 수 있다.
- 대부분의 소프트웨어는 서버와 클라이언트 소통을 돕는 중간 지점 역할을 하기 때문에 종종 API가 넓은 의미로 활용되기도 한다.
- Metal은 특정 GPU를 직접 연결하여 연산을 지정할 수 있는 파이프라인을 제공하고 GPU 연산 작업을 통해 연산 데이터를 가져오기 때문에 API라고 할 수 있다.
- Metal이 제공하는 API 기능이 Metal API라고 불리기도 하고, Metal 그 자체의 프레임워크적 속성보다는 API 기능이 크기에 Metal하면 Metal API라고 혼용하는 듯하다.
라이브러리
- 필요한 기능을 기준으로 묶인 사용가능한 코드들이다.
- 개발자 개인이 생성하여 반복적으로 활용도 가능하고, 외부 (타인, 혹은 타집단)이 만든 외부 라이브러리도 호출해서 활용이 가능하다.
- Metal과 함께 쓰이는 프레임워크인 Metal Performance Shader(MPS)는 사전 컴파일된 셰이더 라이브러리를 제공한다.
- 셰이더 라는 이름처럼 특정 그래픽을 보여줄 때 화면의 픽셀 별 명암, 색조 등을 계산해주는 역할을 한다.
프레임워크
- 작업 구조의 라이브리러로 API를 포함하여 다양한 도구와 라이브러리, 그리고 무엇보다 코드 작성에 필요한 기본 구조를 제공한다.
- 객체 지향의 개념에서 설명해보면 라이브러리나 API의 경우 어떻게 활용할 지 개발자의 의도에 따라 재구축, 또는 응용하여 활용방도를 사용자가 정할 수 있지만 프레임워크의 경우에는 활용하기 위한 구조도 같이 제공되어 프레임워크 자체가 활용되는 방식을 지정해둔다는 차이점이 가장 큰 차이라고 할 수 있다.
- Metal 프레임워크는 API도 제공하지만 메모리 관리, 렌더링 파이프라인 등을 구축하기 위한 기본 구조를 제공하기 때문에 프레임워크라고 분류된 듯하다.
CPU와 GPU의 차이
CPU와 GPU의 연산 방식 차이
| 기준 | CPU | GPU |
|---|
| 연산 방식 | 명령어 순차 실행 | 데이터 병렬 처리 |
| 코어 구조 | 적은 수의 강력한 코어 | 수많은 작은 코어 |
| 강점 | 일반적인 계산, 명령어 순차 실행 | 그래픽 처리, 데이터 병렬 처리 |
그래픽 작업에서 GPU의 이점
- 그래픽을 화면에 보여줄 때는 픽셀 단위로 색상, 음영 등을 계산작업해야 한다.
픽셀 하나하나로 따지면 비교적 간단한 계산작업을 화면 전체의 픽셀만큼 계산해줘야 한다. 1920 x 1080 해상도라면 2,073,600 번 계산을 해야 한다.
- 이 계산을 CPU로 진행한다면 순차 실행되기 때문에 마지막 계산의 경우 앞의 계산이 전부 끝날 때까지 기다려야 하므로 실행 시간이 오래 걸린다.
- 그러나 GPU로 이 연산을 하면 작은 코어들로 병렬 처리가 가능하기 때문에 훨씬 바르게 연산이 가능하다.
- Metal은 GPU에 연산을 할당하고 병행 및 반복작업을 효율화한다.
메탈과 유사한 프로그램
- 유사한 역할을 하는 프로그램으로는 Vulkan과 OpenGL이 있다.
- 원래 ios에서는 Open GL을 사용하다가 Metal이 제안된 이후로 deprecated되었다. (사용안하게 되었다)
- 사용하는 난도는 이 유튜브 튜토리얼에 따르면 OpenGL보다는 높지만 Vulkan보다는 낮다.
- 활용도는 OpenGL보다 높고 역시 Vulkan보다는 낮지만 상대적으로 적은 노력으로 활용도가 높아 대부분의 작업에 충분한 성능으로 이점이 있는 듯하다.
- 특히 ios 기기의 gpu의 지원에 훨씬 효율적이다.
- Metal은 MPS 및 다른 프레임워크와 결합하여 물체에 반사되는 빛을 계산하여 표현하는 레이 트레이싱, 3D 애니메이션 표현 등을 할 수 있다.
- Metal FX 프레임워크와 함께 낮은 해상도의 이미지를 높은 해상도로 업스케일하여 렌더링 시간을 낮추는 데 쓰이기도 한다.
- 그렇지만, Metal은 저수준 그래픽 API를 제공하기 때문에 swift에서는 이를 기반으로 상위의 프레임워크를 형성하여 주로 활용하는 듯하다.
- 여기서 저수준 그래픽 API 라는 것은 활용도가 저수준이라는 뜻이 아니라 GPU와 직접 연결, 통신하기 위해 C를 기반으로 한 MSL 등 Swift같은 고수준 언어에 비해 낮은 단계의 작업 하나하나를 해야 하기 때문에 손이 많이 간다는 뜻이다.
기반이 되는 프레임워크
- Metal은 2D 게임의 기반이 되는 SpriteKit, 가상현실용 RealityKit, 그리고 이미지의 필터 및 영상 변환에 쓰이는 Core Image, 그리고 Core Animation 등 대부분의 그래픽 프레임워크의 기반이 된다.
- 특히 Core Animation의 경우 우리가 흔히 아는 UIKit 및 SwiftUI의 기반에서 화면을 불러오는 작용을 할 때 쓰이는 프레임워크이다.
- 즉 우리가 UIKit 등으로 화면을 구성할 때 우리는 Metal의 빠른 연산에서 이점을 취하고 있다는 뜻이다.
- 앞서 말했듯 Metal을 사용하기 위해서 낮은 단계부터 하나씩 쌓아올려야 하는 만큼 작업량이 많다.
- 대신 디테일적인 부분을 설정하는 범위도 그만큼 넓다고 할 수 있다.
- 그렇기 때문에 MetalKit에서는 Metal에 더해 이 연산을 화면에 더 쉽게 구현하기 위한 씬 관리, 텍스처 로딩, 입력 처리 등의 기능을 제공하고,
Model I/O 기능을 추가하여 3D 그래픽 개체 관리를 더욱 쉽게 할 수 있게 했다.
- 저수준 작업 처리 부분을 줄이고 코드 유지 및 관리를 용이하게 했지만 일부 고급 기능을 사용하기 위해서는 Metal 코드를 작성할 필요가 있다.
- 또한 3D 애니메이션 부분이나 제스쳐 처리, 뷰 컨트롤러 통합 등 비슷한 프레임워크인 Core Animation에 비해 장점이 있다고 하지만,
사용할 때 처리하는 부분이 조금 더 어렵다보니 저수준 처리 경험이 부족하거나 프로젝트 규모가 작은 경우에는 디테일적인 부분을 신경쓰기 보다는 Core Animation같은 조금 더 상위의 프레임워크를 사용할 것 같다.
- 그리고 저수준 처리 작업에 자신이 있는 사람이라면 Metal 자체를 활용하거나 Unity 등 응용 소프트웨어를 사용할 듯도 한데 어떤 경우에 MetalKit을 쓰게 되는지 감이 잡히지 않았다.
- 활용 예시를 찾으려 인터넷을 뒤졌지만 대부분 Metal 자체를 사용하거나 상위 프레임워크를 사용하는 예시밖에 찾을 수 없어서, 혹시 다른 에시를 찾은 경우에 알려주시면 감사하겠다.
참고 자료