안드로이드 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로 둔다.
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - Content Provider (콘텐트 프로바이더) (0) | 2015.11.29 |
---|---|
안드로이드 - 시스템 클립보드를 활용한 데이터 복사 붙여넣기 (0) | 2015.11.07 |
안드로이드 - 압축 파일 사용하기 (0) | 2015.11.05 |
안드로이드 - 파일 탐색기 만들기 (2) | 2015.11.04 |
안드로이드 - 액션 모드(ActionMode) 다루기 (1) | 2015.10.25 |
안드로이드 - 액션바 꾸미기 (0) | 2015.10.25 |
안드로이드 - DialogFragment에 스타일과 테마 지정하기 (0) | 2015.10.24 |
안드로이드 - 프래그먼트 대화상자를 액티비티 안에 배치하기 (0) | 2015.10.12 |