> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Visual Studio에서의 프로필 기반 최적화

> Visual Studio에서의 프로필 기반 최적화

이 항목에서는 XBOX Series X 개발 키트 또는 XBOX One 개발 키트에 배포되어 실행되는 게임에 [프로필 기반 최적화](https://learn.microsoft.com/cpp/build/profile-guided-optimizations)(PGO)를 사용하는 방법을 설명합니다. PGO는 중요하거나 성능에 민감한 사용자 시나리오를 실행하는 동안 수집한 프로파일링 데이터를 사용하여 타이틀의 최적화된 버전을 빌드하는 런타임 컴파일러 최적화 기술입니다.

프로필 기반 최적화는 타이틀이 소매 환경에서 어떻게 사용될 가능성이 높은지에 기반하기 때문에 전통적인 정적 최적화에 비해 상당한 이점을 제공합니다. PGO는 자주 발생하는 사용자 시나리오에 해당하는 코드 경로에 대해서는 속도를 우선하고, 드물게 발생하는 사용자 시나리오에 대해서는 크기를 우선합니다. 그 결과 일반적인 시나리오에서는 더 빠른 코드가, 자주 사용되지 않는 시나리오에서는 더 작은 코드가 생성됩니다.

PGO로 얻을 수 있는 성능 향상은 타이틀에 따라 다르지만, 일반적으로 5\~30퍼센트의 향상을 기대할 수 있습니다. PGO는 애플리케이션의 GPU 중심 부분의 성능은 개선하지 않는다는 점에 유의하세요.

## 계측된 빌드 만들기

PGO 학습(training)은 PGO 계측이 포함된 타이틀 빌드에 의존합니다. PGO는 이 계측을 사용하여 어떤 코드 경로가 가장 자주 실행되는지를 파악합니다. 계측된 빌드를 만드는 데 필요한 작업은 Visual Studio에서 두 개의 빌드 속성을 설정하는 것뿐입니다.

#### 계측된 빌드를 만들려면

1. **솔루션 탐색기**에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 **속성**을 선택합니다.
2. **속성 페이지** 대화 상자에서 **구성 속성** 및 **C/C++** 노드를 확장합니다.
3. **최적화** 속성 페이지를 선택한 다음 **전체 프로그램 최적화**를 **예**로 설정합니다(그림 1). **그림 1.   전체 프로그램 최적화 속성 설정.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_wpo.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=6ecb0d86d212e2b6aa8c5c95d0cf4d40" alt="전체 프로그램 최적화 속성 위치를 보여주는 스크린샷" width="787" height="545" data-path="images/gdk/tools/pgo_wpo.png" />
4. **링커** 노드를 확장합니다.
5. **최적화** 속성 페이지를 선택한 다음 **링크 타임 코드 생성**을 **프로필 기반 최적화 - 계측**으로 설정합니다(그림 2). **그림 2.   계측된 빌드를 위한 링크 타임 코드 생성 속성 설정.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_instrumented_build.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=03a70b82d39722d95fc1ccfef8ceb5cd" alt="계측된 빌드를 만들도록 설정된 링크 타임 코드 생성 속성 위치를 보여주는 스크린샷" width="787" height="546" data-path="images/gdk/tools/pgo_instrumented_build.png" /> \[!NOTE] 이 절차에서 설명하는 두 속성은 MSBuild에서 `/GL` 컴파일러 스위치 및 `/LTCG:PGInstrument` 링커 스위치에 해당합니다.
6. 계측된 빌드를 XBOX One 콘솔에 빌드하고 배포합니다. 타이틀이 실행되면 그림 3과 유사하게 PGO 파일이 타이틀의 일부로 배포된 것을 확인할 수 있습니다. **그림 3.   계측된 빌드로 배포된 PGO 파일.** <img src="https://mintcdn.com/microsoft-4404708b/z-rLYkO3Ax6HPtgm/images/gdk/tools/pgo_deployed_files.png?fit=max&auto=format&n=z-rLYkO3Ax6HPtgm&q=85&s=30778992c2fee2f3762bac43a8269b48" alt="배포된 PGO 파일을 보여주는 CLI 디렉터리 스크린샷" width="554" height="462" data-path="images/gdk/tools/pgo_deployed_files.png" />

## 필수 파일 배포

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 프로젝트에 추가하려면

1. **솔루션 탐색기**에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 **추가**를 선택한 다음 **기존 항목**을 선택합니다(그림 4). **그림 4.   PGO 파일을 프로젝트에 추가.** <img src="https://mintcdn.com/microsoft-4404708b/z-rLYkO3Ax6HPtgm/images/gdk/tools/pgo_add_binaries.png?fit=max&auto=format&n=z-rLYkO3Ax6HPtgm&q=85&s=7f212c1d64c1eb1ca76e4ed731fb1ef8" alt="파일을 프로젝트에 추가하는 방법을 보여주는 스크린샷" width="669" height="532" data-path="images/gdk/tools/pgo_add_binaries.png" />
2. \_C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin\_으로 이동하여 PGO 파일(*psapi.dll*)을 선택한 다음 **추가**를 선택하여 프로젝트에 파일을 추가합니다.
3. 사용하는 도구 집합에 맞게 *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*)을 선택합니다. 그런 다음 **추가**를 선택하여 파일을 프로젝트에 추가합니다.
4. **솔루션 탐색기**에서 \_pgort140.dll\_을 마우스 오른쪽 버튼으로 클릭한 다음 **속성**을 선택합니다.
5. **속성 페이지** 대화 상자에서 **구성 속성** 노드를 확장한 다음 **일반** 속성 페이지를 선택합니다.
6. **빌드에서 제외**를 **예**로 설정한 다음 **항목 형식**을 **빌드에 참여하지 않음**으로 설정합니다(그림 5). **그림 5.   PGO 파일을 빌드에서 제외.** <img src="https://mintcdn.com/microsoft-4404708b/z-rLYkO3Ax6HPtgm/images/gdk/tools/pgo_exclude_binaries.png?fit=max&auto=format&n=z-rLYkO3Ax6HPtgm&q=85&s=3ad61a9625ce53e6776c58e0f8f990d5" alt="빌드에서 PGO 파일을 제외하는 방법을 보여주는 스크린샷" width="788" height="640" data-path="images/gdk/tools/pgo_exclude_binaries.png" />

이제 PGO 파일이 *Layout* 디렉터리로 복사되어 타이틀과 함께 배포됩니다.

## 계측된 빌드를 사용한 학습

학습(training)은 PGO에서 가장 중요한 단계입니다. PGO로 얻는 성능 향상은 애플리케이션이 얼마나 잘 학습되었는지에 직접적으로 좌우됩니다. PGO의 학습 단계에서는 타이틀을 실행하면서 성능이 중요한 일반적인 시나리오를 실행합니다.

일반적인 성능 시나리오를 실행한 후, 학습 데이터를 캡처하는 PGO 아티팩트(.pgc) 파일의 수집을 시작합니다. .pgc 파일을 생성하려면 \_pgosweep.exe\_를 사용합니다(그림 6).

**그림 6.   pgosweep.exe 실행.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_run_pgosweep.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=19e5af6dae653bff3e8ff35815c156bf" alt="명령 &#x22;xbrun /x/title /O g:\pgosweep.exe Direct3DGame1.exe d:\Direct3DGame1!1.pgc&#x22;를 사용하여 pgosweep.exe가 실행되고 있는 모습을 보여주는 스크린샷" width="740" height="68" data-path="images/gdk/tools/pgo_run_pgosweep.png" />

이 예제에서는 \_Direct3DGame1!1.pgc\_라는 이름의 .pgc 파일을 만들었습니다. .pgc 파일을 만들 때 일반적으로 *titlename!#.pgc* 규칙을 사용합니다. 여기서 \_titlename\_은 실행 중인 타이틀의 이름이고 \_#\_는 이전에 만든 *titlename!#.pgc* 파일 수에 1을 더한 값입니다.

\_pgosweep.exe\_를 실행할 때마다 별도의 .pgc 파일이 만들어집니다. 이상적으로는 다양한 성능 중심 시나리오를 나타내는 여러 개의 .pgc 파일을 만들게 됩니다. .pgc 파일 생성이 끝나면 **콘솔**의 *D:\\* 디렉터리(즉, SystemScratch)에서 그림 7과 유사하게 이 파일들을 확인할 수 있습니다.

**그림 7.   순차적으로 이름이 지정된 .pgc 파일.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_pgc_files.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=9fb63ae09835246453011a1e670267e3" alt="순차적으로 이름이 지정된 세 개의 .pgc 파일 디렉터리 목록을 보여주는 스크린샷" width="509" height="204" data-path="images/gdk/tools/pgo_pgc_files.png" />

다음으로, .pgc 파일들을 .pgd 파일이라는 또 다른 PGO 아티팩트로 병합해야 합니다. .pgd 파일은 PGO의 마지막 단계인 최적화 단계에서 컴파일러에 의해 사용됩니다.

최적화를 시작하기 전에 [xbcp.exe](/tools/tools-console/commandlinetools/xbcp)를 사용하여 콘솔의 .pgc 파일들을 PC로 다시 복사합니다. .pgc 파일들은 빌드 출력 디렉터리로 복사해야 합니다. (그림 8에서 빌드 출력 디렉터리는 \_C:\temp\Direct3DGame1\Gaming.Xbox.XboxOne.x64\Release\_입니다.)

**그림 8.   .pgc 파일을 빌드 출력 디렉터리로 복사.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_pgc_file_copy.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=2968da3f83e400958c52e50eb65f5ac4" alt=".pgc 파일이 콘솔에서 빌드 출력 디렉터리로 복사되는 모습을 보여주는 스크린샷" width="651" height="129" data-path="images/gdk/tools/pgo_pgc_file_copy.png" />

## 최적화된 빌드 만들기

최적화된 빌드를 만들려면 **링크 타임 코드 생성** 속성을 **프로필 기반 최적화 - 업데이트**로 설정합니다(그림 9).

**그림 9.   최적화된 빌드를 위한 링크 타임 코드 생성 속성 설정.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_optimized_build.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=8b2cca5395984b3e25478674c66d0a6e" alt="최적화된 빌드를 만들도록 설정된 링크 타임 코드 생성 속성 위치를 보여주는 스크린샷" width="787" height="543" data-path="images/gdk/tools/pgo_optimized_build.png" />

<Note>
  이 속성은 MSBuild의 `/LTCG:PGOptimize` 링커 스위치에 해당합니다.
</Note>

타이틀을 다시 빌드하면 빌드 출력에 그림 10과 유사하게 PGO 관련 메시지가 포함됩니다.

**그림 10.   빌드 출력의 PGO 관련 메시지.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_optimized_build_output.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=67ad41198da6a7925eeca4761b438038" alt="PGO 관련 메시지가 포함된 빌드 출력의 일부를 보여주는 스크린샷" width="731" height="263" data-path="images/gdk/tools/pgo_optimized_build_output.png" />

## 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.   링크 타임 코드 생성 속성 설정.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_ltcg_new_linker_switch1.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=d5400ad2c7d5451776e58d3454a56095" alt="링크 타임 코드 생성 속성 위치를 보여주는 스크린샷" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch1.png" />

그런 다음 **명령줄** 속성 페이지의 **추가 옵션** 상자에 다음 새 링커 스위치 중 하나를 추가하여 사용합니다.

* `/FASTGENPROFILE` 또는 `/GENPROFILE`을 사용하여 PGO 프로필을 생성합니다(그림 12). 이 스위치에 대한 자세한 내용은 Microsoft Docs의 [/GENPROFILE, /FASTGENPROFILE (프로파일링 계측된 빌드 생성)](https://learn.microsoft.com/cpp/build/reference/genprofile-fastgenprofile-generate-profiling-instrumented-build)을 참조하세요. **그림 12.   PGO 프로필을 생성하도록 링커 스위치 설정.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_ltcg_new_linker_switch2.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=6d24306b34e2a2282af826c5d05e9075" alt="명령줄 속성 페이지에 /FASTGENPROFILE 링커 스위치가 추가된 모습을 보여주는 스크린샷" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch2.png" />
* `/USEPROFILE`을 사용하여 PGO 프로필 집합에 대해 최적화합니다(그림 13). 이 스위치에 대한 자세한 내용은 Microsoft Docs의 [/USEPROFILE (스레드 안전 모드에서 PGO 실행)](https://learn.microsoft.com/cpp/build/reference/useprofile)을 참조하세요. **그림 13.   PGO 프로필 집합에 대해 최적화하도록 링커 스위치 설정.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_ltcg_new_linker_switch3.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=6eb5e198e65bf9ced6af8c947c5702a0" alt="명령줄 속성 페이지에 /USEPROFILE 링커 스위치가 추가된 모습을 보여주는 스크린샷" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch3.png" />

## 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](/tools/tools-console/commandlinetools/xbconfig)의 ExtraTitleMemory 설정, [XMemTransferMemory](/reference/system/xmem/functions/xmemtransfermemory) 함수, 또는 둘 다를 사용해야 할 수 있습니다.

`/LTCG:PGInstrument` 또는 `/GENPROFILE` 대신 `/FASTGENPROFILE`을 사용하면 유사한 결과를 얻으면서도 메모리 사용량은 더 작아집니다.

\[!NOTE] 2020년 6월 GDK(및 QFE)에 포함된 버전의 PGO는 타이틀 메모리를 사용합니다. PGO는 향후 릴리스에서 도구 메모리를 올바르게 사용하도록 업데이트될 예정입니다.

## 참고 항목

[프로필 기반 최적화](/tools/tools-console/pgo/pgo) [XBOX 콘솔 게임 개발(환경 및 도구)](/tools/tools-console/gc-tools-console-toc)


## Related topics

- [프로필 기반 최적화](/ko/tools/tools-console/pgo/pgo.md)
- [XBOX 타이틀을 위한 프로파일 기반 최적화 (PGO)](/ko/tools/tools-console/pgo/index.md)
- [Visual Studio와 AI로 게임 개발 워크플로 최적화](/ko/build/core-features/graphics/overviews/presentations/xdd2024/gc-graphics-xdd-2024-gr12.md)
- [Visual Studio를 사용한 XBOX 프로젝트 디버깅](/ko/tools/tools-console/visualstudio/debugging-with-visualstudio.md)
- [XBOX 콘솔 게임 개발 환경 및 도구](/ko/tools/tools-console/gc-tools-console-toc.md)
