안녕하세요 돼지왕 왕돼지입니다.
오늘은 "Window Backgrounds & UI Speed" 라는 주제로 이야기 하고자 합니다.
이 글은 http://android-developers.blogspot.com/2009/03/window-backgrounds-ui-speed.html 을 의역한 것입니다.
Window Backgrounds & UI Speed
이 글에서 당신은 어떻게 drawing 을 더 빠르게 하고, activity 의 시작 시간을 단축시킬 수 있는지 알게 될 것입니다. 이 2가지 성능 향상은 오직 하나, window background drawable 과 관련 있습니다.
setContentView() 를 통해 Activity 에 view 를 붙이면, 이 view 는 activity 의 window 에 붙게 됩니다. 하지만 window 는 setContentView 를 통해 붙인 view 만 붙이는 것이 아닙니다. 가장 중요한 것 중 하나인 DecorView 를 붙이게 됩니다. 아래 파란색으로 표시된 부분입니다.
DecorView 는 window 의 background drawable 을 가지고 있는 view 입니다. getWindows().setBackgroundDrawable() 을 호출하는 것은 실제로는 DecorView의 background 를 변경하여 window 의 background 가 변경되는 것과 같은 효과를 내는 것입니다. 하지만 이 같은 설정은 나중 version 이나 device 에 따라 달라질 수 있습니다.
당신이 만약 기본 android theme 을 사용한다면, default background drawable 이 activity 에 설정되어 있습니다. 기본적으로는 ColorDrawable 이 설정되어 있죠. 보통의 어플에서는 이 ColorDrawable 이 DecorView 에 set 되어 있는 것이 문제가 안 됩니다. 하지만 drawing performance 에는 영향을 줄 수 있습니다. 다음과 같이 불투명 그림이 activity 전체에 설정되어 있는 경우가 그 예입니다.
그림에서 window background 가 보이지 않는 것을 확인 할 수 있을 겁니다. 전부 불투명한 그림을 담고 있는 ImageView 로 덮혀 있기 때문이죠. 이 어플은 44fps 가 나옵니다. ( 손가락을 대지 않으면 60fps 지만, 손가락을 스크린에 대고 있어서 mouse event 도 처리하기 때문에 44fps 로 떨어졌습니다. ) 더 빨리 그리게 하기 위해서는 background drawable 을 제거해주면 됩니다. 그림이 불투명이며 화면 전체를 차지하기 때문에 background 는 낭비입니다. background를 제거함으로서 더 나은 퍼포먼스를 얻을 수 있습니다.
background 를 제거한 버전에서는 51fps 가 나오는군요. 만약 default window background 가 더 큰 용량의 drawable 일 경우에는 그 차이가 더 확연히 나게 됩니다.
window background 를 없애는 것은 custom theme 을 적용함으로서 쉽게 적용할 수 있습니다. res/values/theme.xml 을 다음과 같이 정의하여 적용하면 됩니다.
<resources>
<style name="Theme.NoBackground" parent="android:Theme">
<item name="android:windowBackground">@null</item>
</style>
</resources>
이렇게 정의한 theme 을 activity 나 application 의 theme 으로 적용해주면 됩니다.
android:theme="@style/Theme.NoBackground"
MapView 나 WebView 같은 경우도 보통 activity 를 꽉 채우며 불투명하기 때문에 이 theme 을 쓰기가 좋습니다.
이 최적화 방법은 Android UI toolkit 이 이 가려진 drawable 을 그리지 않도록 할만큼 영리하지 못한데 있습니다. 보통 android application 에서 이렇게 full screen 전부가 불투명 한 경우가 많지 않기 때문에 이런 최적화를 framework 단에서 하지 않았었습니다. 하지만 이것은 추후 구현에서 자동으로 그리지 않도록 최적화될 수 있습니다.
전체 바탕을 theme 으로 설정함으로서 activity 의 시작 시간을 단축 시킬 수 있는 좋은 방법도 있습니다. 보통 custom background 를 사용할 때 이 최적화방법을 사용할 수 있고, 다음이 그 좋은 예입니다.
만약 이 background 가 onCreate 에서 설정되거나, XML layout 을 통해서 설정되었다면 activity 의 시작은 처음에 검은 배경이 나온 후 해당 그림으로 바뀌는 방식으로 이루어 질 것입니다. User 는 이 background 를 로드하는데 시간이 걸린다고 느낄 것이며, 깜빡이는 것 같은 느낌도 받을 것입니다. 이렇게 하는 대신 theme 으로 설정해서 custom background 를 깔아주면 activity 시작시간도 단축할 수 있고, 이렇게 깜빡이는 느낌도 없앨 수 있습니다. 해당 background 는 다음과 같이 정의합니다. ( res/drawable/background_shelf.xml )
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/shelf_panel"
android:tileMode="repeat" />
이 drawable 은 다음과 같이 theme 화 될 수 있습니다.
<resources>
<style name="Theme.Shelves" parent="android:Theme">
<item name="android:windowBackground">@drawable/background_shelf</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] 안드로이드 APK 파일 용량 제한. (2) | 2012.04.24 |
---|---|
[Android/안드로이드] Android Layout Tricks #4 : Optimize with stubs (0) | 2012.04.17 |
[Android/안드로이드] Android Layout Tricks #3 : Optimize by merging. (0) | 2012.04.17 |
[Android/안드로이드] Android Layout Tricks #2 : Reusing Layouts. (0) | 2012.04.17 |
[Android/안드로이드] Android Layout Tricks #1 ( Layout 최적화하기 ) (0) | 2012.04.16 |
댓글