'software-base drawing model'에 해당되는 글 1건

  1. 2014.09.22 [android] View의 LayerType 알아보기

[android] View의 LayerType 알아보기

android 2014. 9. 22. 15:09

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Android 3.0 ( 허니컴 : API level 11 ) 부터 하드웨어 가속 (hardwareAccelerated )  옵션으로 2D rendering pipeline 의 사용여부를 설정 할 수 있도록 하였다. hardwareAccelerated 을 설정하면 CPU가 할 일을 GPU가 대신 처리해서 그런지 체감 속도가 많이 빨라진다.

 

설정하기

ApplicationManifest.xml에서 설정할수 있다.

앱 전체에 설정하려면 아래처럼 application tag에 설정하면 된다.

<application

android:hardwareAccelerated="true"

또는 Activity 단위로도 설정할 수 있다.

<activity

android:hardwareAccelerated="true"

 

코드를 이용해서 동적으로 Activity에 설정하려면 아래와 같이 하면 된다. ( 동적으로 application 전체를 설정하는 방법은 없다. 동적으로 하려면 모든 activity에 아래의 방법을 적용하면 된다. )

코드로 할 때 주의할점은 setContent 전에 설정해야 한다.

@Override

protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);          

       getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

       setContentView(R.layout.my_content_view);

 

View 단위로도 설정할수 있는데, 아래의 방법으로 코드로 설정 할 수 있다. 생성자에서 호출이 되어야 한다.

 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

}

 

참고로, Applicationmanifest나 코드로 설정안하고, android settings에서 개발자 옵션에서 “GPU 렌더링 강제 실행옵션을 키면 항상 GPU로 렌더링하게 된다.

 

View 단위로 설정하는 코드에서 보듯이, SDK에서 View LayerType 3가지로 제공한다.

l  LAYER_TYPE_NONE

l  LAYER_TYPE_SOFTWARE

l  LAYER_TYPE_HARDWARE

 

Software-base drawing model

소프트웨어 기반의 그리기 모델에서는 다음 2가지 절차를 통해서 그리기를 수행한다.

1.     Invalidate the hierarchy

2.     Draw the hierarchy

예를들어서, TextView의 내용을 변경하고 invalidate() 함수를 호출하면 viewhierarchy를 순회하면서 모든 view invalidate가 호하면서 다시 그려야할 영역을( the dirty regin) 을 구하게 된다. 그리고 viewhierarchy를 순회하면서 다시 그리게 된다.  (View.invalidate 함수를 보면, ViewParent invalidateChild 함수를 호출하는 것을 확인할수 있다. )

Software로 그리는 방식은 간단하지만, 2개의 결점을 가지고 있다. 첫째는 변경되지 않은 view에 대해서도 draw 코드를 수행하게 되는것이고, 두번째는 앱에 버그가 존재할수 있다는 것이다.

  

 

Hardware-base drawing model

하드웨어기반의 그리기 모델에서는 소프트웨어기반의 그리기 모델의 단점을 개선하여서 변경된 viewupdate를 하도록 개선된 모델이다.

1.     Invalidate the hierarchy

2.     Record and update display lists

3.     Draw the display lists

디스플레이 리스트( diplay list)를 가지고 있어서 각각의 view hierarchy에서 update되는 것만 다시 그리는 방식이다.

 

전체적인 구조나 성능면에서 hardware 방식이 더 좋지만 hardware 방식의 문제점도 있다. 바로 모든 api 가 지원하는 것이 아니다.

아래의 표는 Harware 기반 그리기 모델에서 android OS 버전별로 지원되는 api와 지원안되는 api 리스트 이다. 아래의 api를 사용할때는 성능 감소가 되더라도, LayerType을 반드시 software로 설정해야 정성 동작한다.

 

API level

< 16

16

17

18

Canvas

drawBitmapMesh() (colors array)

drawPicture()

drawPosText()

drawTextOnPath()

drawVertices()

setDrawFilter()

clipPath()

clipRegion()

clipRect(Region.Op.XOR)

clipRect(Region.Op.Difference)

clipRect(Region.Op.ReverseDifference)

clipRect() with rotation/perspective

Paint

setAntiAlias() (for text)

setAntiAlias() (for lines)

setFilterBitmap()

setLinearText()

setMaskFilter()

setPathEffect() (for lines)

setRasterizer()

setShadowLayer() (other than text)

setStrokeCap() (for lines)

setStrokeCap() (for points)

setSubpixelText()

Xfermode

AvoidXfermode

PixelXorXfermode

PorterDuff.Mode.DARKEN (framebuffer)

PorterDuff.Mode.LIGHTEN (framebuffer)

PorterDuff.Mode.OVERLAY (framebuffer)

Shader

ComposeShader inside ComposeShader

Same type shaders inside ComposeShader

Local matrix on ComposeShader

 

 

 

참고 : http://developer.android.com/guide/topics/graphics/hardware-accel.html



: