계측된 빌드 만들기
PGO 학습(training)은 PGO 계측이 포함된 타이틀 빌드에 의존합니다. PGO는 이 계측을 사용하여 어떤 코드 경로가 가장 자주 실행되는지를 파악합니다. 계측된 빌드를 만드는 데 필요한 작업은 Visual Studio에서 두 개의 빌드 속성을 설정하는 것뿐입니다.계측된 빌드를 만들려면
- 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다.
- 속성 페이지 대화 상자에서 구성 속성 및 C/C++ 노드를 확장합니다.
- 최적화 속성 페이지를 선택한 다음 전체 프로그램 최적화를 예로 설정합니다(그림 1). 그림 1. 전체 프로그램 최적화 속성 설정.

- 링커 노드를 확장합니다.
- 최적화 속성 페이지를 선택한 다음 링크 타임 코드 생성을 프로필 기반 최적화 - 계측으로 설정합니다(그림 2). 그림 2. 계측된 빌드를 위한 링크 타임 코드 생성 속성 설정.
[!NOTE] 이 절차에서 설명하는 두 속성은 MSBuild에서 /GL컴파일러 스위치 및/LTCG:PGInstrument링커 스위치에 해당합니다. - 계측된 빌드를 XBOX One 콘솔에 빌드하고 배포합니다. 타이틀이 실행되면 그림 3과 유사하게 PGO 파일이 타이틀의 일부로 배포된 것을 확인할 수 있습니다. 그림 3. 계측된 빌드로 배포된 PGO 파일.

필수 파일 배포
Microsoft Game Development Kit(GDK)에는 PGO를 사용하기 위해 타이틀과 함께 배포되어야 하는 세 개의 파일이 포함되어 있습니다. 그중 하나인 _psapi.dll_은 _C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin_에 설치됩니다. 나머지 두 파일인 pgort140.dll 및 _pgosweep.exe_는 Visual Studio 설치본에서 제공됩니다. MSBuild를 사용하여 타이틀을 빌드하는 경우, 계측된 빌드를 만들 때 이 파일들이 자동으로 Layout 디렉터리에 복사됩니다.makefiles를 사용하여 타이틀을 빌드하는 경우에는 타이틀과 함께 배포되도록 이 세 파일을 Layout 디렉터리에 직접 추가해야 합니다. Visual Studio에서 이 파일들을 프로젝트에 추가하고 빌드에서 제외하면 편리하게 Layout 디렉터리로 복사하여 타이틀과 함께 배포할 수 있습니다.
필수 파일을 Visual Studio 프로젝트에 추가하려면
- 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가를 선택한 다음 기존 항목을 선택합니다(그림 4). 그림 4. PGO 파일을 프로젝트에 추가.

- _C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin_으로 이동하여 PGO 파일(psapi.dll)을 선택한 다음 추가를 선택하여 프로젝트에 파일을 추가합니다.
- 사용하는 도구 집합에 맞게 C:\Program Files (x86)\Microsoft Visual Studio\2019\edition\VC\Tools\MSVC\version\bin\Hostx64\x64\onecore 또는 _C:\Program Files\Microsoft Visual Studio\2022\edition\VC\Tools\MSVC\version\bin\Hostx64\x64\onecore_로 이동하여 PGO 파일(pgort140.dll 및 pgosweep.exe)을 선택합니다. 그런 다음 추가를 선택하여 파일을 프로젝트에 추가합니다.
- 솔루션 탐색기에서 _pgort140.dll_을 마우스 오른쪽 버튼으로 클릭한 다음 속성을 선택합니다.
- 속성 페이지 대화 상자에서 구성 속성 노드를 확장한 다음 일반 속성 페이지를 선택합니다.
- 빌드에서 제외를 예로 설정한 다음 항목 형식을 빌드에 참여하지 않음으로 설정합니다(그림 5). 그림 5. PGO 파일을 빌드에서 제외.

계측된 빌드를 사용한 학습
학습(training)은 PGO에서 가장 중요한 단계입니다. PGO로 얻는 성능 향상은 애플리케이션이 얼마나 잘 학습되었는지에 직접적으로 좌우됩니다. PGO의 학습 단계에서는 타이틀을 실행하면서 성능이 중요한 일반적인 시나리오를 실행합니다. 일반적인 성능 시나리오를 실행한 후, 학습 데이터를 캡처하는 PGO 아티팩트(.pgc) 파일의 수집을 시작합니다. .pgc 파일을 생성하려면 _pgosweep.exe_를 사용합니다(그림 6). 그림 6. pgosweep.exe 실행. 이 예제에서는 _Direct3DGame1!1.pgc_라는 이름의 .pgc 파일을 만들었습니다. .pgc 파일을 만들 때 일반적으로 titlename!#.pgc 규칙을 사용합니다. 여기서 _titlename_은 실행 중인 타이틀의 이름이고 _#_는 이전에 만든 titlename!#.pgc 파일 수에 1을 더한 값입니다. _pgosweep.exe_를 실행할 때마다 별도의 .pgc 파일이 만들어집니다. 이상적으로는 다양한 성능 중심 시나리오를 나타내는 여러 개의 .pgc 파일을 만들게 됩니다. .pgc 파일 생성이 끝나면 콘솔의 D:\ 디렉터리(즉, SystemScratch)에서 그림 7과 유사하게 이 파일들을 확인할 수 있습니다. 그림 7. 순차적으로 이름이 지정된 .pgc 파일. 다음으로, .pgc 파일들을 .pgd 파일이라는 또 다른 PGO 아티팩트로 병합해야 합니다. .pgd 파일은 PGO의 마지막 단계인 최적화 단계에서 컴파일러에 의해 사용됩니다. 최적화를 시작하기 전에 xbcp.exe를 사용하여 콘솔의 .pgc 파일들을 PC로 다시 복사합니다. .pgc 파일들은 빌드 출력 디렉터리로 복사해야 합니다. (그림 8에서 빌드 출력 디렉터리는 _C:\temp\Direct3DGame1\Gaming.Xbox.XboxOne.x64\Release_입니다.) 그림 8. .pgc 파일을 빌드 출력 디렉터리로 복사.최적화된 빌드 만들기
최적화된 빌드를 만들려면 링크 타임 코드 생성 속성을 프로필 기반 최적화 - 업데이트로 설정합니다(그림 9). 그림 9. 최적화된 빌드를 위한 링크 타임 코드 생성 속성 설정.이 속성은 MSBuild의
/LTCG:PGOptimize 링커 스위치에 해당합니다.XBOX용 PGO 권장 사항
앞의 지침은 내장된 Visual Studio 프로젝트 속성을 사용하여 XBOX의 Microsoft Game Development Kit(GDK)에서 PGO를 사용하는 방법에 대한 개요를 제공합니다. 그러나 Visual C++ 컴파일러는 Visual Studio 2019 및 Visual Studio 2022에서 Visual Studio 프로젝트 속성으로 제어되는/LTCG:PGInstrument, /LTCG:PGOptimize, /LTCG:PGUpdate 스위치를 통한 PGO 사용을 더 이상 권장하지 않습니다.
권장되는 대체 방법은 다음과 같습니다.
- C/C++ 컴파일러의 경우
/GL을 사용합니다(전체 프로그램 최적화 속성을 앞의 그림 1에 표시된 것처럼 **예 (/GL)**로 설정). - 링커의 경우
/LTCG를 사용합니다(링크 타임 코드 생성 속성을 그림 11에 표시된 것처럼 **링크 타임 코드 생성 사용 (/LTCG)**으로 설정). 그림 11. 링크 타임 코드 생성 속성 설정.
/FASTGENPROFILE또는/GENPROFILE을 사용하여 PGO 프로필을 생성합니다(그림 12). 이 스위치에 대한 자세한 내용은 Microsoft Docs의 /GENPROFILE, /FASTGENPROFILE (프로파일링 계측된 빌드 생성)을 참조하세요. 그림 12. PGO 프로필을 생성하도록 링커 스위치 설정.
/USEPROFILE을 사용하여 PGO 프로필 집합에 대해 최적화합니다(그림 13). 이 스위치에 대한 자세한 내용은 Microsoft Docs의 /USEPROFILE (스레드 안전 모드에서 PGO 실행)을 참조하세요. 그림 13. PGO 프로필 집합에 대해 최적화하도록 링커 스위치 설정.
PGO 문제 해결
런타임 성능
계측된 빌드를 프로파일링할 때, 도구가 성능 문제를 일으킬 수 있습니다. 이러한 문제로 인해 타이틀을 제어하기 어려울 수 있습니다. 상호작용형 게임 세션을 프로파일링하기 위한 계측된 빌드를 더 빠르게 만들려면/FASTGENPROFILE 스위치가 좋은 선택입니다.
종속성
PGO 계측을 활성화한 후 타이틀이 더 이상 로드되지 않는 경우, 타이틀 .exe 파일과 동일한 폴더에 pgort140.dll 및 _vcruntime140.dll_이 있는지 확인합니다. pgosweep.exe 실행에 실패하는 경우(대개 STATUS_DLL_NOT_FOUND 오류로), 타이틀 .exe 파일과 동일한 폴더에 pgort140.dll, psapi.dll, _vcruntime140.dll_이 있는지 확인합니다. 또한 pgort140.dll 및 _pgosweep.exe_의 x64 onecore 버전을 사용하고 있는지 확인하세요.메모리 사용량
PGO는 프로필을 캡처하기 위해 메모리를 사용하므로, 사용 가능한 메모리의 상당 부분을 사용하는 타이틀에는 문제가 될 수 있습니다. PGO를 성공적으로 수행하려면 xbconfig.exe의 ExtraTitleMemory 설정, XMemTransferMemory 함수, 또는 둘 다를 사용해야 할 수 있습니다./LTCG:PGInstrument 또는 /GENPROFILE 대신 /FASTGENPROFILE을 사용하면 유사한 결과를 얻으면서도 메모리 사용량은 더 작아집니다.
[!NOTE] 2020년 6월 GDK(및 QFE)에 포함된 버전의 PGO는 타이틀 메모리를 사용합니다. PGO는 향후 릴리스에서 도구 메모리를 올바르게 사용하도록 업데이트될 예정입니다.
