본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] Window Backgrounds & UI Speed

by 돼지왕 왕돼지 2012. 4. 17.
반응형




안녕하세요 돼지왕 왕돼지입니다.

오늘은  "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>



도움이 되셨다면 손가락 꾸욱~




 
반응형

댓글