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가 시간이 지남에 따라 꾸준히 감소하더라도 애니메이션이 실행되는 동안이 문제가 계속 발생한다고 언급 할 가치가 있습니다.
힙 프로파일 링을 수행 했습니까? 좋은 블로그 게시물은 다음과 같습니다. [Android 응용 프로그램을위한 메모리 분석] (http://android-developers.blogspot.co.nz/2011/03/memory-analysis-for-android.html) – tom
링크를 제공해 주셔서 감사합니다! 힙 분석을 실행 한 후 바이트 [] 배열이 많은 양의 메모리를 차지하는 것을 알았습니다. 내가 잊어 버린 500x500 픽셀 이미지는 캔버스에 그려 넣지 않아도 여전히 만들어졌습니다. 이 라인을 주석 처리했을 때 훨씬 작은 GC 호출을 받았습니다 (그러나 빈번하게 호출 됨). – SJonesGSO