2012-03-08 3 views
0

복잡한 수학적 표현을 기반으로 임의의 이미지를 생성하는 Android 앱을 만들고 있습니다. 픽셀의 색상은 위치와 선택한 표현식에 따라 다릅니다. (나는 "무작위 예술"을 생산하는 많은 iPhone 앱을 보았지만 비교적 적은 수의 Android 앱을 보았습니다.)SurfaceView를 사용하여 하나의 복잡한 이미지를 그리는 방법

Nexus S 개발 폰에서 이미지를 그릴 때 5 ~ 15 초가 소요됩니다.

UI 스레드를 응답 상태로 유지하려면 SurfaceView 클래스의 목적처럼 보입니다. SurfaceView의 거의 모든 예제는 하나의 복잡한 이미지가 아니라 애니메이션을 처리합니다. 이미지가 그려 지거나 렌더링 된 후에는 사용자가 될 때까지 변경하지 않을 것입니다.

따라서 올바른 구성 요소는 SurfaceView입니까? 그렇다면 SurfaceView 또는 이미지 내부 렌더링이 완료되면 이미지를 렌더링 할 때 내부 스레드로부터 콜백을받을 수 있습니까? 콜백은 고해상도 이미지 아트의 저해상도 및 고르지 않은 버전을 전환해도 괜찮습니까?

SurfaceView 대신 단일 이미지의 복잡한 렌더링에 더 좋은 대안이 있습니까? (애니메이션이 아닙니다.)

건배!

+0

왜 openGl을 사용하지 않습니까? – slayton

+0

일반 SurfaceView보다 OpenGL (GLSurfaceView를 사용한다고 가정)을 사용하면 어떤 이점이 있습니까? –

+1

속도 저하는 렌더링이 아니라 계산에 있기 때문에. 임의의 수학적 계산을 GLSL 쉐이더 언어로 오버로드하는 것은 어렵습니다. :). NDK 경로를 사용하거나 RenderScript의 Compute API를 사용하는 것이 더 나은 방법 일 수 있습니다. –

답변

1

다른 스레드에서 하나의 복잡한 이미지를 렌더링하여 UI를 반응 적으로 유지 한 다음 실제로 렌더링을 완료 한 후에 표준 유지 관리 작업을 수행하면됩니다 -UI- 스레드 방법으로 뭔가를 사용하여 AsyncTask. GPU에 실제 렌더링 계산을 오프로드 할 수 있다고 제안하지 않는 한 합성 또는 실제로 GPU에만 해당되는 것이 아닙니다.

나는 그것이 setPixels를 사용하여 비트 맵을 간단히 완료 후 AsyncTask에 픽셀을 나타내는 배열을 구축 적어도 실험을 만들고 해당 비트 맵에 ImageView의 소스를 설정합니다.

이미지를 픽셀 단위로 표시하려면 SurfaceView을 선택하는 것이 좋습니다.이 경우 기본적으로 애니메이션이므로 다른 자습서를 따라갈 수 있습니다. 다른 설정이 있지만 중요한 것은 onDraw을 무시한 다음 각 픽셀을 그릴 때 Canvas.drawPoint을 사용해야 할 것입니다.

관련 문제