Main Loop 성능 튜닝

원하는 프레임 속도의 설정

Unity iOS는 사용자가 일 초에 사용자의 어플리케이션이 얼마나 많이 그것의 랜더링 루프를 실행하려고 할 지를 조정하도록 합니다. 기본적으로 초당 30번 입니다. 이 숫자를 낮추는 것에 의해 사용자의 어플리케이션은 더 많은 배터리 파워를 아낄 것이나 초당 더 적은 프레임을 랜더링 할 것입니다. 이 값을 증가하는 것에 의해 랜더링은 터치 입력과 가속계 프로세싱과 같이 다른 활동들을 통해 우선시되어질 것입니다. 사용자는 프레임 속도 선택과 함께 실험할 필요가 있을 것이고 사용자 스스로 그것이 사용자의 특정 게임에서 가지는 효과를 결정할 필요가 있을 것입니다.

사용자의 어플리케이션이 계산적이거나 또는 무겁게 랜더링 되고 있고 초당 오직 15 프레임만을 말하도록 유지할 수 있다면 15를 통해서 원하는 프레임 속도를 설정하는 것은 적합하지 않습니다. 첫 째로 사용자는 사용자의 어플리케이션을 최적화할 필요가 있습니다. 그 후에 원하는 프레임 속도를 증가할 필요가 있습니다.

원하는 프레임 속도를 설정하기 위해 Unity iOS 에 의해 생성되는 사용자의 XCode 프로젝트를 열고AppController.mm 파일을 선택합니다.

#define kFPS 30

…위의 라인이 현재의 프레임 속도를 결정합니다. 그러면 사용자는 원하는 값을 설정하기 위해 변화만 주면 됩니다. 예를 들어, define 을:-

#define kFPS 60

…위와 같이 바꾼 경우 어플리케이션이 30 FPS 대신에 60 FPS 로 랜더링 것입니다.

랜더링 룹(Rendering Loop)

iOS 버전 3.1 혹은 그 이후 버전이 사용될 경우, Unity는 랜더링 룹(rendering loop)을 스케줄 하기 위해 CADisplayLink 클래스를 사용할 것 입니다. 3.1 이전의 버전은 룹을 처리하기 위해 여러 폴백(fallback) 방법 중 하나를 사용하여야 합니다. 하지만 폴백 방법은 iOS 3.1에서도 아래 라인을 변경하여 활성화 할 수 있습니다.

#define USE_DISPLAY_LINK_IF_AVAILABLE 1

…이를 다음으로 변경

#define USE_DISPLAY_LINK_IF_AVAILABLE 0

폴백 룹(Fallback Loop)의 유형

Apple은 3.1. 이전 버전의 iOS에서 랜더링 작업을 스케줄링 할 경우 시스템 타이머를 사용할 것을 권장하고 있습니다. 이 방법은 성능이 중요하고 랜더링의 성능보다는 배터리의 수명과 이벤트의 정확한 처리를 선호하는 응용프로그램에는 바람직합니다. 하지만, 게임에서는 종종 더 나은 랜더링 성능이 중요하므로, Unity는 랜더링 룹의 성능을 조정할 수 있는 몇 가지 스케줄링 방법을 제공합니다:-

  • _시스템 타이머:_ 이는 Apple이 권유하는 표준 접근법입니다. 이는 랜더링을 스케줄 하는데 NSTimer 클래스를 사용하고 최악의 랜더링 성능을 보여주지만 모든 입력 이벤트가 모두 처리되는 것은 보장하고 있습니다.
  • _스레드(Thread):_ 랜더링의 스케줄을 위해 별도의 스레드를 사용합니다. 이는 NSTimer 접근법보다 더 나은 랜더링 성능을 보여주나, 가끔 접촉(touch)이나 가속계(accelerometer) 이벤트를 놓치는 경우가 있습니다. 이 스케줄 방법은 또한 설정이 가장 쉬우며 버전 3.1. 이전의 iOS에서 기본적으로 사용한 방법입니다.
  • _이벤트 펌프(Event Pump):_ 이 방법은 이벤트를 가져오기 위해 CFRunLoop 오브젝트를 사용합니다. 이는 NSTimer 접근법보다 더 나은 랜더링 성능을 보여주며 또한 접촉(touch)와 가속계(accelerometer) 이벤트를 처리하는 데 OS가 걸릴 시간의 양을 설정할 수 있게 해 줍니다. 이 옵션은 조심해서 사용해야 한데, 접촉(touch)와 가속계(accelerometer) 이벤트를 처리하는 데 필요한 처리 시간이 충분치 않다면 이들을 분실할 수 있기 때문입니다.

AppController.mm 파일에서 설정을 변경함으로써 다양한 폴백(fallback) 룹 타입을 선택할 수 있습니다. 주요 라인은 다음과 같습니다:-

#define FALLBACK_LOOP_TYPE NSTIMER_BASED_LOOP
#define FALLBACK_LOOP_TYPE THREAD_BASED_LOOP
#define FALLBACK_LOOP_TYPE EVENT_PUMP_BASED_LOOP

해당 파일은 이 라인 중 하나만 남기로 코멘트로 제외해야 합니다. 코멘트 되지 않은 라인에서 해당 응용프로그램이 사용 할 랜더링 룹 방법이 선택됩니다.

사용자가 NSTimer 방법으로 입력 프로세싱에 대한 우선순위화 된 랜더링을 원한다면, 사용자는 다음 라인을 찾아 변경해야 합니다.

#define kThrottleFPS 2.0

… AppController.mm 내에서. 이 숫자를 증가하면 랜더링에 더 높은 우선순위를 부여할 것 입니다. 이 숫자를 변경하면 그 결과는 응용프로그램마다 다르므로, 사용자가 자신의 케이스에 직접 시도하여 결과를 확인하는 것이 최상의 방법일 것 입니다.

사용자가 이벤트 펌프(Event Pump) 랜더링 룹을 사용한다면, kMillisecondsPerFrameToProcessEvents 상수를 정확하게 조정하여 원하는 반응을 획득할 필요가 있습니다. kMillisecondsPerFrameToProcessEvents 상수는 사용자가 OS에게 정확히 얼마만큼의 시간을(millisecond 단위) 허용할 지를 명시하게 합니다. 이 작업에 대해 사용자가 부족한 시간을 할당하면, 접촉(touch)와 가속계(accelerometer) 이벤트를 분실할 수 있고, 응용프로그램은 빨리 동작할 지라도 반응도는 떨어질 것입니다.

이벤트의 처리에 OS가 사용할 시간의 양(millisecond 단위)을 명시하려면, 다음 라인을 찾아서 변경합니다.

#define kMillisecondsPerFrameToProcessEvents 7.0

… AppController.mm 내에서.

가속계(Accelerometer) 처리 횟수의 튜닝

만일 가속계(Accelerometer)의 입력이 너무 자주 처리되면 결과적으로 사용자 게임의 전체적인 성능은 악화될 것입니다. 기본값으로, Unity iOS 응용프로그램은 초당 60회 가속계를 샘플링 할 것 입니다. 이 가속계 샘플링 횟수를 줄이면 성능향상이 보여질 것이고 가속계 입력을 사용하지 않을 경우 0으로 설정할 수 도 있습니다. 가속계의 횟수는 iOS Player SettingsOther Settings 패널에서 변경할 수 있습니다.

역링크