RecyclerView에 도입된 ItemPrefetch로 그리기 성능 향상

support-library 25.0.0 이상부터 RecyclerView의 렌더링 성능을 향상시키는 ItemPrefetch라는 기능이 추가되었습니다.

ItemPrefetch란?



RecyclerView에서는 다음과 같은 처리가 수행됩니다.


UIThread에서 View의 inflation 및 bind/Animation 등 처리

GPU의 RenderThread로 그리기

GPU의 RenderThread를 통과하는 동안 UIThread는 idle 상태로 들어갑니다.
여기서 문제가 되는 것은, 스크롤해 신규에 View를 inflate가 필요한 경우에, UIThread로 그 처리가 행해짐으로써 묘화 지연의 원인이 되는 것입니다.
25.0.0부터, ItemPrefetch가 유효하게 되어, 다음의 View의 inflation가 필요한지 어떤지를 판단해, 필요한 경우는 RenderThread로 draw중에 다음의 inflation의 준비를 실시하게 되어, 부드러운 draw가 가능합니다.

ItemPrefetch가 활성화되는 조건으로는
  • support library가 25 이상
  • Lollipop 이상의 터미널

  • 됩니다. 위의 조건을 만족하면 기본적으로 활성화됩니다. 이 처리는 ViewCache의 메모리를 여분으로 소비하는 부작용이 있으므로 OFF로 할 수 있습니다. 이 경우 LayoutManager.setItemPrefetchEnabled()를 호출하고 false를 설정합니다.
    자세한 내용은 Docs를 참조하십시오.
    htps : //에서 ゔぇぺぺr. 안 d로이 d. 코 m/레후오렌세/안 d로이 d/쑥 rt/v7/우우드게 t/레 cycぇrゃぃ에w. 아 요 t 마나게 r. html # 세치 mP 레후 t t ぇ b b d (보오 안)

    실제로 어떻게 처리가 바뀌고 있는가



    손에 RecyclerView를 사용한 목록을 준비하고 Android Monitor와 함께 제공되는 성능 측정 도구 SysTrace에서 확인했습니다.

    ItemPrefetch가 작동하지 않는 경우





    빨간색 프레임에 표시된 부분에서 알 수 있듯이 View의 inflation이 무겁기 때문에 처리에 시간이 걸립니다. 노란색 F는 Delay가 있다는 것을 Warning하고 있습니다 (다른 것이 5ms의 곳, 여기는 약 10ms 걸렸습니다)

    ItemPrefetch가 작동하는 경우





    빨간색 테두리 부분에서 알 수 있듯이 RenderThread에서 드로잉 처리를 수행하는 동안 UIThread에서 다음 View를 inflation하고 있습니다.

    요약



    아무것도 특별한 일없이 RecyclerView를 Support Library25.0.0 이상으로 올리면 자동으로 ItemPrefetch가 적용됩니다. 다만 25.0.0은 버그가 있기 때문에,
    특별한 제한이 없으면 버그 수정이 포함 된 25.0.1로 올리는 것이 좋습니다!

    좋은 웹페이지 즐겨찾기