상세 컨텐츠

본문 제목

[android] 안드로이드 매니페스트 앱 권한 "WebView" 의Canvas, WebGL사용가능하게 , hardware acceleration(하드웨어 가속) 관련

스마트기기개발관련/안드로이드 개발

by AlrepondTech 2018. 4. 11. 11:03

본문

반응형

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



출처: https://developer.android.com/guide/topics/graphics/hardware-accel.html




Application level

In your Android manifest file, add the following attribute to the <application> tag to enable hardware acceleration for your entire application:

<application android:hardwareAccelerated="true" ...>

Activity level

If your application does not behave properly with hardware acceleration turned on globally, you can control it for individual activities as well. To enable or disable hardware acceleration at the activity level, you can use the android:hardwareAccelerated attribute for the <activity> element. The following example enables hardware acceleration for the entire application but disables it for one activity:

<application android:hardwareAccelerated="true">
   
<activity ... />
   
<activity android:hardwareAccelerated="false" />
</application>

Window level

If you need even more fine-grained control, you can enable hardware acceleration for a given window with the following code:

getWindow().setFlags(
   
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
   
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

Note: You currently cannot disable hardware acceleration at the window level.

View level

You can disable hardware acceleration for an individual view at runtime with the following code:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Note: You currently cannot enable hardware acceleration at the view level. View layers have other functions besides disabling hardware acceleration. See View layers for more information about their uses.








//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: https://stackoverflow.com/questions/11933737/android-enable-hardware-acceleration



The above code looks ok. The same problem is posted at HoneyComb isHardwareAccelerated() always returns false. Yet Android 3.0 Hardware Acceleration writes

If you need more fine-grained control, you can enable hardware acceleration for a given window at runtime:

    getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://gakari.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4-%EA%B0%80%EC%86%8D-%EA%B8%B0%EB%8A%A5



안드로이드 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로 둔다.




출처: http://gakari.tistory.com/entry/안드로이드-하드웨어-가속-기능 [가카리의 공부방]





//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

반응형


관련글 더보기

댓글 영역