Unity 프로파일러를 사용하여 애플리케이션을 프로파일링하는 경우 다음의 세 가지 방법으로 데이터를 기록할 수 있습니다.
애플리케이션에 대한 정확한 타이밍을 얻는 가장 좋은 방법은 퍼블리시하려는 최종 플랫폼에서 프로파일링하는 것입니다. 이렇게 하면 애플리케이션 성능에 영향을 미치는 정확한 타이밍을 확보할 수 있습니다.
하지만 성능 요소를 개선하려고 할 때마다 애플리케이션을 빌드하는 데는 많은 시간이 소모될 수 있습니다. 따라서 애플리케이션의 성능을 빠르게 평가하기 위해 에디터의 플레이 모드에서 직접 프로파일링할 수 있습니다. 플레이 모드의 프로파일링은 실제 기기에서 애플리케이션의 성능이 어떤지 정확하게 반영하지 못하지만, 최종 플랫폼에서 처음으로 프로파일링한 후 변경 사항이 애플리케이션의 성능을 향상하는지 빠르게 확인하려는 경우 유용한 툴입니다.
Unity 에디터는 플레이 모드에서 실행될 때 애플리케이션과 동일한 리소스를 사용하기 때문에 애플리케이션의 성능에 영향을 미칠 수 있습니다. 따라서 에디터를 별도로 프로파일링하여 사용하는 리소스를 결정할 수도 있습니다. 이 기능은 애플리케이션이 동영상 제작 등과 같이 플레이 모드에서만 작동하도록 설계된 경우에 특히 유용합니다.
타겟 릴리스 플랫폼에서 애플리케이션을 프로파일링하려면 타겟 기기를 네트워크에 연결하거나 케이블로 컴퓨터에 직접 연결하십시오. IP 주소를 통해 기기에 연결할 수도 있습니다. 애플리케이션은 Development Build로만 프로파일링할 수 있습니다. 이렇게 하려면 Build Settings(메뉴: File > Build Settings)로 이동한 후 애플리케이션의 타겟 플랫폼을 선택하고 Development Build 설정을 활성화하십시오. 이 설정을 활성화하면 프로파일러와 관련된 두 개의 설정, Autoconnect Profiler와 Deep Profiling Support를 이용할 수 있습니다.
Autoconnect Profiler 설정을 활성화하면 Unity 에디터는 빌드 프로세스 동안 해당 IP 주소를 빌드된 플레이어로 베이크합니다. 플레이어를 시작하면 베이크된 IP 주소에 있는 에디터의 프로파일러에 연결하려고 시도합니다.
또한 Deep Profiling Support 설정을 활성화하면 Unity는 빌드된 플레이어가 시작할 때 세부 프로파일링을 수행합니다. 즉 프로파일러가 ProfilerMarkers에 명시적으로 래핑된 코드 타이밍뿐만 아니라 코드의 모든 부분을 프로파일링합니다. 이는 애플리케이션의 시작 시간에 대한 세부 프로파일링 정보를 가져올 때 유용하지만, 빌드의 리소스 소모가 약간 더 증가합니다.
Build Settings에서 Autoconnect Profiler 설정을 활성화하지 않는 경우 애플리케이션을 실행하는 플랫폼에 수동으로 연결할 수 있습니다. 플레이어에서 애플리케이션이 실행되는 동안 프로파일러 창의 Attach to Player 드롭다운에 플레이어가 나타납니다. Attach to Player 드롭다운은 로컬 네트워크에서 실행 중인 모든 Unity 플레이어를 표시합니다. 플레이어 타입 그리고 플레이어를 실행 중인 호스트 이름(예: “iPhonePlayer (Toms iPhone)”)으로 이러한 플레이어를 식별할 수 있습니다.
또한 IP 주소를 통해 플레이어에 직접 연결할 수도 있습니다. 이렇게 하려면 Attach to Player 메뉴를 선택한 후 드롭다운에서 <Enter IP>를 선택하십시오. 그러면 다이얼로그가 나타납니다. 여기에서 IP 주소, 그리고 연결하려면 플레이어의 포트(선택 사항)를 입력할 수 있습니다.
애플리케이션에 대한 프로파일링 정보 수집을 시작하려면 드롭다운 메뉴에서 플레이어를 선택한 후 Record를 클릭하십시오. 애플리케이션이 실행 중인 동안 데이터를 연속으로 수집하려면 Player Settings(메뉴: Edit > Project Settings > Player > Resolution and Presentation)에서 Run In Background 설정을 활성화하십시오. 이 설정을 활성화하면 애플리케이션이 백그라운드에서 실행되도록 두더라도 프로파일러는 데이터를 계속 수집합니다. 이 설정을 비활성화하면 애플리케이션이 활성 창에서 실행 중일 때에만 데이터를 수집합니다.
각 플랫폼은 Unity 프로파일러에 연결할 때 다른 방식으로 작동합니다. 다음 섹션에서는 각 플랫폼의 몇 가지 일반적인 동작에 대한 지침을 제공합니다.
WebGL에서 Unity 프로파일러를 사용할 수 있지만, 에디터를 통해서는 WebGL로 빌드된 실행 중 플레이어에 연결할 수 없습니다. WebGL은 WebSocket을 커뮤니케이션에 사용하므로 브라우저 쪽에서 수신 연결을 허용하지 않기 때문입니다. 실행 중인 플레이어에 연결하려면 Build Settings(메뉴: File > Build Settings)의 Autoconnect Profiler 체크박스를 활성화해야 합니다. Unity는 WebGL에 대한 드로우 콜을 프로파일링할 수 없습니다.
iOS 및 Android 기기 모두 네트워크를 통한 원격 프로파일링을 지원합니다. 방화벽을 사용하는 경우 방화벽의 아웃바운드 규칙에서 54998 - 55511 포트를 여십시오. Unity는 이 포트들을 원격 프로파일링에 사용합니다.
때때로 원격 프로파일링을 설정하면 Unity 에디터가 기기에 자동으로 연결되지 않을 수 있습니다. 이 경우 프로파일러 연결을 수동으로 초기화할 수 있습니다. 이렇게 하려면 프로파일러 창에서 Attach to Player 드롭다운 메뉴를 선택한 후 적절한 기기를 선택하십시오.
또한 네트워크 또는 연결 문제를 피하기 위해 대상 기기를 컴퓨터에 직접 연결할 수도 있습니다.
iOS 기기에서는 원격 프로파일링을 활성화하려면 다음 절차를 따르십시오.
Android 기기는 WiFi 또는 Android 디버그 브리지(adb)를 통한 두 가지 원격 프로파일링 방식을 지원합니다.
WiFi로 프로파일링하려면 다음 절차를 따르십시오.
참고: 기기를 인식할 수 있으려면 Android 기기와 Unity 에디터를 실행하는 호스트 컴퓨터가 모두 동일한 서브넷에 있어야 합니다.
Android 디버그 브리지(adb) 프로파일링의 경우 다음 절차를 따르십시오.
Build & Run을 선택하면 Unity 에디터는 애플리케이션을 위한 adb 터널을 자동으로 생성합니다. 다른 애플리케이션을 프로파일링하거나 adb 서버를 다시 시작하려면 이 터널을 수동으로 설정해야 합니다. 이렇게 하려면 터미널 창 또는 커맨드 프롬프트를 열고 다음을 입력하십시오.
USB 케이블을 통해 에디터-Android 연결이 설정된 경우 필요
`adb forward tcp:34999 localabstract:Unity-{여기에 번들 식별자 삽입}
USB 케이블을 통해 Android-에디터 연결이 설정된 경우 필요
adb reverse tcp:34998 tcp:34999
Android 빌드에서 세부 프로파일링을 사용하려면 Android 플레이어 설정(메뉴: Edit > Project Settings > Player > Android > Other Settings)에서 Mono Scripting Backend 설정을 활성화한 후 다음을 입력하여 adb 커맨드를 통해 게임을 시작해야 합니다.
~$ adb shell am start -n {insert bundle identifier here}/com.unity3d.player.UnityPlayerActivity -e 'unity' '-deepprofiling'
Unity cannot automatically discover Chrome OS devices. To initiate a connection, connect to the device through Android Debug Bridge (adb) by its IP address and then select <Enter IP>
from the Attach to Player drop-down menu and enter the device’s IP address. Once you have connected, you can profile your application as usual.
프로파일러 창을 사용하여 에디터에서 애플리케이션을 실행하고 프로파일링하는 경우 타겟 플랫폼이 애플리케이션을 실행할 때의 대략적인 애플리케이션 동작을 결과로 보여줍니다. 플레이 모드는 에디터와 동일한 프로세스로 실행되므로 애플리케이션의 CPU, GPU 및 메모리 사용량 데이터를 Unity 에디터의 사용량 데이터와 완벽하게 분리할 수 없습니다. 이로 인해 결과 프로파일링 데이터가 왜곡됩니다.
더 나은 프로파일링 결과를 얻으려면 항상 타겟 기기에서 애플리케이션을 프로파일링하고, 기기에서 이미 식별한 문제에 대해 빠르게 반복 작업을 수행하려면 에디터에서만 프로파일링해야 합니다.
또한 플레이 모드에서 프로파일링하거나 에디터를 프로파일링하여 애플리케이션의 성능과 관련이 없는 문제(예: 긴 로드 시간 또는 응답 없는 에디터로 인해 반복 속도가 느려지는지 여부, 또는 애플리케이션이 플레이 모드에서 제대로 동작하지 않는지 여부)를 식별할 수도 있습니다.
에디터에서 프로파일링할 때마다 최대화된 뷰에서 플레이 모드를 열고 열려 있는 에디터 창의 개수를 줄여야 합니다. 이렇게 하면 다른 에디터 창이 렌더 스레드 및 GPU에서 시간을 소비하지 않으므로 성능 데이터에 영향을 줍니다. 플레이 모드가 최대화된 뷰에서 열리면 타겟 기기의 해상도에 더 가까운 해상도로 애플리케이션을 실행합니다. 이는 필레이트와 관련된 성능 문제에 직접적인 영향을 줍니다.
프로파일러의 기본 타겟은 플레이 모드이며, 에디터가 플레이 모드에서 실행 중일 때의 활동을 기록합니다. 플레이 모드 프로파일링은 플레이어를 다시 빌드하지 않고 변경 사항을 빠르게 테스트할 때 유용하지만, 애플리케이션의 타겟 플랫폼 및 기기에서 빌드를 확인하기 위한 대체 옵션으로 사용해서는 안 됩니다. 이는 플레이 모드가 에디터와 동일한 애플리케이션과 메인 스레드에서 실행되기 때문입니다. 즉 플레이 모드에서 프로파일링하면 UI, 인스펙터, 씬 뷰 렌더링, 에셋 관리 등과 같은 에디터의 시스템이 애플리케이션의 성능 및 메모리 프로파일링 측정에 영향을 줍니다.
플레이 모드에서 효과적으로 프로파일링하려면 정기적으로 애플리케이션 빌드를 만들어 다양한 타겟 기기(고사양 및 저사양 기기 모두)에 배포하고, 이러한 기기에서 애플리케이션을 테스트 및 프로파일링해야 합니다. 이러한 기기에서 애플리케이션의 성능 문제를 식별하는 경우 가장 주의가 필요한 영역으로 범위를 좁히십시오.
그런 다음 플레이 모드에서 애플리케이션을 프로파일링하고 애플리케이션의 변경 사항에 대한 반복 작업을 빠르게 수행할 수 있습니다. 타겟 기기에서 애플리케이션을 프로파일링하여 얻은 정보를 사용하여 플레이 모드에서 애플리케이션을 프로파일링한 후 유사한 동작이 있는지 확인할 수 있습니다. 그러고 나서 플레이 모드에서 애플리케이션과 프로파일을 다시 변경한 후 변경한 효과를 빠르게 확인할 수 있습니다. 변경 사항에 만족하면 애플리케이션을 빌드하고 타겟 기기에 다시 배포하여 변경 사항을 확인하십시오.
플레이 모드를 실행하는 동안 에디터가 생성하는 프로파일링 데이터의 노이즈와 잘못된 측정을 줄이기 위해 CPU 및 GPU 프로파일러 모듈은 타이밍을 PlayerLoop에서 발생하는 타이밍과 EditorLoop에서 발생하는 타이밍으로 분할합니다. Unity는 PlayerLoop 및 EditorLoop 마커를 사용하여 이러한 타입의 프로파일러 샘플을 할당합니다.
프로파일러가 플레이 모드를 대상으로 하는 경우 PlayerLoop 내부에서 발생한 타이밍 샘플만 수집합니다.
Unity는 CPU 프로파일러 모듈 차트에서 모든 EditorLoop 샘플을 Others로 분류합니다. 그 결과, EditorLoop 샘플은 해당 카테고리에 가장 크게 기여합니다. 이때 에디터가 수행하는 작업을 확인하고 Others 카테고리에 기여하는 상세한 분석 데이터를 얻으려면 프로파일러 타겟을 에디터로 변경하십시오.
중요: 세부 프로파일링을 사용하고 플레이 모드를 대상으로 하는 경우 PlayerLoop와 EditorLoop 둘 다에서 발생하는 모든 함수 호출에 성능 영향을 미칩니다. 이는 세부 프로파일링이 도메인 재로드 시 스크립팅 메서드의 시작 및 끝 부분에 연결되고, PlayerLoop에서 호출되지 않는 부분을 감지하지 않기 때문입니다. EditorLoop에서 발생하는 메서드 호출은 샘플 생성의 전체 오버헤드를 유발하지 않지만, 샘플을 방출해야 하는지 계속 확인하므로, 작은 오버헤드를 여전히 발생시킵니다.
프로파일러의 타겟을 Editor로 변경하면 이전에 EditorLoop 마커 아래에 숨겨져 있던 모든 샘플이 해당 카테고리에 기여합니다. 즉 CPU 프로파일러 모듈의 세부 정보 창과 해당 차트에 있는 정보가 크게 변경됩니다.
에디터의 시작 시간을 프로파일링하려면 -profiler-enable
커맨드 라인 옵션을 사용하여 에디터를 시작하십시오.
프로파일러 창이 에디터 성능에 미치는 영향을 줄이려면 자체 프로세스에서 프로파일러 창을 여는 스탠드얼론 프로파일러를 사용하십시오. 이는 에디터를 프로파일링 타겟으로 선택하거나 애플리케이션에 대해 세부 프로파일링을 수행하는 경우 특히 유용합니다. 프로파일러 창 자체가 일반적으로 성능 데이터를 왜곡할 수 있는 리소스를 사용하기 때문입니다.
애플리케이션을 프로파일링하는 경우 여러 프로파일링 세션에서 일관성을 보장하고 Unity가 사용하는 프로세스가 프로파일링 데이터에 영향을 미치지 않도록 하기 위해 다음과 같은 몇 가지 작업을 수행할 수 있습니다.