프로파일러(프로용) (Profiler (Pro only))

유니티 프로파일러는 게임을 최적화 할 수 있도록 돕습니다. 게임의 다양한 영역에서 얼마나 많은 시간이 소모되었는지 알립니다. 예를 들어, 렌더링, 애니메이션, 게임로직에서 소모된 시간의 각 비율을 나타냅니다.

에디터에서 프로파일링을 켜고 게임을 할 수 있고, 이는 성능 데이터를 기록 할 것입니다. 프로파일러 창은 타임라인에 데이터를 표시하여서, 프레임들이나 영역에서 다른곳들에 비해서 더 뾰족하게 솟아오른 지점(더 많은 시간이 걸림)을 찾을 수 있습니다. 타임라인 주변을 클릭하면, 프로파일러 창의 바닥 부분에서 선택한 프레임의 세부 정보를 표시할 수 있습니다.

프로파일링은 코드를 instrument 해야 합니다. 인스트루먼트 하는 것은 게임의 성능에는 아주 작은 영향을 줍니다. 이 오버헤드는 게임의 프레임레이트(framerate)에 영향을 주지 않을 정도로 작습니다. 프로파일링을 사용할 때는, 특정 지역들에서 소모된 시간의 퍼센트 비율을 주료 고려합니다. 그리고, 성능 향상을 위해서 대부분의 시간을 소모하는 게임의 특정 부분에 집중합니다. 프로파일링 결과를 코드 변화 전과 후에 비교해서, 측정된 향상 등을 정합니다. 때로는, 성능 향상을 위해서 만든 변화들이 프레임 비율에 0오히려 부정적인 영향을 보일 수 있습니다. 코드 최적화의 예상치 못한 결과들도 예견되어야 합니다.


프로파일러 창

유니티 플레이어들 부착

다른 디바이스에서 실행되는 게임 또는 다른 컴퓨터에서 실행중인 플레이어를 프로파일 하기 위해서는, 에디터를 해당 플레이어에 연결할 수 있습니다. 드롭다운 _Active Profiler_ 메뉴는 지역 네트워크에서 실행중인 플레이어를 보입니다. 이들 플레이어들은 플레이어 종류와 "iPhonePlayer (Toms iPhone)" 플레이어를 실행중인 호스트(host) 이름으로 확인됩니다. 플레이어에 접속할 수 있도록 하기 위해서는, 플레이어는 _Build Settings_ 대화 창에 발견되는 _Development Build_ 체크박스와 실행시켜야 합니다. 여기서, 에디터와 플레이어를 시작 시 자동연결(Autoconnect)하도록 만들기 위해, 체크박스를 표시한 것이 가능합니다.

Profiler Controls

프로파일러 컨트롤들은 창의 위쪽에 툴바에 있습니다. 이를 사용하여, 프로파일링을 켜거나 끄시고, 프로파일된 프레임등 들을 통하여 네비게이션(navigation)을 하시면 됩니다. 전송(transport) 컨트롤들은 툴바의 오른쪽 맨 끝에 있습니다. 게임이 실행되고, 프로파일러가 데이터를 모을 때, 이 전송 컨트롤 중 하나라도 클릭하면, 게임을 멈추게 됩니다. 컨트롤들은 처음의 저장된 프레임으로 가서, 한 프레임을 뒤로 물러나게 하고, 한 프레임을 앞으로 움직이게 하며, 마지막 프레임으로 이동합니다. 프로파일러는 모든 저장된 프레임들을 보유 하지 않습니다. 그래서 first 프레임의 개념은 메모리에 여전히 보유된 가장 오래된 프레임으로 생각될 수 있습니다. "current" 전송버튼은 프로파일 통계 창이 실시간으로 모은 데이터를 표시하게 합니다.

Deep Profiling

Deep Profile을 켜게 되면, all 스크립트 코드가 프로파일 됩니다. 즉 모든 함수호출이 저장됩니다. 이는 게임코드에서 정확하게 어디서 시간이 소모되었는지 아는데 유용합니다.

딥 프로파일링은 _매우 큰 오버헤드_ 를 야기하고, 많은 메모리를 사용하여, 게임이 프로파일 중 매우 늦게 실행됩니다. 만약, 복잡한 스크립트 코드를 사용하면, 딥 프로파일링은 전혀 가능하지 않을 수 있습니다. 딥 프로파일링은 간단한 스크립팅의 작은 게임을 위해서는 충분히 빨리 작동합니다. 만약 전체 게임을 위한 딥 프로파일링이 프레임 비율의 감소를 야기하여 게임이 간신히 실행되면, 이 접근법을 사용하지 않는 것을 고려하고, 아래의 접근법을 생각해봐야 합니다. 게임을 디자인하고 주요 기능들을 가장 잘 구현하는 방법을 선택할 때, 딥 프로파일링이 더 유용할 수 있습니다. 큰 게임들에겐, 딥 프로파일링이 유니티로 하여금 메모리를 소진하게 하므로, 이런 이유로, 딥 프로파일링이 가능하지 않을 수 있습니다.

스크립트 코드 블록들의 수동 프로파일링은 딥 프로파일링 보다 더 작은 오버헤드를 나타낼 것입니다. 코드 섹션들 주위의 프로파일링을 가능하게 하거나 불가능하게 하기 위해서 Profiler.BeginSampleProfiler.EndSample 스크립트 함수 등을 사용하십시오.

싱크 타임 보기(View SyncTime)

고정된 프레임 비율이나 수직 공백(vertical blank)과 싱크(sync)를 맞춰 실행할 때, 유니티는 "Wait For Target FPS"에서의 대기 시간(waiting time)을 기록합니다. 디폴트로 이 시간은 프로파일러에는 보여지지 않습니다. 얼마나 많은 대기 시간이 소모되었는지 보기 위해서는, "View SyncTime"를 토글(toggle) 할 수 있습니다. 프레임들을 이완(loose)시키기 전에 얼마나 많은 헤드룸(headroom)을 가지고 있는지의 측정이기도 합니다.

Profiler Timeline

프로파일러 창의 윗부분은 시간에 따른 성능데이터를 표시합니다. 게임을 실행할때, 데이터는 프레임 별로 저장되고, 지난 몇 백 프레임들의 히스토리(history)가 표시됩니다. 특정 프레임을 클릭하면, 창의 아래 부분에 세부사항들이 표시됩니다. 어떤 타임라인 지역이 현재 선택되었는지에 따라 다른 세부사항들이 표시됩니다. 타임라인의 수직 스케일은 자동으로 관리되고, 창의 수직 스페이스를 채우려고 할 것입니다. CPU사용 영역 등의 세부사항을 얻으려면, 메모리와 렌더링 지역들을 제거할 수 있습니다.

그리고, 타임라인과 통계 영역 사이의 분할자(splitter)는 타임라인 차트로 사용되는 스크린 영역을 증가시키기 위해서, 선택되고, 아래로 드래그 될 수 있습니다.

타임라인은 몇몇 영역으로 구성됩니다: CPU 사용(CPU Usage), 렌더링(Rendering) 그리고 메모리(Memory) 영역입니다. 이들 영역은 패널(panel)에서 “close” 버튼을 클릭해 제거 되며, 프로파일 컨트롤 바의 Add Area 드롭 다운으로 재 추가 될 수 있습니다.

CPU 사용 영역

CPU 사용 영역은 게임에서 경과된 시간을 표시합니다. 선택되면, 아래쪽 페인(pane)에서 선택된 프레임의 계층 시간 데이터를 표시합니다.

  • _ 계층 구조 모드 (Hierarchy mode):_ 계층 구조의 시간 데이터를 표시합니다.
  • _ 그룹 계층 구조 모드 (Group Hierarchy mode):_ 시간 데이터를 논리적 그룹(렌더링, 물리, 스크립트들 등)으로 나눕니다. 어떠한 그룹의 자식들은 다른 그룹에 있을 수 있으므로(예: 몇몇 스크립트는 렌더링 함수를 호출 가능), 그룹들의 시간 비율은 종종 합계가 100%를 넘어 갑니다. (이는 소프트웨어 오류/버그 가 아닙니다.)

CPU 차트가 쌓이는 식은 단순히 차트 라벨을 위 아래로 드래그 해서 재 배치가 가능합니다.

아이템이 아래쪽 페인(pane)에서 선택되면, CPU 차트에서의 기여도는 하이라이트 처리됩니다 (나머지는 희미하게 처리). 아이템을 다시 클릭하고, 선택을 해제하십시오.


Shader.SetPass 는 선택되었고, 기여도는 차트에서 하이라이트 처리되었습니다

계층 구조 시간 데이터에는 셀프 타임(self time)은 특정함수에서의 소모된 시간을 의미하며, 서브함수들을 부르는 시간은 포함 하지 않습니다. 위의 스크린샷에서, 51.2%의 시간이 Camera.Render 함수에서 소모되었습니다. 이 함수는 많은 일을 하고, 다양한 드로잉과 컬링(culling) 함수들을 호출 하였습니다. 이들 함수를 제외하면, 0.8%의 시간이Camera.Render 함수에서 실제로 소모되어졌습니다.

렌더링 영역(Rendering Area)

렌더링 영역은 렌더링 통계를 표시합니다. 그리기 호출과 삼각형들, 그리고 렌더된 꼭지점들의 개수들이 타임라인에서 그래픽으로 처리되어 표시됩니다. 아래쪽 패인(pane)은 더 많은 렌더링 통계를 표시하고, 이들은 게임보기의 Rendering Statistics 창에서 보여진 것들과 가깝게 매치(match)됩니다.

메모리 영역(Memory Area)

메모리 영역은 몇몇 메모리 사용 데이터를 표시합니다:

  • Total Allocated 전체 할당량(Total Allocated)은 어플리케이션에 의해 사용된 전체RAM 양입니다. 유니티 에디터에서는 이는 에디터에서의 모든 것들에 의해 사용되는 메모리라는 점에 유의하십시오.
  • Texture Memory 질감 메모리는 현재 프레임에서의 질감들에 의해 사용되는 비디오 메모리들의 양입니다.
  • Object Count 오브젝트 카운트는 생성된 오브젝트들의 총 개수 입니다. 이 수가 시간에 따라 증가되면, 이는 게임 내에서 파괴되지 않는 몇몇 오브젝트들이 생성됨을 의미합니다.

Audio

오디오 영역(Audio Area)

오디오 영역은 오디오 통계를 표시합니다:

  • Playing Sources은 특정 프레임 내 장면에서의 총 재생 소스입니다. 오디어가 과부하(overload)가 걸리면, 이를 주시하십시오.
  • Paused Sources은 특정 프레임 내 장면에서 총 멈춘 소스들입니다.
  • Audio Voice는 실제 사용된 오디오 (FMOD channels) 보이스 들의 개수입니다. “PlayOneShot”는 소스 재생들에서 보여지지 않은 보이스들을 사용합니다.
  • Audio Memory는 오디오 엔진에 의해 사용되는 총 RAM 양입니다.

CPU 사용은 아래 부분에서 살펴보실 수 있습니다. 오디오만으로도 너무 많은 CPU를 차지 한다면 이를 주시하시길 바랍니다.

아래 참조

iOS

리모트 프로파일링(Remote profiling)은 다음의 스텝들에 의해서 iOS에 가능화 됩니다:

  1. iOS디바이스를 WiFi 네트워크에 연결하십시오. (로컬/임시(adhoc) WiFi 네트워크는 디바이스로부터의 프로파일링 데이터를 유니티 에디터로 보내기 위해서 프로파일에 의해 사용됩니다.)
  2. 유니티의 빌드 설정(build setting) 대화창의 "Autoconnect Profiler" 체크박스를 표시하십시오.
  3. 디바이스를 맥에 케이블로 부착하여 유니티 에디터의 "Build & Run"를 클릭하세요.
  4. 어플리케이션이 디바이스에서 실행할 때, 유니티 에디터의 프로파일러 창을 여십시오.(Window→Profiler)

_주의:_ 가끔 유니티 에디터는 디바이스로 자동 커넥트(autoconnect) 못할 수도 있습니다. 그런 경우는, 해당 디바이스를 선택하고 프로파일러 창에서 Active Profiler 드롭 다운 메뉴로부터 프로파일러 접속이 시작될 수 있습니다.

역링크