Window Backgrounds & UI Speed
일부 안드로이드 어플리케이션들은 UI toolkit을 뛰어넘는 성능을 요구되며 그렇게 하기 위한 몇 가지 방법이 있다. 이 문서에서 당신은 그리기와 액티비티가 화면에 보여지는 시간을 빠르게 하는 방법을 발견하게 될것이다. 이 두가지 기술은 모두 윈도우의 백그라운드 그리기(window’s
background drawable) 특성에 기인한다.
Window background는 다소 오해하게 하는 용어이다. 당신이 setContentView()를 Activity에서 호출하여 UI를 설정하면 안드로이드는 Activity의 윈도우에 당신의 뷰를 추가한다. 하지만 그 윈도우에는 당신이 추가한 뷰만 있는 것이 아니다. 여기서 가장 중요한 것 하나는 뷰구조의 가장 상위에는 DecorView가 있다는 것이다.
DecorView는 실제로 윈도우의 background drawable을 가지고 있는 뷰이다. 당신의 액티비티에서 getWindow().setBackgroundDrawable()을 호출함으로써 DecorView의 background drawable을 변경하게 된다. 이는 현재 구현된 안드로이드에 아주 국한된 내용이며 향후 버전이나 디바이스에서 변경될수 있다.
당신이 표준안드로이드 테마를 사용한다면 디폴트 background
drawable이 당신의 액티비티에 셋팅된다. T-Mobile G1에서 현재 ColorDrawable이 사용되고 있다. 대부분의 애플리케이션에서 이 이미지는 잘 동작하고 남겨진다. 이는 반대로 당신의 어플리케이션에 그리기 성능에 영향을 줄수 있다. 항상 전체화면에 불투명한 그림을 그리는 예제가 있다.
위 그림은 ImageView에 의해 커버되는 윈도우의 배경이 없는 스크린샷이다. 이 애플리케이션은 최대한 빠르게 다시그리기를 하도록 구현되었다. 44 fps의 속도로 그려지고 있다. 이와 같이 속도를 개선하기 위한 쉬운방법은 background
drawable을 제거하는것이다. UI가 불투명하기 때문에 배경을 그리는 것은 낭비적이다. 따라서 배경의 제거는 성능향상에 효과적이다.
새버전의 애플리케이션은 51fps까지 향상되었다. 더 개선된 차이는 T-Mobile G1의 메모리버스의 속도 향상으로 쉽게 설명된다.
커스텀테마를 사용하여 배경을 제거하는 것을 쉽게 할 수 있다. 먼저 res/values/themes.xml를 만들고 아래와 같이 내용을 추가하라.
<resources>
<style name="Theme.NoBackground" parent="android:Theme">
<item name="android:windowBackground">@null</item>
</style>
</resources>
그러고 난 후 android:theme=”@style/Theme.NoBackground”속성을 당신의
<activity/>나 <application/>테그에 추가하면 된다. 이 크릭은 MapView,
WebView등 fullscreen을 사용하는 어플에서 많이 사용된다.
불투명 뷰와 안드로이드 : 이 최적화방식은 안드로이드 UI툴킷이 현재 불투명한 자식뷰들에 의해 숨겨진 뷰의 그리기에 대해 충분히 스마트하지 않기 때문에 필요하다. 이런 최적화가 구현되지 않은 주된 이유는 간단하다 안드로이드 애플리케이션내에서 불투명한 뷰는 아주 조금 사용되기 때문이다.
윈도우 배경을 변경하기 위해 테마를 사용하는 것은 액티비티의 시작을 인지하는 성능을 개선하기 위한 최고의 방법이다. 이 트릭은 커스텀 백그라운드(texture나 logo)를 사용하는 액티비티에만 적용이 가능하다. Shelves애플리케이션이 좋은 예제가 된다.
이 애플리케이션시 나무느낌배경을 XML이나 onCreate에서 설정하면 사용자는 어두운 배경이나 디폴트테마를 가지고 시작될것이다. 나무느낌배경은 콘텐트뷰의 inflation이후에 표시될것이며, 첫번째 layout/drawing이 수행될것이다. 이것은 부작용을 야기하고 애플리케이션이 로드되는데 시간이 걸린다는 느낌을 받게 될것이다.
반면에 애플리케이션이 테마에 나무느낌배경을 정의하면 애플리케이션이 시작되자마자 시스템에 의해 로드된다. 사용자는 디폴트테마를 절대로 볼수 없으며 애플리케이션이 로드중이라는 느낌도 받지 않을것이다. 메모리와 디스크의 사용을 제한하기 위해
res/drawable/background_shelf.xml에 정의되어 연결된다:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/shelf_panel"
android:tileMode="repeat" />
이 drawable은 테마에서 참조된다.
<resources>
<style name="Theme.Shelves" parent="android:Theme">
<item name="android:windowBackground">@drawable/background_shelf</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
동일한 트릭이 T-Mobile G1에 탑재된 Google Map애플리케이션에도 사용되었다. 애플리케이션이 적재되면 MapView의 tile이 로딩되는 것을 바로 볼수 있다.
때때로 최고의 트릭은 또한 최고로 단순한것이다. 따라서 당신이 불투명한 UI나 커스텀배경을 사용하는 액티비티를 만들어야 할 때 윈도우배경을 변경해야 함을 기억하라.
Download the source code of the
first example.
Download the source code of
Shelves.