프로그래밍/안드로이드

안드로이드 - 하드웨어 가속 기능

가카리 2015. 10. 25. 18:23
반응형

 

안드로이드 3.0 부터 하드웨어 가속 기능을 지원한다. 하드웨어 가속은 그래픽 처리를 할 때 GPU를 사용하여 그리는 방식이다.

 

하지만 다음 메소드는 아직 가속을 지원하지 않는다.

 

클래스

메소드

Canvas

clipPath, clipRegion, drawPicture, drawTextOnPath, drawVertices

Paint

setLinearText, setMaskFilter, setRasterizer

Xfermodes

AvoidXfermode, PixelXorXfermode

 

다음 기능은 하드웨어 가속을 사용하면 다르게 동작하는 메소드이다.

 

클래스

메소드

Canvas

clipRect - 일부 모드가 무시된다.

drawBitmapMesh - 색상 배열이 무시된다.

Paint

setDither - 무시된다.

setFilterBitmap - 필터링이 항상 켜진다.

setShadowLayer - 텍스트에 대해서만 정상 작동한다.

PorterDuffXfermode

DARKEN, LIGHTEN, OVERLAY 모드가 SRC_OVER와 같음

ComposeShader

ComposeShader가 같은 타입의 셰이더는 조합하지 못하며 중첩도 안된다.

 

 

하드웨어 가속 기능은 속도를 향상시키는 것이 주목적이며 출력의 결과나 품질과는 상관 없다.

 

개발자는 앱, 액티비티, 윈도우, 뷰 4가지 수준에서 가속 기능의 사용 여부를 선택할 수 있다.

 

앱과 액티비티의 가속 기능 사용 여부는 매니페스트의 속성으로 제어한다.

 

<application android:hardwareAccelerated="true">

    <activity name="A"/>

    <activity name="B"/>

    <activity name="C" android:hardwareAccelerated="false"/>

</application>

 

위와 같이 hardwareAccelerated 속성을 지정함으로써 가속 기능의 사용 여부를 나타낸다.

 

윈도우는 setFlags 메소드로 FLAG_HARDWARE_ACCELERATED 플래그를 지정함으로써 가속 기능을 선택한다.

 

하지만 액티비티의 가속 설정을 조정하는 것이 더 편리해서 이 플래그를 쓸일은 없다.

 

액티비티는 가속을 쓰지만 뷰만 쓰고 싶지 않다면 다음 메소드를 호출하면 된다.

 

    myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

 

현재 가속 기능이 적용되고 있는지 아닌지는 다음 2가지 방법으로 조사한다. (뷰나 캔버스에 대해서)

 

    boolean View.isHardwareAccelerated()

    boolean Canvas.isHardwareAccelerated()

 

뷰는 가속 중이라도 비트맵에 그릴 때 캔버스는 가속상태가 아닐 수도 있으므로 뷰보다는 캔버스의 가속 상태를 조사하는 것이 더 정확하다.

(캔버스에 직접 그리기를 하지 않는다면 뷰를 통해 조사하면됨)

 

이번 예제는 하드웨어 가속을 사용할 때와 사용하지 않았을 때의 비교이다.

아래와 같이 2개의 파일만 수정한다.

 

AccelTest1.java

 

package com.example.ch22_acceltest1;

 

import java.util.Random;

 

import android.app.Activity;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.os.Bundle;

import android.view.View;

 

public class AccelTest1 extends Activity {

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //setContentView(R.layout.acceltest1);

        AccelTestView vw = new AccelTestView(this);

        setContentView(vw);

    }

 

}

 

class AccelTestView extends View{

 

    Random Rnd = new Random();

    int Radius = 1;

    public AccelTestView(Context context){

        super(context);

    }

    

    public void onDraw(Canvas canvas){

        canvas.drawColor(Color.GRAY);

        Paint Pnt = new Paint();

        Pnt.setAntiAlias(true);

        Pnt.setTextSize(30);

        

        if(canvas.isHardwareAccelerated()){

            canvas.drawText("Hardware Accel", 50, 50, Pnt);

        }else{

            canvas.drawText("Software Draw", 50, 50, Pnt);

        }

        

        Pnt.setStyle(Paint.Style.STROKE);

        Pnt.setStrokeWidth(3);

        Radius += 3;

        if(Radius > 255) Radius = 1;

        for(int i = 1; i < Radius; i+=3){

            Pnt.setColor(Color.rgb(i, i, i));

            canvas.drawCircle(240, 400, i, Pnt);

        }

        invalidate();

    }

}

 

AndroidMenifest,xml 파일

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.ch22_acceltest1"

android:versionCode="1"

android:versionName="1.0" >

 

<uses-sdk

android:minSdkVersion="19"

android:targetSdkVersion="19" />

 

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".AccelTest1"

android:label="@string/app_name"

 

android:hardwareAccelerated="true">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

 

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

 

</manifest>

 

실행 화면

 

    하드웨어 가속을 사용하지 않았을 때는 동그라미를 그릴 때 약간 부드럽지가 않다.

메니페스트 파일에서 hardwareAccelerated를 false로 둔다.

 

 

하드웨어 가속을 사용하면 끊김 없이 부드럽게 동그라미가 그려진다.

메니페스트 파일에서 hardwareaccelerated 를 true로 둔다.