ng-japan

Angualrjsの日本初のカンファレンス ng-japan2015 が渋谷で2015/03/21にあったので行って来た。
場所はサイバーエージェント。以前参加した勉強会もここでやってた気がする。
毎度の通り、最初の1個目のセッションはあんまり聞けなかった。

結構人がいて定員500名の会場が普通に埋まってた
こんなかんじ↓

今回アシアルの田中さんのセッションが個人的に面白かったのでそちらにフォーカスして書いています。

onsen-uiのはなし

AngularとOnsen UIで作る最高のHTML5ハイブリッドアプリ

HTML5ハイブリッドアプリとは

ネイティブのアプリとは違って、View部分をHTMLで記述。 ネイティブ層、HTML5層があって内部はHTML5で作っている。
アプリ内ではWebviewを利用している。

###メリット

  • クロスプラットフォーム性
  • ネイティブ機能をJsから呼び出し
    • ハイブリッド用のCordovaから呼び出し
      • OSからのAPI呼び出しを一本化する

###色々メリットはあるがしかし…

  • ハイブリッドアプリは作ってみたものの…
  • Facebookでザッカーバーグの発言。“HTML5にかけたのは失敗”

###しかし状況は変わってきた

  • モバイルの高速化
  • CrossWalkだったり、ChromiumがWebviewに使われたり。
  • DHH(Rails作者)によるハイブリッドアプリに関する好評

###デメリット

  • UIコンポーネントが標準で持っていない
  • チューニングの方法が難しい

##チューニングの方法

  • インスペクタのTimelineタブで計測
  • AndroidではChrome・iOSではsafariのinspecter
  • タイムラインタブのカテゴリの説明(図)
  • 描画が始まって16ms以下に抑えると60fps以上出る
    • 逆にそれ以上だしてもディスプレイが追いつかない

チューニング対象となる5つのフェーズ

  • Loading
    • リソースの読み込みやパース
    • 組み込みなのであんまやることない
  • Scripting
    • JavaScriptの実行時間。純粋な計算は基本的に問題なし。
    • リフロー、Canvasへの命令など時間はかかる
    • ProfileTabで簡単にわかる
  • Rendering
    • レイアウト処理
    • 再計算(Recaluculate Style)
    • CSS OMを参照してDOM*CSSルールの数分マッチング処理が走る。
    • 使ってないCSSのルールマッチングの文だけ遅くなる
    • 重たいCSSのセレクタの書き方
      • 子孫セレクタやめたほうがいい
      • クラスで指定する書き方が速い
    • 使ってないCSSのルールは消す。
  • Layout
    • すべてのDOMのレイアウト情報を計算
    • 計算された結果の視野的なオブジェクトのツリーがレンダリングツリー
  • Painting
    • 描画処理
    • DisplayListの生成
    • Rasterize
      • ピクセル化
    • CompositeLayeers
      • レイヤの合成

雑多なチューニングの小話

  • translate3d(0,0,0)が早いのはなぜ?
    • GPUで描画されるから? -> 半分正解
    • Compositelayersのみ計算される transformなどはCompositeLayersのみ走る
  • 詳しくはCSS Trigersでググること。
    • CSSをいじるとどのフェーズで計算されるかが書いてある!
  • DOMリークを防ぐ
    • DOMが参照されたまま開放されない。
    • 見た目より深刻
    • detached DOMツリーとそれに参照されている
    • リソースが全てリークする
    • DesktopOSはスワップするが、モバイルは画面上の要素消したりするので注意。
  • reflowを起こさないようにする
    • 画像のサイズは必ず指定する
    • 一度DOMツリーから切り離して操作する
    • offsetHeightやgetBoudingClientRect()を呼び出しつつstyleを変更するみたいなコードをループで書くと地獄
  • GPUバウンド
    • CPUよりもGPUの方で時間がかかっている状態
    • Rasterize後にテクスチャとしてGPUのVRAMに転送
      • Composite Layers
    • GPUへの転送や合成がCPU時間よりも時間がかかっていればGPUバウンドとしてみなすことができる

チューニングには罠がある

  • レンダリングエンジンの実装に依存
  • どうしてもわからないときはWebKitやChromiumのコードを読むしかない。
  • HTML5でアプリを書きたいだけなのになぜChromiumのコードを読んでいるのか
  • CSSを書いているだけなのにGPUのVRAMへの転送速度を着にしなければならないのか?
  • 開発期間の限られるアプリ開発者がここまでのチューニングを要求するのは酷

Onsen-ui

  • Angularベース
  • HTML拡張、UIのコンポーネント
  • Adobeの高速なCSSフレームワーク TopCoat を利用
  • パフォーマンスチューニング済。
  • ui-component により、コンポーネントのデザインを簡単に変更可能

##QA

  • ionic(海外製のAngular+Cordovaを用いたハイブリッドアプリUIフレームワーク)と比較。
    • パフォーマンスチューニング済であること
    • Androidベースでの最適化(ionicはiOSをメインでサポートしているとのこと)
    • 日本語のドキュメントが豊富

他にも興味深いセッションがあったが、メモをあまりとっておらず、下記資料ベースm(_ _)m。

Routing in Angular

ブライアン@braiantfordより 新しいRoutingの仕組みについて

TypeScript + Angular

ng-japan 2015 TypeScript+AngularJS 1.3

TypeScriptの布教活動が行われた。

Angular2の話

資料は こちら。

気になった話は下記。

  • Angular1.0と2.0はコードベースとして似てはいないが、基本概念は同じ。
  • Googleでは2000ものアプリがAngularで書かれている
    • 2015/05から一部プロジェクトが実際に利用をはじめる。
  • パフォーマンスチューニング用のツール
    • BenchPress
  • 2.0による高速化について
    • ViewCache

その他

  • angular watchers
    • 自分が帰ったあとのスポンサードLTの中で紹介されてたっぽい