SlideShare a Scribd company logo
TalkNote × Frontrend
レンダリングを意識した
パフォーマンスチューニング

@pocotan001
Hayato Mizuno
なぜ最適化が必要か
 Webの閲覧時はあらかたレンダリングにコストを
かけている(スクロール、他ユーザー操作など)
 ユーザーはOSとの感触が大きく違うものに違和感、
またはストレスを感じる
 時に過剰なバッテリー消費、画面のチラつきなどの
二次災害を引き起こす
SETTINGS⚙
開発ツールの準備
Google Chrome Canary Safari
defaults write com.apple.Safari IncludeInternalDebugMenu 1
@黒い画面(Macのみ)
SETTINGS⚙
}下2つあればおk
SETTINGS⚙
ない場合は有効にチェック(あれば 規定で)
SETTINGS⚙ about:flags
REFLOW
PAINT
CSS ANIMATION


REFLOW

REFLOW http://inception-explained.com/
paint
HTML
DOM
CSSOM
CSS
レンダーツリー
視覚部分を
表すツリー
REFLOW
REFLOW http://www.youtube.com/watch?v=ILvF25ljaoM/
html
head body
title h1 p
[text node] [text node] [text node]
REFLOW
DOMツリー
display:blockroot
head body
title h1
[text line] [text line]
ツリーに挿入されない要素
REFLOW
レンダーツリー
p
[text line]
root
head body
title h1
[text line] [text line]
位置やサイズの変更を伴う → リフローあり
display:none
REFLOW
ツリーに挿入されない要素レンダーツリー
p
[text line]
visibility: visibleroot
head body
title h1
[text line] [text line]
p
[text line]
REFLOW
ツリーに挿入されない要素レンダーツリー
root
body
h1
[text line]
p
[text line]
visibility: hidden
位置やサイズの変更を伴わない → リフローなし
REFLOW
ツリーに挿入されない要素レンダーツリー
head
title
[text line]
Debug > Show Render TreeREFLOW
REFLOW Debug > Show Render Tree
$('p').css('margin', '5px')
$('p').css('margin', '5px')
REFLOW
リフローx2?
1 位置変更がないため
REFLOW
$('p').css('margin', '5px')
.css('padding', '5px')
.css('top', '5px')
.css('left', '5px');
REFLOW
リフローx4?
1 可能な限り収束される
REFLOW
REFLOW
リフロー?
 display
 visibility
 color
 border
 border-radius
REFLOW
リフロー?
 display
 visibility
 color
 border
 border-radius
リフローなし
リフローなし
リフローなし
REFLOW
リフローのトリガー
http://kellegous.com/j/2013/01/26/layout-performance/
 スタイルの変更
css(), addClass(), show(), animate() ...
 DOMノードの変更
html(), text(), append(), focus() ...
 特定のプロパティの取得
offset(), position() ...
 レイアウト変更の原因となる操作
ウィンドウサイズの変更, スクロール, テキストの入力 ...
$('<p>test</p>').appendTo('body').hide();
生成時に色々と追加が
必要なケース
REFLOW
Example 1
$('<p>test</p>').hide().appendTo('body');
描画する前に行う
REFLOW
Example 1
Before
REFLOW
Example 1
After
REFLOW
Example 1
$('<img src="200x100.jpg">').
appendTo('body');
imgを生成するケース
REFLOW
Example 2
$('<img src="200x100.jpg" width="200"
height="150">').
appendTo('body');
描画の領域を明示しておく
REFLOW
Example 2
Before
REFLOW
Example 2
After
REFLOW
Example 2
$('p').css('top', $target.offset().top)
.css('left', $target.offset().left);
複数回に分けて実行されるcss()
REFLOW
Example 3
$('p').css({
top: $target.offset().top,
left: $target.offset().left
});
1回のcss()にまとめる
REFLOW
Example 3
$('p').css({
top: $target.offset().top,
left: $target.offset().left
});
リフローが必要な取得系メソッド
REFLOW
Example 3
var offset = $target.offset();
$('p').css({
top: offset.top,
left: offset.left
});
可能ならキャッシュして使い回す
REFLOW
Example 3
Before
REFLOW
Example 3
After
REFLOW
Example 3
<script src="jquery.js"></script>
<script src="jquery-ui.js"></script>
<script>
$(function(){ $('#target').accordion(...); });
</script>
</body>
UI表示後にスタイルを変更するケース
REFLOW
Example 4
表示 JS 変更
REFLOW
Example 4
<script src="jquery.js"></script>
<script src="jquery-ui.js"></script>
<script>
$(function(){ $('#target').accordion(...); });
</script>
</head>
<head> に移す、またはstyle付けはCSSでやる
REFLOW
Example 4
JS 表示&更新
REFLOW
Example 4
REFLOW
影響する要素を減らす
 アニメーションは固定配置で行う
 スタイルは出来るだけ末端要素で行う
 テーブルレイアウトを避ける
REFLOW http://mir.aculo.us/dom-monster/
REFLOW http://mir.aculo.us/dom-monster/
PAINT

PAINT http://ut.uniqlo.com/
PAINT
リペイントのトリガー
 スタイルの変化による画面の更新
:hover, :active, アニメーション ...
 同位置にとどまる系
position: fixed, background-attachment: fixed ...
 画面更新の原因となる操作
ウィンドウサイズの変更, スクロール, テキストの入力 ...
特にペイントに時間のかかるもの
http://perfectionkills.com/profiling-css-for-fun-and-profit-optimization-notes/PAINT
値や組み合わせによってはより高コスト
 color: rgba()
 opacity
 background: linear-gradient()
 border-radius
 text-shadow
 ... etc
http://codepen.io/pocotan001/full/weJDHPAINT
http://codepen.io/pocotan001/full/weJDHPAINT
PAINT
1-5を繰り返し
1. 「Timeline」であたりを付ける
2. 「continuous page repainting」をチェック
3. `H`ショートカットを使い要素を特定
4. ネックになっているスタイルを特定
5. そのスタイルが必要かどうかを検討
PAINT
First paint
var fp = chrome.loadTimes().firstPaintTime -
chrome.loadTimes().startLoadTime;
console.log('First paint: ' + fp);
http://goo.gl/H1JfA
CSS ANIMATION
http://frames-per-second.appspot.com/CSS ANIMATION
CSS ANIMATION
GPUハック (null transform hack)
 -webkit-transform: translateZ(0)
 -webkit-transform: translate3d(0,0,0)
 -webkit-transform: preserve-3d;
 -webkit-backface-visibility: hidden;
 ...etc
CSS ANIMATION
GPUハック (null transform hack)
 -webkit-transform: translateZ(0)
 -webkit-transform: translate3d(0,0,0)
 -webkit-transform: preserve-3d;
 -webkit-backface-visibility: hidden;
 ...etc
_:(´ཀ`」 ∠):_
http://intely.jp/CSS ANIMATION
http://codepen.io/pocotan001/full/ihvcFCSS ANIMATION
http://codepen.io/pocotan001/full/ihvcFCSS ANIMATION
http://codepen.io/ariya/full/xuwgyCSS ANIMATION
http://leaverou.github.io/animatable/CSS ANIMATION
http://andrew-hoyer.com/experiments/clock/CSS ANIMATION
http://mrdoob.github.io/three.js/examples/css3d_periodictable.htmlCSS ANIMATION
http://dev.sencha.com/animator/demos/redridinghood/CSS ANIMATION
http://tympanus.net/Development/ImageTransitions/index.htmlCSS ANIMATION
http://jsbin.com/efirip/5CSS ANIMATION
CSS ANIMATION
まとめ
 目安は30fps
 動く部分のみ composited layer として分離する
 不要なテクスチャのアップロードを見つける
TalkNote × Frontrend
Thank you

More Related Content

レンダリングを意識したパフォーマンスチューニング

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy