2013-12-21 3 views
1

2D 애니메이션을 실행할 때 시스템 GC가 끊임없이 호출되는 문제가 있습니다. 이유가 확실하지 않습니다.2D 표면 뷰 애니메이션에서 논스탑 쓰레기 수거

내가 읽은 모든 것은 내가하지는 않는 onDraw() 메서드에서 비트 맵을 만드는 것을 피할 것을 제안했지만, 초당 약 1 회 호출되는 GC가 여전히있어 로우 엔드 장치에서 유용성에 심각한 영향을 미칩니다.

코드

은 매우 긴, 그래서 여기에 모두 게시하지 않습니다 만, 기본적으로 _surfaceHolder.unlockCanvasAndPost(_canvas) 다음에()가 호출 된 된 onDraw의 결과로, 다음 postInvalidate_surfaceHolder.lockCanvas(null) 호출하는 스레드가있다.

내 된 onDraw() 메소드 _canvas.drawCircle(...) 여러 반복을 갖고, 그리고 Math.pow(...) 관련된 수치 계산을 많이합니다 (서피스 뷰 SurfaceView 만들 때 한번 생성 된 비트 맵을 그리기) _canvas.drawBitmap(...). 응용 프로그램은 여러 개의 (10+) Double ArrayLists를 사용하여 각 onDraw() 루틴에서 여러 번 읽고 읽습니다.

GC를 자주 호출하는 이유와 도움을 줄 수있는 이유에 대해 알아 보았습니까? 나는 단순히 너무 많이 계산하고 더 높은 프레임 속도를 기대해서는 안됩니까?

EDIT : 비트 맵 도면을 모두 주석 처리하고 FPS가 시간이 지남에 따라 꾸준히 감소하더라도 애니메이션이 실행되는 동안이 문제가 계속 발생한다고 언급 할 가치가 있습니다.

+0

힙 프로파일 링을 수행 했습니까? 좋은 블로그 게시물은 다음과 같습니다. [Android 응용 프로그램을위한 메모리 분석] (http://android-developers.blogspot.co.nz/2011/03/memory-analysis-for-android.html) – tom

+0

링크를 제공해 주셔서 감사합니다! 힙 분석을 실행 한 후 바이트 [] 배열이 많은 양의 메모리를 차지하는 것을 알았습니다. 내가 잊어 버린 500x500 픽셀 이미지는 캔버스에 그려 넣지 않아도 여전히 만들어졌습니다. 이 라인을 주석 처리했을 때 훨씬 작은 GC 호출을 받았습니다 (그러나 빈번하게 호출 됨). – SJonesGSO

답변

1

귀하의 문제는 귀하가 언급 한대로 Double의 ArrayList를 사용하고 있기 때문입니다. 큰 double 은 객체 래퍼이고 double은 기본 객체입니다. 산술 연산에서 Double에서 double 및 viceversa로 전환 할 때마다 많은 양의 가비지가 생성되어 GC가 성능을 많이 저하시킬 많은 작은 물체를 수집하기 시작합니다. 크게

는 희망이 도움이 성능을 높일 수 있습니다> 더블 [] 대신 < ArrayList를 두 번의 사용 내 경험에

!

+0

나는 당신이 문제에 있다고 생각합니다. 메모리 할당 분석을 한 후에 모든 비트 맵 할당을 제거하면 GC 호출이 여전히 자주 발생하지만 훨씬 적은 양과 시간으로 인해 Double arraylists가 빈도의 원인이라고 생각하게됩니다. 비트 맵 크기는 필요한 시간의 원천입니다. – SJonesGSO