2010-03-21 8 views
3

보기의 onDraw 이벤트에서 캔버스에 직접 그려주는 안드로이드 응용 프로그램을 작성하고 있습니다.캔버스에 그리기

가 여기에 문제가 이것이 CalculateMyPoint 루틴으로 그리는 데 시간이 오래 걸리는 것입니다 매우 비싼입니다

for (int x = 0; x < xMax; x++) { 
    for (int y = 0; y < yMax; y++){ 
    MyColour = CalculateMyPoint(x, y); 
    canvas.drawPoint(x, y, MyColour); 
    } 
} 
:이 들어, 개별적으로 각 픽셀을 그리기 포함 뭔가를 그리기있어

나는 같은 것을 사용 방법.

캔버스에 그림을 그리는보다 효율적인 방법이 있습니까? 예를 들어 비트 맵에 그려야하고 전체 비트 맵을 onDraw 이벤트에서 캔버스에 칠해야합니까? 또는 내 색상을 평가하고 onDraw 메서드로 캔버스를 칠하는 데 사용할 수있는 배열을 채울 수 있습니까?

내 응용 프로그램 사용자는 캔버스에서 그림에 영향을주는 매개 변수를 변경할 수 있습니다. 이것은 현재 매우 느립니다.

+0

CalculateMyPoint를 처리하는 데 너무 오래 걸리는 이유는 무엇입니까? – Adam

+0

주어진 픽셀에 사용할 색상을 계산하는 데 합리적으로 관련된 계산이 있습니다. 각 픽셀의 색상을 계산하는 것이 더 나은지 궁금한 점이 있습니다. 그 대신 뷰의 onDraw 이벤트 대신에. – Mattl

+0

모든 픽셀을 개별적으로 그려야합니까? 왜냐하면 Droid 나 넥서스의 400k 픽셀 이상이기 때문에 런타임보다 CalculateMyPoint의 호출 횟수를 최적화 할 수있는 기회가 더 많다고 느껴집니다. – jqpubliq

답변

5

사람들이 지적했듯이 CalculateMyPixel()이 비싸면 150,000 (HVGA) 또는 384,00 (WVGA)라고 불리는 것이 당신을 죽일 것입니다.

그 중에서도 업데이트가있을 때마다 canvas.drawPoint()를 통해 개별 픽셀로 UI를 그리는 것이 가장 효율적인 방법 일뿐입니다.

개별 픽셀을 그리는 경우, 간단한 Canvas.drawBitmap()으로 그리는 픽셀을 포함하는 일종의 오프 스크린 비트 맵이 거의 필요합니다.

그런 다음 해당 비트 맵을 관리하는 가장 좋은 방법을 결정할 수 있습니다. 가장 간단한 방법은 원하는 크기의 Bitmap 객체를 만들고 거기에 API를 사용하여 채우는 것입니다.

또는 원시 정수 배열을 사용하는 drawBitmap() 버전이 있습니다. 각 픽셀에 대한 메서드 호출을 피하면서 원하는 값으로 직접 호출 할 수 있습니다.

이제 픽셀 계산을 onDraw() 메소드 밖으로 옮길 수 있습니다. 응답 성이 좋은 UI를 사용하고 다른 곳에서 픽셀을 채우려면 빠르게해야합니다. 어쩌면 초기화 시간에 한 번 계산할 수도 있습니다. 어쩌면 당신이 그들을 계산하고 무효화() (예를 들어 (0,0) - (10, l0)에서 픽셀을 변경하기 전에 변경된 부분의 선택적 업데이 트를 수행 그래서 현재의 비트 맵을 받아 그 영역을 수정). 픽셀을 계산하는 것이 본질적으로 느린 경우에는 새 픽셀로 비트 맵을 업데이트 한 다음 UI에서 postInvalidate()를 사용하여 해당 작업을 수행 할 별도의 스레드를 만들어야합니다.

이제 픽셀을 비트 맵으로 만들었으므로 비트 맵의 ​​크기를 작게 만들고 화면에 그릴 때 크기를 조정할 수 있으므로 해당 픽셀을 채우는 동안 훨씬 적은 시간이 걸릴 수 있습니다. 전체 UI (낮은 해상도에서도).

+0

고마워,이게 다 상식 인 것 같아.
OnDraw 루틴에서 코드를 사용하여 응용 프로그램을 초기화하는 데 약 1 분이 걸립니다. 1 초를 초과하는 항목은 아마도 받아 들일 수 없습니다.
이 호출은 픽셀 어레이 내 비트 맵을 초기화 할 수 I는 필요
공공 정적 비트 맵 createBitmap (INT [] 색상 INT 폭 INT 높이 Bitmap.Config 구성)
그것은 또한 사실이다 I 실제로 WVGA 해상도가 필요하지 않으므로 크기 조정을 실험 해 보겠습니다.
Mattl

+0

나는이 팁을 따라 저녁을 보냈고, 거의 1 분에서 3 초 동안 내 렌더링을 얻었다! 나는 더 이상 최적화함으로써 또 다른 두 번째를 면도 할 수 있다고 생각한다. 다시 고마워. – Mattl

+1

개선 된 코드의 예를 보여주십시오. –