안드로이드 개발 정보
(글 수 568)
canvas를 이용하여 앱을 개발하던 중에
개발자 옵션에 있는 GPU 하드웨어 강제 가속옵션덕분에 삽질의 연속을 했습니다.
옵션을 끄면 아무 이상없이 동작을 하는데, 강제 옵션을 켜면 딱 한번의 그림만 그려지는 오류였습니다.
구글링을 해봐도 비슷한 증상을 찾을수 없어서 끙끙 앓다가
결국 하드웨어 옵션을 임시로 무시하는 쪽으로 해결을 했습니다.
이런 경우에도 역시 문제가 발생을 하는데요.
하드웨어 강제 옵션이 켜있는 상황에서 정상적으로 화면을 그리는 경우에 종종 화면의 좌표가 엇나가게 그려지는 문제가 발생했습니다.
원인은 GPU강제 가속시에 canvas가 항상 바뀌는데에 있었습니다.
제가 만든 앱은 onDraw가 최초 호출될때 생성되는 canvas를 저장해두고 해당 캔버스에 업데이트 하는 방식으로 비트맵을 그렸습니다.
그런데 GPU강제 가속하는 경우 onDraw에서 생성되는 canvas가 매번 바뀌더군요.
매번 새로운 캔버스에 그리는 것으로 간단하게 해결했습니다.
그냥 혼자 뻘짓을 한듯 싶지만... 방금 정확한 원인을 발견하고 기쁜 마음에...
저도 GPU강제가속때문에 많이 고생했었습니다.
특히 ICS에서 문제가 많았습니다.
GPU강제가속은 안드로이드3.0부터 도입이 되었습니다.
그런데, 안드로이드3.0에서는 GPU강제가속이 기본 옵션이 false이나, ICS에서는 GPU강제옵션이 true입니다.
manifest file에서 설정이 가능한데, tag는
hardwareAccelerated = "true|false"입니다.
해당 Tag가 없다면, 3.0에서는 false로 동작하고, 4.0에서는 true로 동작합니다.
이값이 false일 때는, 진져브레드의 drawing방식을 그대로 사용하고,
true이면 새로 디자인된 drawing방식을 사용합니다.
대부분의 ICS에서 drawing때 오류가 생기거나 메모리가 부족한 부분, 화면이 까맣게 보이는 부분은 hardwareAccelerated="true"로
세팅이 되어, GPU가속을 사용하는데, GPU driver쪽에 오류가 있는 경우입니다.
제가 테스트해 본 결과, hardwareAccelerated="false"로 세팅하면, 거의 대부분의 ICS폰에서 진져브레드처럼 잘 동작합니다.
딱 하나, 갤럭시노트만 문제가 있습니다.
hardwareAccelerated="true" 로 세팅했을 때는 ICS폰들이 대부분 동작은 하나, 뭔가 화면이 깨끗하게 그려지지 않는 느낌입니다.
그리고 이 상태에서 에러가 많이 생기는 폰은 갤럭시넥서스입니다.
참고하세요.