2011년 10월 27일 목요일

렌더스크립트(Renderscript)를 소개합니다.


이 글은 그래픽, 성능 튜닝, 소프트웨어 아키텍쳐에 정통한 안드로이드 엔지니어 R. Jason Sams가 작성하였습니다. - Tim Bray (Introducing Renderscript의 번역입니다.)

렌더스크립트는 이전에 자세히 다룬적 없는 허니컴의 새 핵심 기능입니다. 여기선 이를 두 부분으로 나누어 설명할텐데요. 이 글은 렌더 스크립트에 대한 짧은 개론입니다. 간단한 예제와 더 기술적인 글을 다음에 하겠습니다.

렌더스크립트는 고성능 3D 렌더링과 컴퓨팅 연산에 맞춘 새 API입니다. 렌더 스크립트의 목적은 저수준에서 얻은 고성능의 API를 안드로이드 개발자에게 주는 겁니다. 자신의 애플리케이션 성능을 최적화려 기계 수준까지 작업하는게 익숙한 개발자를 대상으로 합니다. 렌더 스크립트는 개발자에게 3종의 기본 도구를 제공합니다. 하드웨어 가속되는 간단한 3D 렌더링 API, CUDA와 유사한 개발자 친화적인 연산 API, C99와 흡사한 언어입니다.

렌더스크립트는 유튜브와 책 앱을 화려하게 했습니다. 허니컴 타블렛에 탑재된 첫 라이브 배경화면도 이 API를 이용했죠.

디바이스에서 네이티브 코드를 수행함으로서 성능향상을 얻습니다. 기존의 NDK와는 달리 이 해법은 플랫폼을 가리지 않습니다. 렌더스크립트 용 개발언어는 C99를 확장한 언어입니다. 이 언어는 개발할 땐 장비와 무관하게 컴파일되어 애플리케이션 패키징됩니다. 앱이 수행될 때 이 스크립트를 기계 코드로 컴파일하여 장비에 최적화합니다. 개발 중에 특정 머신의 아키텍쳐로 고정하는 문제를 제거한 거죠.

렌더스크립트는 기존 플랫폼의 고수준 렌더링 API와 언어를 대체하는 것이 목표가 아닙니다. 기존 API의 능력 밖의 성능이 필요한 중요 코드에 쓰려는 겁니다.

CPU냐 GPU냐? 이런 대립적인 얘기를 하지 않는것이 흥미로울 지도 모릅니다. 장비에서 실시간으로 수행될 곳이 정해지기 때문에 어디에서 수행되는 것인지는 의미가 없습니다. 간단한 스크립트는 작업을 GPU에서 연산하죠. 더 복잡한 스크립트는 CPU에서 하고요. CPU는 적합한 GPU와 다른 가속기가 없는 상황에서도 언제나 제대로 동작하게 해주는 대체제이기도 합니다. 그래서 렌더스크립트는 개발자들에게 투명합니다. 일반적으로 작은 스크립트는 이 후에 더 다양한 영역에서 수행될 수 있어요. 지금 당장은 단순히 CPU를 더 꽂아 CPU 리소스를 더 활용할 수 있죠.



위 비디오는 렌더스크립트 예제를 동작시켜 타블렛의 HDMI out 출력을 캡쳐한 것입니다. (고화질 버전은 유튜브에 있습니다.) 이 비디오는 단순 무식하게 물리 시물레이션 중인 900개의 입자를 볼 수 있습니다. 이 계산 스크립트는 매 프레임 동작하며 자동으로 양쪽 코어 (CPU, GPU)를 활용합니다. 물리 시물레이션이 끝나면 이어 그래픽 스크립트가 렌더링을 합니다. 비디오에선 하나의 큰 공을 집어넣어 상호 작용시켰습니다. 그리고 타블렛을 기울여서 중력을 활용했죠. 신형 허니컴 타블렛의 듀얼 코어 A9의 위력을 보여줍니다.

렌더스크립트 그래픽은 연속적인 장면을 랜더링하기 위한 새로운 런타임을 제공합니다. 이 런타임은 하드웨어 가속되며, 사용자의 스크립트를 이용하여 통제된 달빅 코드에 대한 추가된 기능을 제공합니다. 이 통제된 코드는 "페이지를 켜"나 "리스트를 움직여" 같은 다소 정제 덜 된 명령을 보냅니다. 이 두 측면의 명령어는 사용자 스크립트에 의해 결정됩니다. 이런 방식으로 전체적으로 원하는 방식대로 정할 수 있죠. 렌더스크립트 그래픽의 이전 예제는 이클레어에 실린 라이브 배경화면과 3D 애플리케이션 런쳐입니다.

허니컴에선 렌더스크립트가 렌더러를 GL ES 1.1에서 2.0으로 바꾸었습니다. 동시에 프로그램 가능한 세이더 모델, 3D 모델 로딩, 더 많이 효율적인 할당 관리 등을 추가하였습니다. LLVM 기반의 새 컴파일러는 이클레어, 진저브레이드의 타임 프레임에 사용된 acc보다 몇배는 효과적입니다. 렌더스크립트 API와 도구의 가장 중요한 변화는 이제 공식이라는 것입니다.


위의 스크린 샷은 내부 테스트 앱에서 찍은 것입니다. 애플리케이션은 간단한 장면 그래프(scene-graph)를 구현한 것이고요. 재귀적으로 스크립트가 스크립트를 호출합니다. 이 안드로이드는 마야로 작성된 콜라라도 파일을 A3D파일로 변형해 읽은 것입니다. A3D 파일은 장비에서 렌더스크립트 객체를 저장하는데 사용하는 파일 형식입니다.

다음으로 더 기술적인 정보와 샘플 코드로 이어가겠습니다.

댓글 없음:

댓글 쓰기