안녕하세요? 주말내내 고민고민 해보다가 혼자서는 답이 안 나오는것 같아, 조언을 구하고자 글 올립니다.
현재 개발하고 있는 안드로이드 앱이 있습니다.
Bamboo paper라던가 Inkredible 같이 터치를 하는데로 선을 그리기도 하고, 도형 도구를 선택해서 원, 사각형, 세모 등을 그리기도 합니다.
이미지를 추가해서 이미지도 화면에 뿌려지게끔 하고 이미지에 대한 확대/축소 기능도 있습니다. 전체화면 확대/축소도 있고요.
현재까지는 일정 크기의 비트맵을 생성&유지하고 Canvas를 통해 그 비트맵에 모든 그래픽들을 그리고, surfaceview에 뿌리는 방식을 사용하고 있습니다.
처음부터도 그려지는 속도가 그리 빠르지는 않았는데, 제가 할 수 있는 최적화를 조금 해봐도 속도가 개선되어 보이지 않아서 아예 그리는 방식을 바꿔보려고 합니다.
저도 겪어보기도 하고, 인터넷 검색에서도 종종 나오듯이 Canvas를 통한 그리기로는 답이 안 나오는것 같아서 다른 방법을 생각해봤습니다.
1) jni를 통해 skia 라이브러리를 이용해서 그리기를 시도.
장점 : canvas가 이미 의존하고 있는 라이브러리라 Canvas와 bitmap하고 결합이 비교적 쉬움
단점 : 제가 알아본 바로는 ndk support library의 jnigraphics에는 bitmap access외에는 지원을 안하는걸로 봤었고, 제가 skia를 포팅해야 되더라고요.
2) opencv (opencv for android 아니고요 ㅎ) 를 포팅해서 opencv를 이용해서 그리기를 시도
장점 : jni 레벨에서 그리기를 시도하므로 훨씬 빠를것임?, opencv는 예전에도 다뤄봤습니다.
단점 : opencv 포팅;;
3) GLSurfaceView + opengl es 를 이용해서 그리기를 시도.
장점 : gpu가속을 사용한 빠른 그리기 (canvas에서도 가속은 사용하고 있었지만 충분한 속도는 나오지는 않기에.)
단점 : opengl es로 그리는 방법을 배워야 하는 것 같네요.
2 아니면 3 을 선택하게 될것 같은데, opencv를 사용하는게 전체 로직을 덜 바꿀것 같긴 한데, 과연 속도에 있어서 만족을 할지 걱정입니다.
opencv를 사용해서 그리는 로직만 바꿔도 충분한 속도 개선이 이루어질까요?? jni 레벨에서 그래픽 작업을 하는게 자바레벨에서 canvas 사용보다는 빠르다는건 알고 있지만 과연 부드럽게 그리기가 가능할지..
질문 요약 :
opencv 사용만 해도 만족할만한 (플레이스토어에 올라가도 문제 없을듯한;;) 그리기 성능을 향상 시킬수 있나요?