フラッシュ要素の上に html 要素 (リストを含むモーダル ウィンドウなど) がある場合、大きなパフォーマンスの問題が発生し、フラッシュのアニメーション中にブラウザがその上にある html を再描画する原因となることが知られています。アニメーション化された canvas 要素の上に html 要素がある場合、同じことが起こるのだろうか。
私はキャンバスゲームを構築しているので、キャンバスに描画せずにDOMを使用してGUI(メニュー、ナビゲーションボタンなど)を作成することをお勧めします。
フラッシュ要素の上に html 要素 (リストを含むモーダル ウィンドウなど) がある場合、大きなパフォーマンスの問題が発生し、フラッシュのアニメーション中にブラウザがその上にある html を再描画する原因となることが知られています。アニメーション化された canvas 要素の上に html 要素がある場合、同じことが起こるのだろうか。
私はキャンバスゲームを構築しているので、キャンバスに描画せずにDOMを使用してGUI(メニュー、ナビゲーションボタンなど)を作成することをお勧めします。
Chromium バージョン 28.0.1500.45 Mageia.Org 3 (205727) を使用してテストしたところ、キャンバスのアニメーション中に要素が再描画されません。
この単純なボックス アニメーションに DIV を重ねてみました。その後、アプリケーションのプロファイルを作成して、何が起こっているかを確認しました。キャンバスだけが塗り直されていることに気づきました。
window.requestAnimFrame = (function(callback) {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
var GX = 0;
function animate() {
var canvas = document.getElementById('jaja');
var context = canvas.getContext('2d');
// update
GX += 10;
if (GX > 500) GX = 0;
// clear
context.clearRect(0, 0, canvas.width, canvas.height);
// draw stuff
context.beginPath();
context.rect(GX, 10, 100, 100);
context.fillStyle = '#8ED6FF';
context.fill();
context.lineWidth = 1;
context.strokeStyle = 'black';
context.stroke();
requestAnimFrame(function() {
animate();
});
} // request new frame
続いて、テキストを選択してDIVをリペイントさせてみました。今回ははい、DIV を再描画しました。
これがプロファイルのスクリーンショットです。
1: アニメーションを実行するたびに、ペイント (600x586) が呼び出されていることがわかります。
2: テキストを選択したときにのみ、DIV 要素の Paint が呼び出されました。
個人的には、他のブラウザーがこれとは異なる動作をするとは思いません。