출처: http://dalinaum-kr.tumblr.com/post/19629843795/android-display-list
안드로이드 3.0(허니컴)부터 렌더링 부분이 많이 향상되었습니다. 하드웨어 가속이라는 특성도 그 중의 하나이죠.
또 다른 변화 중 하나는 디스플레이 리스트가 추가된 점입니다. 진저브레드까지 안드로이드는 변화를 전파하는 모델을 가지고 있었습니다.
이런 모델은 변경 사항을 ViewRoot까지 전파하는 문제가 있었습니다.
전파되어 올라간 후 다시 아래로 내려오면서 그려야 합니다.
이런 모델은 하나의 뷰 변경이 꽤 많은 코드를 접근하게 하여 비효율적이었습니다.
하나의 뷰를 다시 그리기 위한 정보가 상단의 유아이 요소까지 올라가야만 얻을 수 있기 때문에 변경 내역을 전파하고
다시 그려야만 했습니다. 이 비효율에 대한 대안은 디스플레이 리스트를 사용하는 것입니다.
뷰가 위와 같은 목록을 가짐에 따라 갱신하는 과정은 매우 간단합니다.
디스플레이 리스트는 각 UI요소를 그리기 위한 정보를 리스트로 모아둔 것입니다. UI 요소의 변경이 발생했을 때 위로 올라갈 필요가 없습니다. 그냥 해당 UI 요소의 디스플레이 리스트를 확인하고 사용하면 됩니다. 그리기 위해 필요한 정보가 한 곳에 모여있습니다.
더 깊은 내용을 알고 싶은 분들을 위해 조금 더 내려가겠습니다.
- 디스플레이 리스트는
DisplayList
와GLES20DisplayList
객체를 구현되어 있습니다. DisplayList
는 추상 객체로 녹화의 시작과 끝을 지정할 수 있습니다.GLES20DisplayList
는 구체화된 객체로 화면 구성을 위한 비트맵 등의 리소스를 가지고 있습니다.GLES20DisplayList
는 녹화의 시작(start()
)에GLES20RecordingCanvas
를 생성하여 반환합니다.GLES20RecordingCanvas
는GLES20Canvas
의 자식 클래스로 풀(pool)을 만들어 자신을 관리합니다.GLES20RecordingCanvas
는GLES20DisplayList
의 비트맵 리스트에 접근할 수 있습니다.GLES20Canvas
는DisplayRenderer
를 생성합니다.DisplayRenderer
는 뷰를 위한 그림 연산들을 순차적인 목록으로 보관합니다.DisplayRenderer
는 다시 뷰를 그릴 (replay()
) 수 있습니다.DisplayRenderer
는OpenGLRenderer
를 사용하여 하드웨어 가속을 사용합니다.DisplayRenderer
와OpenGLRenderer
는 상속관계가 아닙니다.OpenGLRenderer
가 GPU를 사용하여 실제 렌더링을 합니다. (SKIA의 간소화된 버전)
코드는 아래 디렉토리에서 확인하십시요.
frameworks/base/core/java/android/view
frameworks/base/core/jni/android
frameworks/base/core/jni/android/graphics
frameworks/base/libs/hwui
이 글의 이미지는 Romain Guy와 Chet Haase의 Google I/O 2011 Android Accelerated Rendering에서 발췌하였습니다.
'IT_Programming > Android_Java' 카테고리의 다른 글
[Android/안드로이드] Service 고급정보. (0) | 2012.05.22 |
---|---|
[Android] XML로 Shape Drawable 만들기 (0) | 2012.05.21 |
[펌_Android] 어플 종료에 대한 실험 + @ (0) | 2012.03.19 |
Android Thread Constructs: Comparisons (0) | 2012.03.12 |
Android ListView 안에 있는 여러 개의 Button 처리 (0) | 2012.03.08 |