canvasをより速く(Flashもサポート)
本文
uupaa.js には uuCanvas.js のコードが入ってましたが、色々と書き直して、またちょっと速くなりました。
また、レンダリングバックエンドに Flash を追加しました。
マルチバックエンドっす
これで、<canvas> + SVG, VML, Silverlight, Flash をドライブするコードが入りました。
具沢山ね。
デモ
以下のデモページを IE6〜IE8 で開くと、様々なバックエンドでレンダリングするようにしてあります。
# Firefox, Safari, iPhone, Google Chrome, Opera で開くと <canvas> でレンダリングします。
boost ボタンをポチッとすると、オレオレ拡張メソッド ctx.lock(), ctx.unlock() が発動し fps が +5〜+10 ぐらい UP します。CPU 負荷もちょっと下がります。
- AutoDetect
- Silverlight → Flash → VML 順にバックエンドを探索
- Flash 優先
(boostできないよ。boostすると暴走するよ)- Flash → Silverlight → VML 順にバックエンドを探索
- Silverlight 優先
- Silverlight → Flash → VML 順にバックエンドを探索
- VML のみ
- ExplorerCanvas
開発用 PC では
- Silverlight - 60fps, CPU負荷 20〜30%
- Flash - 20fps, CPU負荷 65〜75%
- VML - 30fps, CPU負荷 60〜70%
- ExplorerCanvas - 20fps, CPU負荷 60〜70%
な感じです。
Flash が期待したよりも速くない
Flash の負荷 + JavaScript の負荷により、草食系PC では厳しい結果に。
バックエンドオーダー
バックエンドの探索は、デフォルトで以下のオーダーになっています。
- Silverlight3+
- Flash9+
- VML
VML が最後です。
コードもちょっと綺麗にした
コードが「くーろーまじゅーつー」だそうなので、シマウマぐらいに書き直した(つもりだ)よ。
何が大変って
- Flash がなんだかちっとも速くならない
- でも、10日前よりは大分速くなってる
- 複数のバックエンドでレンダリング結果に互換性を持たせなきゃならない
- シングルバックエンドならそんな面倒も無いんだけどね
な感じ
リンク
Web開発者で Silverlight をまだ入れてない方は、これを機会にちょこっとと入れてみてくださいな。
- Silverlight4βダウンロード http://msdn.microsoft.com/ja-jp/silverlight/bb187452.aspx
- uupaa.js Revision 237 ChangeSet
追記
最近のバージョンでは、以下の仕様変更が入ってます。
- window.CanvasRenderingContext2D を定義しません(以前はしてました)
- window.CanvasGradient を定義しません(以前はしてました)
- window.CanvasPattern を定義しません(以前はしてました)
- window.TextMetrics を定義しません(以前はしてました)
- document.createElement をラップするようなムチャなコードはとっぱらいました(Safari3.x のサポートを廃止したので)
- <canvas>を動的に作るには、uu.canvas() ではなく、uu.canvas.create() を使ってください。
- canvas のリサイズは、ctx.resize(width, height) を呼んで下さい。
Flash モードの実装はまだスカスカですよ。