스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
Apple 플랫폼으로 고사양 게임 포팅하기
Apple 플랫폼에서 게임을 즐기는 전 세계 플레이어에게 도달하는 방법은 매우 간단합니다. Apple Silicon에서 Windows 실행 파일 평가하기, 코드 샘플로 게임 포팅하기, 셰이더 코드를 Metal로 변환하기, Mac·iPhone·iPad로 게임 가져오기 등의 작업을 수행하는 방법을 확인해 보세요. 포팅된 셰이더를 Metal에서 검증, 디버깅, 프로파일링하기 위해 HLSL 셰이더를 파악하는 향상된 Metal 도구에 대해서도 알아보세요.
챕터
- 0:00 - Intro
- 2:06 - Evaluate your game
- 2:07 - Port your game
- 6:22 - Configuration
- 9:29 - Shaders
- 11:36 - Graphics
- 16:06 - Input and rumble
- 17:56 - Audio
- 18:53 - Cloud saves
- 21:28 - Debug and profile with Metal tools
- 28:39 - Wrap-up
리소스
- Download the Game Porting Toolkit 2
- Forum: Graphics & Games
- Get started with Metal shader converter
- Getting started with Metal-cpp
- Metal
- Metal Developer Resources
- Rendering reflections in real time using ray tracing
- Simplifying GPU Resource Management with Residency Sets
- Validating your app’s Metal API usage
- Validating your app’s Metal shader usage
관련 비디오
WWDC24
Tech Talks
WWDC23
WWDC22
WWDC21
- Discover geometry-aware audio with the Physical Audio Spatialization Engine (PHASE)
- Discover Metal debugging, profiling, and asset creation tools
WWDC20
WWDC19
-
다운로드
안녕하세요! Jacek Ratajewski입니다 Apple의 GPU, Graphics, and Display Software 그룹의 엔지니어링 매니저입니다 오늘 Alè와 함께 여러분께 소개할 내용은 고사양 게임을 Mac, iPad iPhone에 포팅하는 방법입니다
작년에 Metal은 Game Porting Toolkit을 도입했는데 이 툴킷은 훨씬 더 쉽게 고사양 게임을 기타 플랫폼에서 Mac으로 가져올 수 있게 해 줍니다 ’데스 스트랜딩 디렉터스 컷’ 같은 게임은 모든 M 시리즈 칩 탑재 iPad 그리고 iPhone 15 Pro에도 가져왔습니다 새로운 Game Porting Toolkit 2는 고사양 게임을 Mac에 빠르게 포팅하고 iPad와 iPhone에서 실행하는 업데이트된 도구 세트를 제공합니다 먼저, 게임을 이미 Windows에서 실행하고 있는 경우 Windows 게임용으로 포함된 평가 환경을 사용해 포팅 여정을 시작하여 게임이 Apple Silicon에서 어떻게 실행될 수 있는지를 더 잘 파악할 수 있습니다 다음으로, 휴먼 인터페이스 가이드라인을 활용하여 Apple 기기에만 해당하는 디자인 규칙을 적용할 수 있습니다 계획 단계를 마친 후 게임 포팅 예제 코드는 프로젝트를 설정하고 게임 포팅의 모범 사례에 대해 알아볼 수 있는 멋진 시작점을 제공합니다 C++로 프로그래밍하는 데 익숙하다면 Metal-cpp는 선호하는 프로그래밍 언어를 선택할 때 더 큰 자유를 선사합니다 게임에서 현재 HLSL로 구현된 셰이더를 사용하는 경우 Metal 셰이더 컨버터를 사용해 Metal로 가져올 수 있습니다 마지막으로, 기존 애셋 빌드 파이프라인에 의존하는 경우 Apple 기기의 게임을 위해 이를 활용하는 데 Windows용 Metal 개발자 도구가 도움이 됩니다 이 세션에서는 전체 게임 포팅 프로세스를 안내하며 이 여정은 게임을 평가하는 것으로 시작됩니다 다음으로, 새로운 Game Porting Toolkit으로 게임의 코드와 애셋을 어떻게 가져올 수 있는지 살펴보고 마지막으로 포팅 프로세스의 모든 단계에서 Metal 도구를 활용해 코드를 디버깅하고 프로파일링하는 방법을 알아봅니다 여정의 첫 번째 단계에서는 게임을 이미 다른 플랫폼에서 실행하고 있는 경우 Windows 게임용 평가 환경은 포팅 프로세스를 시작하기 전에도 Apple Silicon에서 게임이 실행되는 모습을 볼 수 있게 해 줍니다 이렇게 하면 기준 성능을 더 잘 파악하고 셰이더가 Metal로 성공적으로 변환되는 것을 확인할 수 있습니다 505 Games의 ’컨트롤’입니다 평가 환경을 통해 MacBook Pro에서 실행되고 있습니다 올해 업데이트된 도구는 더 많은 기술을 지원합니다 Windows 게임에서 AVX 지침을 사용하는 경우 이제 Apple 기기에 가져오기 전에 평가해 볼 수 있습니다 이제 평가 환경에서 레이 트레이싱도 지원하며 향상된 그래픽과 컴퓨팅 호환성, 개선된 성능을 포함하므로 게임이 Apple 기기에서 얼마나 멋지게 실행될지 한층 더 잘 파악할 수 있습니다 또한 Xcode 내 Metal 도구의 새롭게 향상된 기능 덕분에 이제 포팅 프로세스의 모든 단계에서 원본 HLSL 셰이더의 소스를 디버깅하고 프로파일링할 수 있습니다 원본 Windows 바이너리를 평가하는 경우든 게임의 Metal 버전을 디버깅하는 경우든 관계없습니다 커뮤니티가 어떻게 이 도구를 수용했고 Whisky와 Homebrew 같은 프로젝트나 CrossOver 같은 제품을 통해 기존 게임 평가를 시작하는 추가적인 방법을 제공했는지도 정말 기대됩니다
이제 사용자가 Mac, iPad 또는 iPhone에서 게임을 플레이할 때 익숙한 특정 Apple 플랫폼 규칙을 예상할 수 있습니다 게임을 포팅하는 동안 사용자 경험의 어떤 측면을 고려해야 하는지 알아보려면 ’Apple 플랫폼을 위한 고사양 게임 디자인하기’ 비디오를 참고하세요 또한 Game Porting Toolkit은 게임만을 위한 휴먼 인터페이스 가이드라인의 새로운 섹션을 제공하며 최초 실행 경험 향상하기 서체를 모든 Apple 디스플레이 크기에서 읽을 수 있게 하기 등에 관한 팁이 포함됩니다 이제 게임 포팅을 시작할 준비가 되었으니 올바른 프로젝트 구성으로 Mac iPad, iPhone을 대상으로 지정하고 Game Porting Toolkit 2로 이 목표를 달성하는 데 도움이 되는 놀라운 새 샘플 코드를 활용할 수 있습니다 샘플에는 포팅 프로세스의 주요 요소를 단계별로 안내하는 대화형 튜토리얼이 포함됩니다 프로젝트 레이아웃은 문서를 폴더로 정리하며 각각 그래픽, 셰이더, 오디오 게임 컨트롤러 등 게임의 서브시스템을 포팅하는 방법에 대한 구체적인 정보를 제공하죠 각 폴더에는 교육 내용 및 연관된 모든 코드가 포함되어 있습니다 예를 들어 ’GameInput’의 폴더를 열면 Xcode가 이 프로젝트의 게임 컨트롤러 입력을 처리하는 모든 파일을 표시하며 README 파일에는 게임 입력 지원을 게임에 가져오는 방법을 파악하는 데 필요한 모든 정보가 포함되어 있습니다
이는 필요한 사항에 정확히 초점을 맞추고, 학습하면서 코드 예제를 손쉽게 사용할 수 있는 유용한 방법입니다 무엇보다 완전한 Xcode 프로젝트이므로 이를 빌드하고 실행하여 모든 것이 어떻게 결합되는지 확인할 수 있습니다! 이 간단한 2D 게임은 이 프로젝트의 모든 장에서 다루는 모든 코드로 구성되며 이러한 모든 기술이 어떻게 결합되는지를 보여 줍니다 이 코드를 수정하고 실험해 보며 그중 일부를 여러분만의 프로젝트에 사용할 수도 있습니다!
macOS와 iOS 모두를 대상으로 지정하는 모든 구성을 이미 포함하고 있기 때문에 iPhone나 iPad용 게임을 그만큼 쉽게 빌드하고 실행할 수 있습니다 이 샘플 코드를 사용하는 것은 Apple 기기에 게임을 가져오는 과정의 멋진 시작입니다
이제 Alè가 게임을 포팅하는 방법에 대해 더 자세히 말씀드리겠습니다 감사합니다, Jacek 저는 Alè입니다 Apple Metal Games Ecosystem 팀의 엔지니어입니다 오늘은 게임 포팅 코드 예제 프로젝트의 주요 영역을 안내해 드리려고 합니다 macOS와 iOS 모두를 대상으로 지정하는 프로젝트를 구성하는 방법, 셰이더와 그래픽을 Metal에 가져오는 방법 진동, 오디오를 비롯한 입력 지원 마지막으로, 클라우드 저장을 통한 이동 중 원활한 다중 기기 게임 경험으로 플레이어를 만족시키는 방법에 관한 팁을 살펴보는 것으로 시작하겠습니다
Xcode 프로젝트를 올바르게 구성하면 게임을 macOS에 가져온 다음 하나의 단계로 iOS에서 빌드하고 실행할 때 성공을 거둘 수 있습니다 Xcode를 사용하면 간편하게 모든 Apple 기기를 균등하게 대상으로 지정하면서 필요 시 맞춤화도 가능합니다 이는 게임에 유용한데, 일반적으로 공통 코드베이스를 사용하고 모든 대상에서 대부분의 프로젝트 설정을 공유하기 때문입니다
게임 포팅 예제에서는 다중 기기 프로젝트 설정 방법을 보여 줍니다 이 예제에서는 macOS 및 iOS 기기를 모두 대상으로 지정합니다 이는 프로젝트 설정의 ’Supported Destinations’ 아래에 있습니다 이 설정을 사용하면 macOS와 iOS 모두가 각 SDK의 전체 기능에 액세스할 수 있습니다
필요한 경우 Xcode를 사용하면 대상에 따라 라이브러리 프레임워크, 코드 부분 같은 요소를 쉽게 구별할 수 있습니다 iOS 및 macOS용 대상 조건문은 두 OS 모두를 위해 파일의 부분을 컴파일하는 데 도움이 됩니다 더 나아가, 프로젝트에는 대상 중 하나에 대해서만 맞춤화된 전체 파일이 포함될 수도 있습니다 일례로, 앱 라이프 사이클 파일은 macOS와 iOS에 별개일 수 있습니다 이 경우, Xcode에서는 필터를 사용하여 SDK에 따라 특정 대상용으로 파일을 지정할 수 있습니다 하지만 많은 공유 파일의 경우 ’Always Used’ 필터를 고수하여 모든 곳에서 사용할 수 있습니다
게임 개발에 사용하는 대부분의 Apple 프레임워크는 macOS와 iOS 모두를 대상으로 지정합니다 따라서 두 가지 모두를 위한 개발 경험은 정말 간단하며 올해의 새로운 기능 향상으로 한층 더 손쉬워집니다 통합 Metal 셰이더 덕분에 이제 셰이더를 한 번 컴파일하여 macOS와 iOS에 배포할 수 있습니다 Metal 기기 초기화도 통합되므로 두 가지 모두를 위해 동일한 생성 API를 사용할 수 있으며 기기 인증 API로 기기에 성능 프로파일을 쿼리하여 게임의 구성을 확장 및 축소할 수 있습니다 올해의 또 다른 기능 향상은 게임 모드가 iOS에서 제공된다는 것이죠 게임 모드에서 iOS는 백그라운드 활동과 Bluetooth 지연 시간을 줄여 입력과 헤드폰 응답성을 향상합니다
iOS 18은 게임에 대해 게임 모드를 자동으로 활성화할 수 있지만 이를 확실히 선택하고 싶다면 iOS info.plist에서 ’GCSupportsGameMode’ 키를 추가하고 ’true’로 설정합니다 게임 포팅 예제 코드는 이러한 주요 구성 단계 중 몇 가지를 보여 주므로 자세히 알아보려면 이를 확인하세요 프로젝트 구성에 대한 세부 정보를 하나 더 소개합니다 C++는 게임 개발에서 널리 사용되는 프로그래밍 언어입니다 여러분의 게임에서 이미 사용하고 계실 수도 있겠네요 C++ 전문 지식을 활용하는 방법을 보여 드리기 위해 게임 포팅 예제 코드는 Metal용 공식 C++ 바인딩인 Metal-cpp로 사전 구성되어 제공됩니다 올해, metal-cpp는 Game Porting Toolkit 2의 일부로 제공됩니다 이미 C++ 구문에 익숙하시다면 Metal을 쉽게 시작하실 수 있습니다 무엇보다, Metal Objective-C 헤더를 호출하는 것에 비해 측정 가능한 오버헤드가 없습니다 자세히 알아보려면 developer.apple.com/kr의 문서와 2022년의 비디오를 참고하세요 이제 프로젝트가 설정되었으니 셰이더를 가져와야 합니다 Game Porting Toolkit 2에는 Metal 셰이더 컨버터가 포함됩니다 그 덕분에 셰이더를 Metal에 쉽게 가져올 수 있습니다 최첨단 셰이더 단계를 비롯해 모든 셰이더 단계를 지원합니다 예를 들면 레이 트레이싱과 메시 셰이더 지오메트리와 테셀레이션 셰이더 같은 레거시 기술 등입니다 Metal 셰이더 컨버터를 사용하면 포팅 타임라인이 가속화됩니다 Ubisoft는 Game Porting Toolkit의 Metal 셰이더 컨버터를 사용하여 ’어쌔신 크리드 미라지’의 셰이더를 Metal에 가져와 개발 시간을 수개월 단축했습니다 셰이더를 가져오는 것 외에 Metal 셰이더 컨버터는 리소스 레이아웃을 Metal에 포팅하는 데에도 도움이 됩니다 또한 리소스를 파이프라인에 바인딩하고 공통 작업을 수행할 수 있는 런타임 헤더 전용 라이브러리를 포함합니다 Metal 셰이더 컨버터에 대해 자세히 알아보려면 developer.apple.com/kr의 문서와 작년의 비디오 ’Mac에 게임 가져오기, 2부: 셰이더 컴파일하기’를 참고하세요
올해, Metal은 전체적으로 일관된 텍스처 액세스를 도입하며 업데이트된 Metal 셰이더 컨버터는 이를 완벽하게 지원합니다 따라서 모든 스레드 그룹에 걸쳐 확인 가능한 텍스처 작업이 필요한 고급 알고리즘을 개발할 수 있습니다 또한 Metal 셰이더 컨버터는 이제 소스 HLSL의 디버그 정보를 이해하고 전달할 수 있기 때문에 Metal 도구의 전체 성능을 사용해 변환된 셰이더를 디버깅하고 프로파일링할 수 있습니다 마지막으로, 올해부터는 셰이더를 MetalIR로 한 번 변환하여 모든 Apple 기기에 걸쳐 배포할 수 있습니다
게임 포팅 예제 프로젝트는 Metal 셰이더 컨버터를 활용하는 방법과 통합 셰이더를 한 번 컴파일한 후 macOS와 iOS 모두에 걸쳐 배포하는 방법을 보여 줍니다 Windows와 macOS 모두에서 명령줄 도구를 사용하거나 동적 라이브러리에 대해 연결하여 Metal 셰이더 컨버터를 호출할 수 있습니다
게임 샘플은 간결성을 위해 명령줄 도구를 사용하여 직접 입력 파일을 전달하고 출력을 지정합니다 metal-shaderconverter --help를 실행하여 셰이더 변환을 위한 풍부한 옵션 세트에 대해 자세히 알아볼 수 있습니다 플랫폼의 셰이더로 그래픽 렌더링을 시작할 수 있습니다! 이를 위해 Metal은 Apple 기기를 위해 설계되고 최적화된 최신 그래픽 및 컴퓨팅 API를 제공합니다 다양한 고급 기능을 제공하므로 Metal 문서에서 확인하시기 바랍니다 올해, Metal은 게임을 위해 특별히 설계된 향상된 기능을 제공합니다 첫째, 리소스 레지던시입니다 다른 플랫폼에서는 GPU가 별도의 제한된 자체 메모리를 사용합니다 게임은 리소스를 이 메모리에 복사하며 제한된 크기 내에 해당하는 경우 게임이 이에 효율적으로 액세스할 수 있습니다 Apple 플랫폼에서는 통합 메모리 모델이 매우 큰 메모리에 대한 GPU 액세스를 제공하지만, 이에 액세스할 수 있도록 상주시키기 위해 Metal에 어떤 리소스인지 지정해야 합니다 다른 플랫폼에서 변환하는 경우 이 프로세스를 간소화하고 더 익숙하게 만들기 위해 올해에는 Metal 레지던시 세트를 도입합니다
게임이 리소스를 통합 메모리에 로드하며 이 메모리는 CPU와 GPU가 공유합니다 레지던시 세트를 사용하면 리소스 그룹을 정의한 다음 모두 동시에 상주시킬 수 있습니다
레지던트 세트를 사용하면 더 이상 개별 리소스를 추적할 필요가 없으므로 코드가 간소화되며 CPU 오버헤드를 줄이는 데 도움이 됩니다 레지던시 세트는 쉽게 사용할 수 있습니다 먼저, Metal 기기에서 새로운 Metal 레지던시 세트 인스턴스를 생성합니다 그런 다음 해당 레지던시 세트를 명령 대기열에 추가합니다 이렇게 하면 작업을 대기열에 커밋할 때 해당 세트의 모든 항목에 대해 레지던시가 자동으로 플래깅됩니다 레지던시 세트를 개별 명령 버퍼에 연결할 수도 있습니다 다음으로, 게임에 필요한 할당을 추가합니다 예를 들면 텍스처, 버퍼 전체 히프 등입니다
작업을 마치면 변경 사항을 레지던시 세트에 커밋합니다 리소스를 생성하거나 제거하면서 설정 단계를 한 번 수행합니다 드로우 시, 레지던시 세트를 연결한 대기열에서 작업을 평상시처럼 명령 버퍼에 인코딩합니다 그런 다음 명령 버퍼를 커밋하면 레지던시 세트를 가져와 해당 할당을 GPU에서 사용할 수 있도록 합니다 자세한 내용은 문서와 업데이트된 ’Rendering reflections in real time using ray tracing’ 코드 샘플과 게임 포팅 예제 코드를 참고하세요 레지던시 세트는 Metal 레이 트레이싱 도입을 크게 간소화하죠 이제 모든 레이 트레이싱된 장면 리소스를 세트의 일부로 상주하도록 표시할 수 있기 때문입니다 Metal은 올해 다른 향상된 기능도 추가하여 다른 플랫폼의 레이 트레이싱을 가져올 수 있도록 합니다 이제 행 우선 순위의 가속화 구조로 변환 행렬을 지정할 수 있습니다 이렇게 하면 런타임에 행렬 전치의 비용을 지불하지 않아도 됩니다 또한 온칩 충돌 결과 저장 공간에 대한 직접 액세스 덕분에 레이 트레이싱 셰이더 함수 간 인수 전달의 데이터 복사와 잠재적 GPU 메모리 유출이 방지됩니다 렌더러가 아름다운 이미지를 생성한 후 MetalFX를 사용하여 게임의 성능을 크게 향상할 수 있습니다 MetalFX는 더 낮은 해상도의 이미지를 출력 해상도로 직접 렌더링할 때보다 더 빠른 시간 안에 최대 대상 출력 해상도까지 높이는 방식으로 작동합니다 MetalFX는 쉽게 사용할 수 있습니다 렌더링 루프에서 시간적 스케일러 객체를 생성한 후 색상, 심도, 동작, 업스케일링된 출력에 대한 텍스처를 지정하고 지터 오프셋도 제공하기만 하면 됩니다 올해에는 새로운 반응 마스크를 추가합니다 이 선택적 기능은 알파 블렌딩 사용 시 발생할 수 있는 동작 정보가 부정확하고 빠르게 움직이는 객체를 포함하는 장면에서 업스케일링 정확성을 높이는 데 도움이 될 수 있습니다
마지막으로, 업스케일링 패스를 명령 버퍼에 인코딩합니다 이상으로 시간적 MetalFX 업스케일러가 준비되었습니다
Metal은 이 비디오에서 다룰 수 있는 것보다 더 많은 고급 그래픽 및 컴퓨팅 기능을 제공합니다 Metal을 사용하여 고급 렌더러를 포팅하는 방법의 실제 예제는 게임 포팅 예제 프로젝트와 작년의 다음과 같은 비디오를 참고하세요 ’Mac에 게임 가져오기, 3부: Metal로 렌더링하기’ GPU 프로그래밍은 재미있지만 플레이어가 여러분이 만든 멋진 내용을 볼 수 있도록 해당 콘텐츠를 화면에 표시해야 합니다
게임 포팅 예제 프로젝트는 Apple 프레임워크를 사용하여 기기의 지오메트리에 맞춰 조정되는 게임의 전체 화면 및 윈도우 형식 모드를 효율적으로 구현하는 방법을 보여 줍니다 다음과 같은 비디오도 확인해 보시기 바랍니다 ’Apple 플랫폼을 위한 고사양 게임 디자인하기’ 이 비디오에서는 Apple 기기에서 플레이어에게 게임을 선보이기 위해 유용한 지침을 제공합니다 게임은 단순한 그래픽 이상입니다 다른 게임 서브시스템을 포팅하는 것은 렌더링만큼 쉽습니다 입력과 진동으로 시작합니다 입력은 다양한 형태일 수 있습니다 macOS 및 iOS 기기에 공통적으로 게임이 게임 컨트롤러, 마우스 키보드에서 플레이어 동작을 감지하고 응답할 수 있습니다 또한 iOS 기기는 최대 10개의 손가락 터치를 동시에 인식하여 한층 더 개인적인 경험을 선사합니다 Game Controller 프레임워크는 통합 솔루션입니다 유연한 최신 설계 덕분에 이벤트 콜백을 등록하고 요청 시 플레이어의 동작을 폴링할 수 있습니다 모든 기기에서 플레이어의 입력을 가져오기 위해 선호되는 방법이죠
게임 포팅 예제 프로젝트는 입력 코드를 얼마나 쉽게 포팅할 수 있는지를 보여 줍니다 예를 들어 현재 코드가 게임 컨트롤러 상태를 직접 폴링하면 Game Controller 프레임워크로 해당 작업을 할 수도 있습니다 Game Controller 프레임워크를 사용하면 플레이어가 게임 컨트롤러를 연결하지 않은 경우에도 안전하게 호출할 수 있는 더 짧고 깔끔한 코드가 생성되지만 감지 성능 면에서 입력이 차지하는
비중은 절반에 불과합니다 플레이어를 몰입시키기 위해 중요한 부분은 진동으로 게임 내 이벤트에 대한 피드백을 전달하는 것입니다
Game Controller 프레임워크를 Core Haptics와 함께 사용하여 진동을 구현합니다 Core Haptics는 Taptic Engine 탑재 iOS 기기에서 촉각 이벤트를 제공하는 데 사용하는 것과 동일한 프레임워크입니다 게임 컨트롤러가 햅틱을 지원하는 경우 햅틱 속성을 통해 햅틱 엔진 인스턴스를 직접 생성할 수 있습니다 이 단일 인스턴스는 여러 공급업체에서 제공하는 게임 컨트롤러 간의 차이를 무시합니다 햅틱에 대해 자세히 알아보려면 ’게임 컨트롤러의 발전’과 ’Core Haptics 소개’를 참고하시기 바랍니다 오디오의 경우 Apple SDK는 풍부한 앱 경험을 선사하는 데 필수적인 포괄적인 오디오 프레임워크 및 기술 세트를 제공합니다 특히 PHASE 프레임워크는 게임에 매우 적합합니다 PHASE는 Physical Audio Spatialization Engine의 약자로 헤드폰, 스피커 등 다양한 종류의 출력 기기를 위해 풍부하고 동적인 오디오 경험을 선사하는 데 도움이 될 수 있습니다 더 좋은 점은, 게임의 장면을 이해할 수 있어 지오메트리 사운드 오클루전 같은 복잡한 효과를 시뮬레이션할 수 있다는 것입니다 자세한 내용은 PHASE를 소개하는 비디오를 참고하세요
게임의 논리는 미들웨어 SDK와 통합되어 음악과 사운드 효과를 재생할 수도 있습니다 이 경우 Audiokinetic Wwise FMOD 등 널리 사용되는 미들웨어를 Apple 기기에 사용할 수 있습니다 PHASE를 사용하여 게임에서 플레이어가 총을 쏘거나 사물이 충돌할 때 스테레오 사운드를 재생하는 게임 포팅 예제 프로젝트를 확인하세요 Apple 기기에서 게임을 차별화하는 요소는 macOS와 iOS 모두에서 쉽게 대상을 지정할 뿐만 아니라 모든 플레이어의 기기에 걸쳐 게임 상태를 동기화된 상태로 유지할 수 있다는 점입니다 예를 들어, 플레이어는 집에서 한 기기에서 플레이를 시작합니다 특정 단계에 도달하여 게임을 저장하면 게임 저장 데이터를 iCloud에 업로드합니다 그런 다음 버스를 탄다고 가정해 보죠 문제없이 iPhone에서 게임을 열고 중단했던 곳부터 이어서 플레이할 수 있으며, 이를 위해 iCloud에서 게임 저장 데이터를 로드하고 플레이하면서 동기화된 상태로 유지합니다 마지막으로, 플레이어가 카페에 가고 iPad에서 플레이하면서 더 큰 화면을 사용하기로 결정하면 게임이 iCloud에서 진행 상황을 로드할 수 있습니다 이동 중에 여러 기기에 걸쳐
계속 진행하려면 ’클라우드 저장’이 중요합니다 CloudKit을 사용하면 기기 간에 매끄럽게 전환하고 진행 상황이 항상 중요하도록 할 수 있습니다 게임 포팅 프로젝트는 게임이 높은 점수 등의 데이터를 한 기기에서 저장해 iCloud를 통해 또 다른 기기로 전환하는 방법을 보여 주며
샘플에서 동기화 처리 클래스인 ’CloudSaveManager’를 제공하죠 사용해 보려면 iCloud 식별자를 사용하고 게임 저장 데이터가 포함된 기존 폴더를 지정하여 설정하세요 실행 시 샘플이 ’sync’를 호출해 완료 처리기 블록을 전달하죠 이 블록은 로컬 데이터와 클라우드 데이터 간의 병합 충돌을 처리하기에 적합한 곳입니다 마지막으로, 진행 상황을 클라우드에 저장하기 위해 샘플은 저장 파일에 쓸 때마다 ’upload’를 호출합니다 이는 완료 처리기를 전달하여 충돌을 해결할 수 있는 또 다른 지점입니다 여러 기기에 걸쳐 플레이하는 것은 좋지만, 진행 상황에 친구들에게 자랑할 수 있는 게임 내 도전 과제 내용이 표시되지 않는다면 그만큼 만족스럽지는 않을 것입니다 Game Center를 통해 이러한 소셜 기능을 쉽게 추가할 수 있습니다 App Store Connect를 통해 도전 과제를 생성하고 게임과 연결합니다 각 도전 과제에는 고유한 식별자가 있으며, 게임에서는 이를 사용해 플레이어의 달성 현황을 보고합니다 플레이어를 인증한 후 GKAchievement 클래스의 ’reportAchievements’ 함수를 사용해 새로운 진행 상황 백분율을 보고할 수 있습니다
Game Center에 도전 과제를 포함하면 플레이어가 기기 간에 매끄럽게 전환하면서 계속 달성해 가게 할 수 있습니다
App Store Connect를 사용해 도전 과제를 구성하고 Game Center에 보고하는 더 자세한 단계는 게임 포팅 예제 코드를 확인하세요 하지만 코드 작성이 멋진 게임을 Apple 기기에 가져오는 것의 전부는 아닙니다 이제 다시 Jacek이 Metal 도구에 대해 더 자세히 안내하겠습니다 감사합니다, Alè! Metal은 탁월한 개발자 도구 모음을 제공해 포팅된 게임을 디버깅하고 프로파일링하여 Apple 기기의 최대 잠재력에 도달하도록 합니다 이때 API 사용과 셰이더 코드 모두에서 일반적인 문제를 파악하는 데 도움이 되는 런타임 유효성 검사로 시작합니다 Metal Performance HUD는 게임의 실시간 성능을 위해 오버레이를 제공합니다 Xcode의 Metal 디버거는 고급 디버깅 및 프로파일링 워크플로를 제공하며 예를 들면, 종속성 분석 비주얼 아티팩트 조사 셰이더 프로파일링 등입니다! 마지막으로, Instruments의 Metal 시스템 추적은 게임이 시스템에 미치는 전반적인 영향을 측정 및 분석하는 데 도움이 되죠 올해에는 새롭게, Metal 셰이더 컨버터를 사용해 Metal에 가져온 HLSL 셰이더와 함께 이러한 디버깅 및 프로파일링 도구를 사용할 수 있습니다 변환된 셰이더 작업에 대해 강조하고 싶은 3가지 도구가 있는데, 바로 런타임 유효성 검사 셰이더 디버거 셰이더 프로파일러입니다 하지만 먼저, 셰이더에 대한 충분한 디버그 정보와 함께 이러한 도구를 제공하기 위해 프로젝트를 준비하는 방법을 보여 드리겠습니다 한 단계만 수행하면 Xcode에서의 디버깅 및 프로파일링을 위한 셰이더를 준비할 수 있습니다 -Zi 및 -Qembed_debug를 DXC 명령에 대한 인수로 추가합니다 그런 다음 Metal 셰이더 컨버터는 디버그 정보를 Metal 라이브러리에 전파하는 작업을 처리합니다
디버그 정보를 사용하여 셰이더를 다시 구성하면 디버깅 및 프로파일링을 시작할 준비가 됩니다 Metal이 제공하는 첫 번째 런타임 유효성 검사 레이어는 API 유효성 검사로, 리소스 이니셜라이저, 함수 인수 또는 지원되지 않는 기능을 확인하여 Metal API의 유효하지 않은 사용으로부터 보호해 줍니다 매우 가벼우므로 전체 개발 프로세스에 걸쳐 활성화된 상태로 유지합니다 올해에는 Metal 셰이더 컨버터 워크플로에 대한 유효성 검사가 인수 버퍼에 인코딩된 샘플러의 상태 유효성 검사를 위해 향상되죠 Metal 런타임 유효성 검사는 두 번째 레이어도 제공합니다 바로 셰이더 유효성 검사입니다 셰이더에서 버그를 파악하는 데 사용합니다 특히 정의되지 않은 동작을 유발할 수 있는 버그를요 셰이더 유효성 검사는 Address Sanitizer를 제공하고 유효하지 않은 리소스 사용이나 레지던시 문제를 확인하며 잠재적인 스택 오버플로를 감지하고 이제 잘못된 유형의 텍스처에 대한 액세스를 감지할 수 있습니다 이는 텍스처를 변환된 셰이더에 바인딩할 때의 흔한 실수입니다 이 경우 어떻게 셰이더 유효성 검사 및 새로운 유효성 검사 확인으로 CPU의 API 측면과 GPU의 셰이더 측면 간의 텍스처 유형 불일치 문제를 찾고 원래 셰이더 코드에 직접 문제를 표시했는지 확인하세요 고사양 게임은 수천 개의 셰이더를 포함할 수 있으며 이러한 이유로 올해에는 셰이더 유효성 검사에서 셰이더 코드의 어떤 영역을 유효성 검사할지에 대한 제어력이 강화됩니다 여러분은 여러분의 게임을 가장 잘 알고 있으므로 이제 초점을 맞출 항목에 따라 선택된 파이프라인에 대해 셰이더 유효성 검사를 활성화 또는 비활성화할 수 있습니다 이렇게 하면 현재 관련 없는 문제로 인한 노이즈를 줄이거나 셰이더 유효성 검사가 활성화된 경우 게임의 성능을 향상하는 데 도움이 될 수 있습니다 파이프라인당 유효성 검사 등 API 및 셰이더 유효성 검사 레이어를 사용하는 방법을 알아보려면 Metal 문서에서 이러한 자료를 확인하세요 문제의 범위를 특정 파이프라인으로 좁힌 후에는 코드를 디버깅할 때 셰이더 디버거가 고유하고 강력한 기능 세트를 제공합니다 셰이더 디버거가 특별한 점은 모든 코드 줄에 대한 모든 변수 정보를 동시에 표시한다는 것입니다 왼쪽의 디버그 탐색기에는 셰이더의 전체 실행 기록이 표시됩니다 탐색기에서 줄을 선택하면 소스 편집기에서 해당 코드 줄이 강조됩니다
소스 편집기의 오른쪽에는 변수 값의 미리보기가 표시됩니다 미리보기 버튼을 클릭하면 해당 특정 변수에 대한 더 자세한 뷰가 표시되어 모든 주변 픽셀의 값을 보여 주며 오른쪽의 마스크에서는 어떤 픽셀이 이 코드 줄을 실행했는지를 보여 줍니다
이 모든 것은 셰이더의 실행에 대한 깊은 수준의 인사이트를 제공하며 가장 복잡한 셰이더 문제도 디버깅할 수 있도록 도와줍니다 마지막으로, 셰이더 프로파일러가 있으며 이는 변환된 셰이더에 대한 새로운 지원도 받습니다 게임의 병목 현상 찾기에 대한 한 가지 접근 방식은 가장 광범위한 셰이더를 파악하고 비용이 가장 많이 드는 함수와 코드 줄을 이해하는 것입니다 이를 위해 셰이더 프로파일러는 셰이더 비용 그래프를 제공합니다 비용 그래프는 비용이 가장 많이 드는 셰이더 함수 호출을 아래의 해당 셰이더 소스 코드와 함께 표시합니다 왼쪽의 사이드바에는 소스 코드에 성능 통계가 주석으로 추가되어 있어 각 코드 줄의 비용이 얼마나 되는지를 나타냅니다 원형 차트 위로 마우스를 가져가면 성능 팝오버가 표시되어 해당 코드 줄의 세부 정보를 제공하며 여기에는 GPU에 대해 실행된 많은 지침과 다양한 지침 카테고리의 비용이 포함됩니다 이 정보를 사용하여 셰이더에서 비용이 가장 많이 드는 부분으로 빠르게 이동할 수 있습니다 하지만 셰이더의 성능은 화면의 다양한 픽셀에 대해 다르게 작동할 수 있습니다 이는 분기 코드 경로를 실행하거나 픽셀 위치에 따라 별개의 리소스를 사용하는 셰이더로 인해 발생할 수 있습니다 이러한 상황에서는 성능 히트 맵을 사용해 비용이 가장 많이 드는 픽셀을 시각화할 수 있습니다 확대하여 해당 픽셀을 더 자세히 조사하고 해당 픽셀이 포함된 SIMD 그룹에 대한 추가 정보를 확인할 수 있습니다
픽셀을 선택하면 모든 스레드에 대한 호출 스택을 시각화하는 SIMD 그룹에 대한 실행 기록이 표시되며, 여기에는 특정 시점에 그중 어떤 것이 활성이었는지에 대한 정보가 포함됩니다
실행 기록 아래에는 셰이더 소스 코드가 각 줄이 실행하는 지침의 수와 같은 성능 주석과 함께 제공됩니다
이러한 성능 분석 워크플로와 Metal 셰이더 도구에 대한 기타 향상된 기능은 게임을 위한 최고의 도구 경험을 제공하며 이는 Metal 셰이더 컨버터를 사용하는지, 아니면 Metal 셰이딩 언어로 셰이더를 기본적으로 구현하는지에 관계없습니다 모든 Metal 도구를 포팅 여정의 모든 단계에서 사용할 수 있으며 원본 Windows 바이너리 평가부터 게임의 Metal 버전 포팅, 디버깅 및 최적화까지 모두 해당합니다 전체 Metal 도구 모음에 대해 알아보고 Apple Developer 웹사이트에서 해당 문서를 찾아보세요 또한 이전 비디오에서 뛰어난 디버깅 기법을 확인하여 게임을 추가로 최적화하세요
오늘 Alè와 제가 많은 내용을 다뤘습니다 Mac, iPad, iPhone에 손쉽게 포팅할 수 있게 해 주는 많은 도구 및 플랫폼의 향상된 기능을 소개했습니다 현재 이러한 모든 도구를 사용할 수 있으며 developer.apple.com/kr에 Game Porting Toolkit 2에 대한 새로운 랜딩 페이지가 있습니다 이러한 도구에 개별적으로 액세스하거나, 게임 포팅 시 성공적으로 수행하는 데 필요한 모든 것이 포함된 통합 패키지를 다운로드할 수 있습니다 그 어느 때보다 쉽게 게임을 Mac iPad, iPhone에 포팅할 수 있죠 Game Porting Toolkit 2 내의 모든 새로운 도구와 업데이트된 도구는 프로세스의 각 단계에서 지원을 제공하며 여기에는 평가하기 게임의 코드 및 애셋 가져오기 Apple 기기에 맞춰 게임의 경험 조정하기 등이 포함됩니다 또한 새로운 게임 포팅 예제 코드는 이 과정에 도움이 되는 최고의 가이드입니다 마지막으로, 향상된 Metal 도구 덕분에 이제 훨씬 쉽게 게임을 디버깅하고 프로파일링할 수 있습니다 Game Porting Toolkit 2를 다운로드하고 직접 사용해 보세요! 또한 올해의 비디오를 확인하세요 ’Apple 플랫폼을 위한 고사양 게임 디자인하기’를 참고하세요 여러분이 Apple 기기에 구현하실 차세대 게임이 정말 기대됩니다! 시청해 주셔서 감사합니다!
-
-
12:51 - Build a residency set
// Build a residency set. // Create a new residency set. MTL::ResidencySet* residencySet; residencySet = device->newResidencySet(residencySetDescriptor, &error); // Add to main command queue. commandQueue->addResidencySet(residencySet); // Add allocations and commit changes. residencySet->addAllocation(texture); residencySet->addAllocation(buffer); residencySet->addAllocation(heap); residencySet->commit(); // Use residency sets. // Allocate and encode a command buffer. MTL::CommandBuffer* commandBuffer = commandQueue->commandBuffer(); // ... // The command queue marks residency for the set for this command buffer. commandBuffer->commit();
-
14:46 - Upscale image with MetalFX
// Upscale image with MetalFX. mfxTemporalScaler->setColorTexture(currentFrameColor); mfxTemporalScaler->setDepthTexture(currentFrameDepth); mfxTemporalScaler->setMotionTexture(currentFrameMotion); mfxTemporalScaler->setOutputTexture(currentFrameUpscaledColor); mfxTemporalScaler->setJitterOffsetX(currentFrameJitter.x); mfxTemporalScaler->setJitterOffsetY(currentFrameJitter.y); mfxTemporalScaler->setReactiveMaskTexture(currentFrameReactiveMask); mfxTemporalScaler->encodeToCommandBuffer(commandBuffer);
-
19:53 - Use the cloud save manager
// Use the cloud save manager. CloudSaveManager* cloudSaveManager = [[CloudSaveManager alloc] initWithCloudIdentifier:@"iCloud.com.mycompany.mygame" saveDirectoryURL:[NSURL fileURLWithPath:@"/path/to/saves"]]; [cloudSaveManager syncWithCompletionHandler:^(BOOL conflictDetected, NSError *error) { // Handle conflicts or errors, for example, by presenting a choice. }]; // Access and write saves [cloudSaveManager uploadWithCompletionHandler:^(BOOL conflictDetected, NSError *error) { // Handle errors and conflicts or delay until the next sync. }];
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.