Android RenderScript Blur |
RenderScript 관련 API 들은 API 11 에 등장했다.
하지만 Compat library 를 통해 API 8 부터 사용 가능하다.
RenderScript 는 Graphic 작업을 할 때 CPU, GPU 중 해당 작업을 최적으로 처리할 수 있는 것을 찾아내서 multiple processor 작업을 하고 나중에 그 결과를 합치는 작업을 하여 성능을 매우 높인다.
Native syntax 는 C99 기반으로, OpenCL, CUDA, GLSL 등이랑 비슷하다.
< Renderscript Blur Sample Code >
private void blur(Bitmap bg, View textView, float radius) {
Bitmap overlay = Bitmap.createBitmap( textView.getMeasuredWidth(), textView.getMeasuredHeight(), Bitmap.Config.ARGB_8888 );
Canvas canvas = new Canvas( overlay );
canvas.drawBitmap( bg, -textView.getLeft(), -textView.getTop(), null );
RenderScript rs = RenderScript.create( this );
Allocation overlayAlloc = Allocation.createFromBitmap( rs, overlay );
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create( rs, overlayAlloc.getElement() );
blur.setInput( overlayAlloc );
blur.setRadius( radius );
blur.forEach( overlayAlloc );
overlayAlloc.copyTo( overlay );
textView.setBackground(new BitmapDrawable( getResources(), overlay ) );
rs.destroy();
}
RenderScript 는 Native memory 를 참조하고 Bitmap 은 heap memory 를 참조한다. ( ICS 이후 )
따라서 이 둘 사이의 memory share 를 위해서 marshal 작업이 필요한데, 이 작업은 Allocation 인스턴스를 통해 된다.
Allocation 은 RenderScript 가 사용하는 Native memory 와 Heap memory 사이의 자동 marshal 작업을 도와준다.
ScriptIntrinsicBlur 는 blur 하는 script 를 로딩하는데 사용된다.
setInput 으로 source bitmap 이 되는 Allocation 을 넣어주고 radius 값을 setting 해준다.
forEach function 은 blur 를 실제로 수행한다.
Allocation.copyTo 를 통해서 작업한 결과물을 다시 Heap memory space 로 복사한다.
마지막으로 background 를 새로 작업한 bitmap 으로 assign 해주고,
Renderscript 의 context 를 제거한다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
Android GridLayout Tutorial (3) | 2014.06.10 |
---|---|
Android ViewDragHelper Tutorial (0) | 2014.06.09 |
안드로이드 단말 최악의 상황으로 만들어 테스트하기. (2) | 2014.06.06 |
[Android] activity-alias 태그를 사용하는 좋은 예. (0) | 2014.06.06 |
Cannot use SessionLoginBehavior SSO_WITH_FALLBACK when com.facebook.LoginActivity is not declared as an activity in AndroidManifest.xml (0) | 2014.06.04 |
댓글