iOS3.2からUIBezierPathが利用できるようになりました。
2次元グラフィックを扱う人にとっては朗報ですね。
ところが、実際にUIBezierPathを使ってプログラミングしていたら驚くべきことが分りました。
UIBezierPathを使って多めの線分(3000本)を一気に描画してみました。
(1)普通のケース
- (void)drawRect:(CGRect)rect {
// 諸々描画準備
UIBezierPath *path = [[UIBezierPath alloc]init];
//path.lineWidth = 2; // 2ptの太線にする(今はコメントアウトしておく)
for (int i = 0; i < 3000; i++) {
double sx = (rand() % 10) / 10.0 * w;
double sy = (rand() % 10) / 10.0 * h;
double ex = (rand() % 10) / 10.0 * w;
double ey = (rand() % 10) / 10.0 * h;
[path moveToPoint:CGPointMake(sx, sy)];
[path addLineToPoint:CGPointMake(ex, ey)];
}
CGContextSetRGBStrokeColor(context, 1, 0, 0, 1);
NSTimeInterval started = [[NSDate date] timeIntervalSinceReferenceDate];
[path stroke];
NSLog(@"done:%f", ([[NSDate date] timeIntervalSinceReferenceDate] - started) * 1000);
}
実行結果は
>done:265.557945
300ミリ秒弱、ちょっと遅い感じもしますが、、、こんなものでしょうか。
(2)太線にしたケース
上のコードの以下の部分を有効にしてみます。
path.lineWidth = 2; // 2ptの太線にする
実行結果は
>done:178170.634985
え?180秒?3分掛ってる?何かの間違いか?もしや、、これはJavaでも散々問題が発生したアレか?
試しにアンチエイリアスをオフる。
実行結果は
>done:809.293985
うぅ、やっぱり。
大量のグラフィックを描画する場合には、アンチイリアスが必要なものとそうでないものを分けて描画しましょう。
方法はこんな感じです。
// アンチエイリアスをOFFにする。 CGContextSetAllowsAntialiasing(context, false); CGContextSetShouldAntialias(context, false);
せっかくの美しい画面がジャギジャギですが、背に腹はかえられません。
何かもっと良い方法があるに違いないのですが、今のところ分りません。
| |trackbacks(3) |18:45 2010/11/18 |
[iPhoneSDK] / UIBezierPathの描画で注意するべきこと « BridgeMetaware http://htn.to/xrHhUB
アンチエイリアスが有効だとかなり遅い。>> UIBezierPathの描画で注意するべきこと « BridgeMetaware http://bit.ly/foLkI4
【ブログ更新】 UIBezierPathの描画で注意するべきこと – iOS3.2からUIBezierPathが利用できるようになりました。2次元グラフィックを扱う人にとっては朗報ですね。ところが、実際にUIBezierPath… http://wp.me/p18NTR-8E