2010-12-01 3 views
5

필자는 프로파일 링을 완료했으며 모든 프레임에서 (이해할 만하게) 호출되는 drawBitmap 중에 대부분의 시간이 소요 된 것으로 보입니다.Android에서 Canvas drawing-drawBitmap을 최적화하는 방법은 무엇입니까?

LunarLander 샘플에서 보여준 것처럼 SurfaceView/Updating thread/canvas locking 접근법을 사용합니다. 하지만 바로 그 첫 번째 프레임에

  • 에로 (this question에 따라)를 변경했습니다 비트 맵 버퍼를 구성하고
  • 재사용 이후의 각 프레임을 페인트로 칠하는 비트 맵 (내 화면 변경에 모든 것이) 각 프레임의 끝에서
  • 는 Traceview이 drawBitmap 내 800 × 480의 장치에서 프레임마다의 5ms을 얻어 내게 하였다 (스크린) 대상 캔버스

로 한번 버퍼 페인트. 그보다 더 좋은 성능을 얻을 수 있습니까? 아니면 그냥 돌에 새겨 넣은 것인가요? 초당 좋은 프레임을 얻기 위해 코드의 다른 부분을 최적화해야합니다.

+0

각 프레임의 더러운 사각형을 추적하여 업데이트 할 수 있습니까? 왼쪽 상단과 오른쪽 하단에서 약간 변경하면 분명히 도움이되지 않을 것입니다. – EboMike

+0

아마도 OpenGL이 더 나은 선택 일 것입니다. 휴대 전화와 태블릿에서 많은 테스트를 수행했으며 drawBitmap()은 태블릿을 중심으로 너무 느립니다. 그러나 다음과 같은 몇 가지 옵션이 있습니다. http://www.independent-software.com/android-speeding-up-canvas-drawbitmap/ –

답변

10

많은 것들에 따라 다르지만 일반적으로 drawBitmap()은 가능한 한 빨리 나타납니다. 특별한 경우 블렌딩이 필요하지 않으면 불투명 한 비트 맵을 사용하고 있는지 확인하십시오. 또한 Surface와 호환되는 형식으로 Bitmap을 사용하십시오. 예를 들어, 16 비트 표면을 사용하는 경우 16 비트 (RGB565) 비트 맵을 그리는 속도는 매우 빠릅니다 (단지 memcpy 호출 일뿐입니다). 표면이 32 비트이면 ARGB8888 불투명 비트 맵을 사용하십시오.

+3

표면 형식을 어떻게 감지합니까? surfaceChanged에 전달 된 "형식"값은 항상 "-1"인 것처럼 보입니다. –

+0

@ dpk setFormat() http://developer.android.com/reference/android/view/SurfaceHolder.html#setFormat%28int%29 – Aron

관련 문제