[Xamarin.Forms] Fast Renderer

2019. 6. 4. 15:25Mobile/Xamarin

초창기 Xamarin.Forms 컨트롤 렌더러들은 안드로이드에서 컨트롤 마다 2개의 View를 생성했습니다. 예를들어 Xamarin.Forms에서 Button, Label을 작성하고 안드로이드에서 실행하면 다음과 같이 컨트롤 마다 2개의 View를 생성했습니다.

  • 네이티브 컨트롤: Button, TextView 등
  • ViewGroup 컨테이너: 레이아웃 작업, Gesture 처리, 기타 작업 등을 처리

이러한 동작구조로 인해 Xamarin.Forms 앱을 안드로이드에서 실행할 경우 추가적인 성능저하가 나타났습니다. 각각의 논리 컨트롤 마다 2개의 View를 생성하기 때문에 더 복잡한 Visual Tree가 생성되고 화면에 렌더링되는데 더 많은 메모리와 처리량이 필요했습니다.

Fast Renderer는 Xamarin.Forms 컨트롤이 렌더링되는데 필요한 비용과 View의 수를 줄여줍니다. 2개의 View를 생성하여 View Tree에 추가하던 방식에서 단지 1개의 View만 생성하는 방법을 사용하도록 변경되었습니다. 더 적은 오브젝트를 생성함으로써 성능이 개선되고 더 적은 View Tree와 더 적은 메모리를 사용하게 됩니다. (또한 더 적은 Garbage Collection이 발생함으로 앱이 잠시 멈추는 현상도 줄어들게 됩니다)

Fast Renderer는 안드로이드 환경에서 다음과 같은 Xamarin.Forms 컨트롤에 사용됩니다.

이러한 Fast Renderer들은 종전의 렌더러와 비교해서 기능상의 차이가 없습니다. Xamarin.Forms 4.0부터 ForAppCompatActivity를 타겟으로하는 모든 앱은 Fast Renderer를 기본적으로 사용하게 됩니다. ImageButton과 CollectionView와 같은 새로운 컨트롤을 위한 렌더러도 Fast Renderer 접근법을 사용하여 개발되었습니다.

Fast Renderer를 사용할 때 얻는 성능 향상은 레이아웃의 복잡성에 따라 달라지기 때문에 앱마다 차이가 있을 수 있습니다. 예를들어 ListView가 수천개의 데이터 행을 출력하고 각 셀은 Fast Renderer를 사용하는 컨트롤로 구성할 경우 성능이 2배 가까이 차이날 수 있으며 시각적으로 더 부드러운 스크롤을 보여주게 됩니다.

참고
구형 Renderer에서 사용하던 접근법을 사용하여 Fast Renderer를 위한 Custom Renderer를 제작할 수 있습니다. 자세한 정보는 Custom Renderer를 참고하세요.

하위 호환성

다음 상황에서는 Fast Renderer가 아닌 다른 렌더러를 사용하게 됩니다.

  1. 안드로이드 프로젝트의 MainActivity 클래스에서 Forms.Init 코드 이전에 다음 코드를 추가하는 경우, 종전 Renderer를 사용하게 됩니다.
    Forms.SetFlags("UseLegacyRenderers");
  2. Fast Renderer 이전에 만들어 졌던 Custom Renderer들은 종전의 Renderer을 사용합니다.
  3. View.Visual에 특정 값을 할당하는 경우(예를들어 Material), 다른 렌더러를 사용합니다. Material Visual에 대해서 자세한 정보를 확인하시려면 Xamarin.Forms Material Visual을 확인해주세요.

관련 링크