안드로이드 개발 질문/답변
(글 수 45,052)
surfaceview를 이용하여 게임을 제작중인데...
pause 됬다가 resume이 되서 다시 실행될때 프레임속도가 떨어집니다...
pause 할때 비트맵자원 풀어주고 스레드도 죽인다음
resume 에서 다시 비트맵자원 로드하고 스레드를 새로 생성해 돌려주는데요...
디버그 결과 surfaceDestroyed 호출되어 surface가 파괴된 다음 다시 실행할때만 프레임속도가 떨어지는걸 확인했습니다.
pause가 되더라도 surface가 파괴되지 않았다면 속도가 떨어지지 않았습니다...
왜 이런 현상이 벌어질까요??
해결방법좀 가르쳐 주세요 ㅠㅠ
그리고 또 한가지...
drawable로 로드한 png 파일은 자원을 풀어주는 함수가 없던데...이건 그냥 자동적으로 해제 되는건가요???
pause 됬다가 resume이 되서 다시 실행될때 프레임속도가 떨어집니다...
pause 할때 비트맵자원 풀어주고 스레드도 죽인다음
resume 에서 다시 비트맵자원 로드하고 스레드를 새로 생성해 돌려주는데요...
디버그 결과 surfaceDestroyed 호출되어 surface가 파괴된 다음 다시 실행할때만 프레임속도가 떨어지는걸 확인했습니다.
pause가 되더라도 surface가 파괴되지 않았다면 속도가 떨어지지 않았습니다...
왜 이런 현상이 벌어질까요??
해결방법좀 가르쳐 주세요 ㅠㅠ
그리고 또 한가지...
drawable로 로드한 png 파일은 자원을 풀어주는 함수가 없던데...이건 그냥 자동적으로 해제 되는건가요???
한번 GC가 일어나는 것을 확인해 보세요. surface 가 destroy 될때 surface와 링크된 오브젝트들의 gc가 계속 일어나고 있는 상황이라 그럴 수도 있구요.
기본적으로 이런 상황에서 GC 줄일려면 bitmap recycle() 꼭 해줘야 하는데 잘 하고 계신거 같네요.. recycle 안하고 GC 일어나는거 구경하면 성능이 50% 정도 떨어지더군요..
배경투명을 위해 png를 쓰면 좋지만 png 는 처리속도가 느리고 4채널을 쓰고(more memory) recycle이 없지요...
런처 소스를 보면 drawable의 경우 setCallBack(null) 을 해줘서 링크를 끊어버리는 것 같은데 GC와 어떤 관계가 있는지 테스트 해본적이 없어서 잘 모르겠네요.
대안으로는 resume 될때 사용자에게 resume 할래? 라고 물어보아 시간을 버는 수가 있을까요;;;
안드로이드 버벅임은 언제나 GC 같은 메모리 문제인듯 ㅠ