実装の内容によって、パフォーマンスがどのように変化があるのか調査してみた。
調査対象
Garminウォッチフェイスの作成:デジタル時計2でゲージを表示しただけで、かなり時間がかかるのが分かったので、ゲージ表示の円弧表示と、テキスト描画時のパラメータでどのように変化があるのか2点調べた。
円弧の描画
drawArcを使った描画
画面の中心を中心に、上半分に半円を描画するもの。
function useDrawArc(dc) {
dc.drawArc(center[0], center[1], center[0] - 3,
Graphics.ARC_COUNTER_CLOCKWISE,
0.0, 180.0);
}
drawLineを使って描画
drawArcと同じような仕様で、頂点をsin/cosで計算して線分描画したもの。
線分頂点を1, 2, 3, 4, 10, 12, 20度単位で計算してみた。
var radius = center[0] - 3;
var prev = [center[0] + radius, center[1]];
var baseAngle = Math.PI / 180.0;
for (var i = 1; i < 180; i++) {
var angle = baseAngle * i;
var now = [center[0] + radius * Math.cos(angle), center[1] - radius * Math.sin(angle)];
dc.drawLine(prev[0], prev[1], now[0], now[1]);
prev = now;
}
dc.drawLine(prev[0], prev[1], 3, center[1]);
drawTextを使っての描画
drawArc/drawLineが同じ形状を描画しているが、こちらは画面中央にテキスト88:88を描画した。
function useDrawText(dc) {
dc.drawText(center[0], center[1], Graphics.FONT_NUMBER_THAI_HOT, "88:88", Graphics.TEXT_JUSTIFY_CENTER);
}
フォント名とjustificationを変えてみた、実行時間を計測してみた。
計測結果
円弧の描画
drawArc、drawLineの結果を、コード時間、グラフィック時間、トータル時間の各時間とその時の描画内容を示す。ちなみに表示時間は、すべて54080なので表には記載せず。
処理内容 |
コード | グラフィック | トータル | 描画結果 |
drawArc | 543 | 184796 | 239416 | |
drawLine(1度) | 81318 | 1912 | 137310 | |
drawLine(2度) | 41187 | 1956 | 97223 | |
drawLine(3度) | 27800 | 1983 | 83863 | |
drawLine(4度) | 21050 | 1995 | 77125 | |
drawLine(10度) | 8900 | 2006 | 64986 | |
drawLine(12度) | 7550 | 2006 | 63636 | |
drawLine(20度) | 4850 | 2008 | 60938 |
drawArcは圧倒的にグラフィック時間が長い。drawLineを使用した場合、分割する数が多くなれば処理時間が長くなる傾向がある。一応分割単位が12度位であれば、実際の円弧との形状の際は1ドット程度なので、そこらあたりが使用時の許容範囲なのかもしれない。
テキストの描画
フォント名 | justification | コード | グラフィック | トータル |
LARGE | CENTER | 612 | 4451 | 59143 |
LARGE | CENTER|VCENTER | 643 | 4451 | 59174 |
MEDIUM | CENTER | 612 | 3727 | 58419 |
SMALL | CENTER | 612 | 3007 | 57699 |
THAI_HOT | CENTER | 612 | 21684 |
76376 |
justificationに関しては、LEFT/RIGHTともにCENTERとコード処理時間は同じだったので、表には不掲載。VCENTERとのORの組み合わせは、OR処理のため、若干処理時間が増えたのか。
グラフィックに関しては、フォントが大きく、実際の描画エリアが増えたことにより、処理時間が増えたものと思われる。(描画面積に比例しているのかな?)
コメント