마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Paint.getTextWidths() 성능 확인 부탁드립니다.

0 추천
제 폰은 갤럭시S2(KT)인데 초기 진저브래드에서 ICS를 거쳐 현재는 젤리빈(4.1.2)까지 업그레이드해서 사용중입니다.
그리고 텍스트파일 내용을 보는 앱을 만들어 사용 중인데 단순히 텍스트파일 내용을 TextView에 setText()해서 본다고 생각하시면 될 것 같습니다.

이 앱이 예전 진저브래드에서는 화면에 파일 내용이 표시되는 시간이 빨랐습니다.
그런데 ICS로 업그레이드 되면서 갑자기 진저때보다 엄청 느려졌습니다.
그리고 젤리빈으로 업그레이드 될때는 ICS보다 비슷 아니면 약간 더 느려진것 같습니다.

그래서 원인을 분석해봤는데요.
TextView에 setText()를 하게되면 WordWrap 처리를 위해 Paint.getTextWidths()를 사용해서 각 글자의 width를 구한 후 TextView의 width를 넘기지 않게 어디서 글자를 꺽어야 하는지를 계산하게 됩니다.
문제는 여기서 사용되는 Paint.getTextWidths()가 ICS부터 엄청 오래 걸립니다.

인터넷 찾아보니 안드로이드가 ICS부터 그래픽 관련 네이티브 라이브러리를 바꿨다고 하던데 이것 때문에 느려진게 아닌가 싶은데요.

테스트 코드를 만들어 시간을 체크해봤습니다.

화면의 TextView에 paint.getTextWidths()의 수행시간을 출력하는 코드입니다.
-------------------------
final TextView tv = (TextView)findViewById(R.id.tv);
tv.post(new Runnable() {
   public void run() {
     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < 1024 * 1024; i++) {
       sb.append("가");
     }
     TextPaint paint = tv.getPaint();
     float[] widths = new float[sb.length()];
  
     long s = System.currentTimeMillis();
     paint.getTextWidths(sb.toString(), widths);
     tv.setText(String.format("%,d ms", System.currentTimeMillis() - s));
   }
});
-------------------------

애뮬레이터에서 안드로이드 버전별로 테스트한 결과인데 아래와 같습니다.
-------------------------
Android 2.2 : 905 ms
Android 2.3.3 : 1,042 ms
Android 4.0.3 : 10,853 ms
Android 4.1.2 : 19,913 ms
Android 4.2 : 20,603 ms
-------------------------

이건 애뮬레이터 결과라 안드로이드 버전별 기기별 테스트를 해보고 싶은데 전 갤2밖에 없네요.

지금까지 확인한건 알파벳, 숫자는 버전별로 별 차이가 없는데 한글이 특히 심하고, 폰트와도 관련이 있는것 같은데 기본폰트보다 나눔고딕으로 하면 젤리빈에서 30 ~ 40%정도 빠릅니다.

암튼 저는 안드로이드가 ICS부터 Paint.getTextWidths()의 네이티브 코드가 성능에 문제가 있다고 생각합니다.

혹시 종류별로 기기를 보유하신 분이 있다면 다양하게 테스트 부탁드립니다.

제 폰의 결과입니다.
SHW-M250K v4.1.2
기본폰트 : 약 2,330 ms
나눔고딕 : 약 660 ms

긴 글 읽어주셔서 감사합니다.
inetjava (180 포인트) 님이 2014년 1월 14일 질문
흠...그래픽관련 문제면, manifest에 hardwareAccelate 속성을 주고 한 번 테스트 해보면 어떨까 싶습니다. (속성을 쓰면 CPU가 아닌 GPU에서 처리를 하기 때문에 속도 향상에 도움을 주지 않을까 싶네요)
hardwareAccelate는 true, false 둘 다 똑같습니다.
폰트에만 영향을 받습니다. 기본 폰트는 엄청 느립니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...