2. Who am I ?
• JavaScript 프로그래머
• Mobile Web App 개발
• Jindo Component
• 웹서비스 성능 개선
• 번역
• facebook 그룹 jslounge 운영자
http://www.facebook.com/groups/jslounge
13년 5월 13일 월요일
5. 당시의 Facebook App
• HTML5? 그냥 단순한 모바일 웹페이지
• http://m.facebook.com
• 현재의 모습과 크게 다르지 않았다.
• 네이티브 변경 이후로 점차적으로
UI에 재미있는 요소들 도입
• 제스처, Swipe Image Viewer
13년 5월 13일 월요일
15. fastbook의 특징
• 엄청 빠른 스크롤 속도
• Swipe뷰, 더블탭 줌, 핀치 투 줌/패닝
• 앱 네비게이션 스와이핑/탭핑
• pull to refresh시 모두 리프레시하지 않고 필요한 내용만 업데이트
• 댓글도 스크롤시 자동으로 더보기
• 가로모드지원
• iOS 5 or Android 4.1이상 권장
13년 5월 13일 월요일
16. position:fixed
• 그동안 웹을 앱처럼 사용하지 못했던 가장 큰 이유
• Android ICS(4.0)+, iOS 5+
• 헤더, 푸터 고정
• 컨텐츠영역만 스크롤하려는 UI 구현 시도
13년 5월 13일 월요일
17. 커스텀 스크롤러
• position:fixed처럼 일부를 고정하고 지정된 영역만
touch이벤트로 스크롤할 수 있도록 지원
• iScroll과 같은 라이브러리를 사용
• 또는 직접구현
• 기존의 facebook 앱은???
• 컨텐츠영역만 webview사용
• webview의 디폴트 스크롤 사용
13년 5월 13일 월요일
18. 계속해서 증가하는 목록의
스크롤 구현하기?
• 고정된 목록의 구현은 대부분 해결 가능
• 계속해서 증가하는 목록의 스크롤을 구현하기는
무척 까다로움
13년 5월 13일 월요일
24. 일반적인 스크롤러의 구현
• Viewport를 고정 크기로 지정
• Viewport의 overflow:hidden
• 터치 이벤트로, 적절한 스크롤위치를 계산
• 리스트 컨테이너의
top:스크롤위치px 지정 (position:absolute)
• 또는 transform:translate3d(0, 스크롤위치px, 0)
13년 5월 13일 월요일
31. 리스트 아이템이
계속 늘어나면
• layout해야할 DOM tree의 크기가 증가
• GPU acceleration할 texture의 크기가 증가
• layout에 걸리는 시간도 점점 증가
13년 5월 13일 월요일
32. 스크롤러의 성능문제
• KTH - 하이브리드 앱의 스크롤 성능 개선하기
http://dev.kthcorp.com/2012/06/18/hybrid-
app-scroll-performance-enhancement/
• 각 아이템의 position을 absolute로 변경
• viewport에 보이지 않으면 display:none으로
layout, paint하지 않도록 함
13년 5월 13일 월요일
33. 아이템이 계속해서 증가하는
스크롤러의 성능문제
• DOM이 계속해서 증가
• 처리해야할 노드수가 계속해서 증가
• 아이템이 계속 증가한다면
DOM Tree가 커지는 근본적인 문제에는 해답이 없음
13년 5월 13일 월요일
34. fastbook 스크롤러 DOM구조
• 16개의 아이템만 유지
• 각 아이템의 위치는 모두 position:absolute
• 스크롤되면 이 아이템들의 위치가 바뀜
• 모든 아이템들이 id값을 유지
13년 5월 13일 월요일
52. text 교체 성능
• innerHTML
• vs innerText
• vs nodeValue
• vs textContent
13년 5월 13일 월요일
53. text 교체 성능
• innerHTML
• vs innerText
• vs nodeValue
• vs textContent
http://jsperf.com/innerhtml-vs-innertext/12
nodeValue Wins!
tested on Galaxy s3 Android 4.0.4 & iOS 6.1.2
13년 5월 13일 월요일
54. 아이템의 사이즈 측정
• getBoundingClientRect
• vs offsetWidth / offsetHeight
13년 5월 13일 월요일
55. 아이템의 사이즈 측정
• getBoundingClientRect
• vs offsetWidth / offsetHeight
http://jsperf.com/getboundingclientrect-offsetwidth-offsetheight
offsetHeight Wins!
13년 5월 13일 월요일
56. 아이템의 위치 변경
• 항상 GPU 가속을 이용하는게 최선
• css3 transform : translate3d(x, y, z)
13년 5월 13일 월요일
60. ???
개별 아이템의 높이가 유동적이기 때문에
그려보기 전까지 전체 컨테이너의 높이를 알 수 없다.
13년 5월 13일 월요일
61. TaskQueue
• DOM read와 write가 이벤트 큐를 오랜시간동안
블로킹 하지 않고 실행하도록 작업을 분리
• timer로 쪼개서 별도의 이벤트 루프 턴에서 실행
• READ 큐와 WRITE 큐로 분리
• Ext.TaskQueue.requestWrite()
• Ext.TaskQueue.requestRead()
13년 5월 13일 월요일
63. AnimationQueue
• 앱이 애니메이션을 실행중일 때,
우선순위가 낮은 함수를 나중에 실행시키게 함.
• 앱이 idle상태일 때 지연된 task들을 실행
• 뉴스 피드를 스크롤하는 중에는 이미지 로딩/렌더링을 하지 않음.
• 애니메이션 실행중에도 함께 실행되어야하는 작업들도 짧은 타이
머 단위로 점진적으로 실행시키는 논블로킹 방식으로 수행
• 터치 이벤트가 항상 최우선권
스크롤이 잘 애니메이션 되도록 함.
13년 5월 13일 월요일
66. 관성 스크롤시
감속 지속시간 튜닝
• 네이티브 앱에서는 3초 간 지속,
• 가속은 높이고 감속되는 시간을 1.4초로 줄임.
• 컨텐츠 노출속도를 높일 뿐 아니라,
idle time을 늘리는 효과가 있으므로,
현재 컨텐츠를 읽을 동안 더 많은 백그라운드 작업이
가능해짐.
13년 5월 13일 월요일