Metal 프레임워크로 시작하는 GPU 프로그래밍
Metal은 애플이 만든 저수준 그래픽·연산 프레임워크다. iOS와 macOS를 비롯한 애플 플랫폼에서 GPU에 가까운 수준으로 명령을 보내 화면을 그리거나 많은 양의 계산을 병렬로 처리한다. 과거 OpenGL이 맡던 자리를 이어받는 흐름에서 등장했고, 지금은 애플 기기에서 고성능 그래픽과 GPU 연산을 다루는 기본 선택지로 자리 잡았다.
Metal 프레임워크는 무엇을 하는 도구인가
GPU를 직접 부리는 도구다. 게임 화면을 초당 수십 번 그려내는 렌더링이 대표적인 쓰임새다. 이미지 필터나 물리 시뮬레이션처럼 같은 연산을 수많은 데이터에 한꺼번에 적용하는 병렬 계산도 여기에 든다. CPU가 일을 순서대로 처리한다면 GPU는 비슷한 작업을 잘게 나눠 동시에 굴린다. Metal은 그 GPU에 무엇을 시킬지 세밀하게 지시하는 통로 역할을 한다.
애플은 Metal을 2014년에 공개한 것으로 알려져 있다. 이후 셰이더 언어인 Metal Shading Language, GPU 연산을 돕는 Metal Performance Shaders, 화면 출력과 자원 관리를 거들어 주는 MetalKit 같은 요소가 함께 자리를 잡았다. 버전이 올라가면서 지원 범위와 도구도 꾸준히 넓어진 것으로 알려져 있다. 하나의 거대한 라이브러리라기보다 그래픽과 연산을 다루는 여러 도구가 묶인 꾸러미에 가깝다.
언제 Metal을 직접 써야 하나
대부분의 앱은 Metal을 직접 만질 일이 없다. 버튼과 목록을 배치하고 애니메이션을 넣는 일반적인 화면은 UIKit이나 SwiftUI가 안에서 알아서 GPU를 활용한다. 그 위에서 개발자가 Metal 코드를 손으로 짤 이유는 거의 없다.
직접 써야 하는 순간은 성능의 한계에 부딪혔을 때다. 복잡한 3D 게임을 만들거나, 실시간 카메라 영상에 무거운 필터를 얹거나, 기기 안에서 대규모 연산을 빠르게 돌려야 할 때 Metal이 후보에 오른다. 상용 게임 엔진이나 영상 처리 라이브러리도 안에서 Metal을 쓰는 경우가 많다. 프레임워크를 직접 다루지 않더라도 무엇이 아래에서 돌아가는지 알아두면 성능 문제를 추적할 때 도움이 된다.
실무에서는 처음부터 Metal을 꺼내 들기보다 상위 프레임워크로 먼저 만들어 보고, 프로파일러로 병목을 확인한 뒤 정말 필요한 부분만 Metal로 내려가는 순서가 안전하다. 성급하게 저수준으로 내려가면 코드만 길어지고 유지보수가 어려워질 때가 많다.
핵심 구성 요소 살펴보기
Metal로 무언가를 그리려면 몇 가지 객체가 등장한다. 처음에는 낯설지만 역할을 나눠서 보면 흐름이 잡힌다.
- 디바이스(MTLDevice): GPU 자체를 코드에서 다루는 진입점이다. 여기서 버퍼나 텍스처 같은 자원을 만든다.
- 커맨드 큐(MTLCommandQueue): GPU에 보낼 명령을 줄 세우는 대기열이다. 매 프레임 명령 묶음을 여기에 밀어 넣는다.
- 커맨드 버퍼와 인코더: 실제 그리기 명령을 담아 GPU가 이해할 형태로 기록하는 부분이다.
- 파이프라인 상태: 어떤 셰이더로 어떤 규칙에 따라 그릴지 미리 정해 두는 설정값이다.
- 셰이더: GPU 위에서 도는 작은 프로그램이다. 정점의 위치를 계산하는 버텍스 셰이더와 픽셀 색을 정하는 프래그먼트 셰이더가 기본이다.
한 프레임을 그리는 과정은 대략 이렇게 흘러간다. 디바이스에서 자원을 준비하고, 커맨드 버퍼에 그리기 명령을 기록한 다음, 커맨드 큐에 실어 GPU로 넘긴다. GPU가 셰이더를 실행해 결과를 화면에 올리면 한 장면이 완성된다. 이 순환을 매 프레임 반복하는 구조로 이해하면 큰 그림이 잡힌다.
주니어 개발자가 시작하는 순서
기초 없이 Metal 코드부터 붙잡으면 객체 이름에 파묻히기 쉽다. 순서를 밟는 편이 결국 빠르다.
- 먼저 GPU와 CPU가 어떻게 다르게 일하는지, 렌더링 파이프라인이 무엇인지 개념부터 잡는다.
- 화면에 삼각형 하나를 띄우는 가장 작은 예제를 직접 따라 만든다. 이 과정에서 디바이스와 커맨드 큐, 셰이더가 어떻게 연결되는지 손으로 익힌다.
- 삼각형이 나온 뒤에는 텍스처를 입히거나 도형을 움직이며 기능을 하나씩 늘린다.
- 렌더링이 아니라 연산이 목적이라면 Metal Performance Shaders처럼 이미 최적화된 도구를 먼저 살펴보는 편이 실용적이다.
Metal은 저수준 프레임워크라 처음에는 코드가 장황하게 느껴질 수 있다. 그래도 GPU가 화면을 어떻게 만들어 내는지 밑바닥부터 들여다본다는 점이 강점이다. 당장 실무에서 쓰지 않더라도 그래픽과 성능의 원리를 이해하는 밑거름이 된다. 급하게 전부 외우기보다 작은 예제를 굴려 보며 개념과 코드가 맞물리는 지점을 하나씩 확인하는 접근을 권한다.