본문 바로가기

[OPENGL ES] FloatBuffer allocation 관리를 통한 그래픽 최적화 앱 메모리 검사를 하면서 쌓이는 ByteBufferAsFloatBuffer, ByteBufferAsShortBuffer 등 때문에 의아해 했었고, 이것들이 OpenGL draw에 필수적인지, 항상 allocation 해주어야 하는지 서치와 실험을 계속했다. 결과적으로 ByteBuffer를 FloatBuffer에 nativeOrder로 간접적으로 할당해주어야 하는 방법은 일반적인데, 이를 한 픽셀을 draw 할 때마다 해 줄 필요는 없는 것이었고, 최초 draw를 시작하는 onSurfaceCreated 에서 한번 수행해주는 것으로 드로잉에 문제가 없음을 확인할 수 있었다. 다만, memory allocation은 한번으로 족하지만 이를 float 배열로 받아 put(values) 하고 position(0)..
[안드로이드] 디코딩 함수를 return 값을 통해 값을 넘기지 않고 변수 자체를 다루도록 해보았다 앱에서 블루통신을 통해 들어오는 바이트를 디코딩을 해주는 함수가 있었는데, 이는 디코딩된 함수를 Arraycopy해 return으로 넘겨주는 방식이었는데, 즉 디코딩은 물론 따로 디코딩된 return 값을 받는 바이트 array도 따로 필요했다. 여기서 데이터를 처리하는 속도와 별도로 필요가 없어진 바이트 값들이 쌓이고 있는것이 아닐지 생각했고 디코딩 함수에서 return 값을 제하고 void 형으로 바꾸어주고, 로컬로 선언된 바이트배열을 직접 다루도록 했다. 결과는 성공적이다. 불필요하게 배치되고 메모리 및 GC시에 성능 저하를 일으키던 바이트들을 메모리에서 치워내는 데 성공했다. 수정 이전에는 실제로 참조하는 바이트 배열은 4군데 정도밖에 되지 않는데, 필요..
[안드로이드] handler의 static final화를 통한 메모리 Leak 해결 앱 테스트 중 메모리 leak으로 인해 메모리 allocation이 지속적으로 쌓이고, 결과적으로 앱 실행속도가 점진적으로 크게 느려지는 현상이 계속되고 있었다. 원인을 파악하고자 안드로이드 스튜디오의 android profiler를 실행해두고 테스트를 약 10분에서 20분 가량 진행했다. 테스트를 진행하면서 종류별 메모리 사용량을 체크하였고, 고정된 구간과 주로 적체되는 구간들을 체크하였고 테스트 이후 메모리 덤프로 할당된 메모리의 상세 내용을 체크해보았다. 체크 결과 생각보다 상세하게 주로 적체된 메모리의 상세 내용을 찾아볼 수 있었다. 문제는 특정 액티비티가 진작에 종료되고 사라졌어야 하는 시점에 사라지지 않고 테스트를 수행한 횟수만큼 딱 쌓여있다는 것이었다. 이와 관련된 다른 메모리들을 참조해보았..
[안드로이드] 아이콘 스왑 애니메이션을 만들고 싶을 때, 두 개의 핸들러를 둘 것. 메인 메뉴에서 선택에 따라 선택된 아이콘들이 스왑되도록, 즉 기존에 선택된 아이콘은 본래 자리로 되돌아가고 새로 선택한 아이콘이 중앙에 자리하도록 하는 것이었는데, 기존에 한 개의 핸들러에서 수행하니 핸들러 내부의 모든 코드를 수행하게 되어 아이콘들이 스왑되지 않고 전부 제자리로 가버리는 골치아픈 문제가 있었다. 게다가 핸들러 안에서 다시 자기 자신으로 메세지를 보내는 재귀적 구조때문에 이런 현상이 더 두드러지게 생기는건 아닐까 싶었다. 해결책으로 별도의 핸들러를 선언해두고, 재귀적으로 메세지를 보내지 않고 별도의 핸들러로 메세지를 보내 아이콘 해재를 할 수 있도록 했다. 그리고 별도로 기존에 선택된 아이콘이 어떤 아이콘인지 저장하는 플래그 변수를 하나두어 이렇게 저장된 플래그 변수를 별도의 핸들러로 보..
[안드로이드] 안드로이드 앱 메모리 최적화 - 이미지뷰 drawable 비우기 안드로이드 앱 최적화를 진행하면서 안드로이드 모니터로 메모리 사용 현황을 체크해봤는데, 생각보다 그래픽 관련 리소스가 메모리에서 비워지지 않고 계속 할당되어 있는 것을 볼 수 있었다. 찾아낸 여러가지 방안으로 첫째 : 우선 통짜 비트맵 객체를 이용할 경우 비트맵.recycle() 을 통해 비트맵 메모리를 놓아줄 수 있다고 한다. 둘째 : 안드로이드 앱에서 사용되는 이미지 뷰들이 참고하는 drawble 소스를 null로 놓아준다. 이미지뷰.setImageDrawable(null); 아래의 세 그래프 캡처는 최적화를 진행하는 중에 메모리의 변화 과정이다. 세 측정동안 측정 시간이 달라 그래프의 굴곡이 달라보이는 것은 측정 시간 탓일 수 있다. 주목할 점은 위와 같은 코드들을 앱에 적용하면서 실제 메모리 사용..
[안드로이드] 특정 이미지뷰의 위치로 아이콘을 움직이자 기존에는 애니메이션을 단순히 수치로만 해서 어느만큼 이동하는 정도를 구현할 때는 쉬웠는데, 레이아웃 안의 특정 뷰로 이동시키는 문제는 다른 문제였다. 일반적으로 기기 화면의 중앙 값을 잡아 이동시키는 것도 생각보다 복잡했고 방안으로 중앙에 정렬해 둔 이미지뷰의 위치를 구해 그곳으로 이미지를 이동시키는 방법을 성공하고자 했다. 우선 뷰에 관련된 좌표를 구할 때 onCreate 이후에 그려지는 경우가 대부분이기 때문에 onCreate 외부에서 좌표를 구해야 한다는 정보를 들었다. 현재 구현하고 있는게 어떤 이미지 버튼을 클릭했을 때 이미지 버튼이 중앙으로 이동하는 것이었기 때문에, 동작 처리 및 UI를 손대주는 Handler 안에서 좌표를 구하고 애니메이션을 실행해주는 것으로 문제를 해결할 수 있었다. 이상..
[안드로이드] 메모리 누수 감지를 위한 LeakCanary 앱에 적용하기 아직도 메모리 누수 문제를 해결하지 못해 여러 방법으로 어디서 누수가 생기는지, 어떤 변수를 손봐야 하는지 감이 잘 오지 않아서 책을 참고하는 중에 LeakCanary라는 무료 라이브러리를 알게 됐다. 중요한건 쓰여진 모든 적용방법을 쓰고도 실행이 되지않아 어떻게 사용할지 잘 몰랐는데 유투브 영상까지 참조하면서 매니페스트 파일까지 건드려야 한다는 걸 알았다. Getting startedIn your build.gradle:dependencies { debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1...
[안드로이드] 안드로이드 디버그 브릿지(adb) 맥 터미널에서 이용하기 이번에 안드로이드 앱 최적화를 위해 책을 한 권 구입했고 메모리 관련 참조를 하기 위해 저자가 adb 명령어를 활용하는 걸 봤다. (adb shell) 처음엔 단순히 안드로이드 스튜디오 터미널에서 adb를 사용할 수 있을거라 생각했는데 명령어를 인식하지 않았고 서치를 해서 맥 터미널에서 adb를 사용하는 방법을 찾았고, 나는 제시된 방법중에 안드로이드 스튜디오가 설치되어 있을때의 방법을 따랐다. Option 3 - If you already have Android Studio installedAdd platform-tools to your pathecho 'export ANDROID_HOME=/Users/$USER/Library/Android/sdk' >> ~/.bash_profile echo 'expo..