ブラウザのグラフィック パフォーマンスを測定する方法

Ilmari Heikkinen

ブラウザ グラフィックのベンチマークの概要: スムーズなフレームレートを維持しながら、できるだけ多くのものを描画します。フレームレートが低下すると、フレームごとに描画できる量がわかります。投稿の終了。思いませんか?詳しく説明します。

例:ベンチマーク tick 関数を含む簡単なコード スニペットを次に示します。tick 関数は、描画負荷を増やしながら draw 関数を呼び出し、描画に 33 ミリ秒を超える時間がかかるようになります。

var t, previousTime;
var drawLoad = 1;
var slowCount = 0;
var maxSlow = 10;
// Note, you might need to polyfill performance.now and requestAnimationFrame
t = previousTime = performance.now();
var tick = function() {
    var maximumFrameTime = 1000/30; // 30 FPS
    t = performance.now();
    var elapsed = t - previousTime;
    previousTime = t;
    if (elapsed < maximumFrameTime || slowCount < maxSlow) {
        if (elapsed < maximumFrameTime) {
            drawLoad+=10;
        } else {
            slowCount++;
        }
        draw(drawLoad);
        requestAnimationFrame(tick);
    } else {
        // found maximum sustainable load at 30 FPS
        document.getElementById('res').innerHTML = ("could draw "+(drawLoad)+" in " +
            maximumFrameTime + " ms");
    }
};
requestAnimationFrame(tick);

jsFiddle のライブ例をご覧ください。

ベンチマークが、速度が低下するポイントに達するまで、どんどん描画し続けている様子を確認できます。これは、スムーズなフレームレートで描画できる量を簡単に把握できる方法です。また、独自の描画関数をサンプルにプラグインして、カスタム ベンチマークを行うこともできます。

ブラウザ グラフィックをベンチマークする際の一般的な注意事項と落とし穴

上記の例が適切な方法だとすると、不適切な方法とはどのようなものなのでしょうか。無関係なものをベンチマークする方法や、アプリの実行速度とは何の関係もないように見える奇妙なパフォーマンス指標が得られる方法。お問い合わせいただきありがとうございます。ウェブ上でよく見られる 2 つの問題をご紹介します。

最大 FPS の測定: フレームごとに少しずつ描画して FPS を測定します。基盤となるグラフィック実装が画面の更新レートと同期されるため(1 秒あたり最大 60 回の画面更新)、Chrome のグラフィック パフォーマンスの測定には適していません。Chrome の描画システムでは、描画コマンドがコマンド バッファに格納され、次回の画面更新時に実行されるため、描画呼び出し速度を測定してもあまり意味がありません。

また、setTimeout を使用してグラフィック パフォーマンスを測定することもおすすめしません。ブラウザでは setTimeout の間隔の上限が 4 ミリ秒に設定されているため、最大で 250 FPS しか得られません。これまで、ブラウザによって最小間隔が異なっていたため、ブラウザ A が 250 FPS(最小間隔 4 ms)で実行され、ブラウザ B が 100 FPS(最小間隔 10 ms)で実行されるという、非常に不正確な単純な描画ベンチマークが存在する可能性がありました。明らかに A の方が速いです。いいえ。A が 3 ミリ秒、B が 1 ミリ秒など、B が A よりも描画コードを速く実行している可能性があります。描画時間が最小 setTimeout 間隔より短いため、FPS には影響しません。ブラウザが非同期でレンダリングされる場合は、何が起こるかわかりません。何をしているのかよくわかっていない限り、setTimeout を使用しないでください。

方法

ベンチマークを行うには、現実的な描画負荷を使用し、フレームレートが低下するまで負荷を増やします。たとえば、タイルマップ地形を使ったトップダウン ゲームを作成している場合は、フレームごとにタイルマップを描画して、60 FPS で実行されるかどうかを確認します。はいの場合は、負荷を増やします(フレームごとにタイルマップを 2 回描画し、間にクリアを挿入します)。FPS が新しい安定したレベルに下がるまで、引き続き増やします。これで、フレームごとに描画できるタイルマップのレイヤ数がわかりました。

グラフィック アプリケーションによってニーズが異なるため、そのことを念頭に置いてベンチマークを作成する必要があります。アプリで使用しているグラフィック機能を測定します。遅いシナリオを見つけたら、そのシナリオを再現する最小限のコードにまで削減してみてください(速度を上げたい場合は、new.crbug.com でバグレポートを送信してください)。

高性能のウェブ グラフィック コードの作成方法については、Chrome GPU チームの Nat Duca と Tom Wiltzius による Google I/O 2012 の講演をご覧ください。