株式会社ブリッジ・メタウェア
(株)ブリッジ・メタウェアの社員ブログです。
開発していく中での発見や情報を発信していきます!

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
トラックバック
この記事へのトラックバックURL

Tweetback from ISHITOYA Kentaro

[iPhoneSDK] / UIBezierPathの描画で注意するべきこと « BridgeMetaware http://htn.to/xrHhUB

at 04:47 2010/12/04
Tweetback from Hiroshi Hashiguchi

アンチエイリアスが有効だとかなり遅い。>> UIBezierPathの描画で注意するべきこと « BridgeMetaware http://bit.ly/foLkI4

at 07:49 2010/12/02
Tweetback from ブリッジ・メタウェア

【ブログ更新】 UIBezierPathの描画で注意するべきこと – iOS3.2からUIBezierPathが利用できるようになりました。2次元グラフィックを扱う人にとっては朗報ですね。ところが、実際にUIBezierPath… http://wp.me/p18NTR-8E

at 09:45 2010/11/18
ENTRY
  • UIBezierPathの描画で注意するべきこと
  • iPhone4でVGA出力
  • iPhoneアプリ審査落ち
  • OpenGLで省電力
  • iPhone/iPadアプリでのXMLパース
  • 実機で画像が表示されない
  • iPhone/iPadクライアントとサーバ間通信
  • バージョンアップ承認
  • アプリ更新
  • IBを使わない開発
  • CATEGORY
  • iPhone/iPad開発 (9)
  • Objective-C (2)
  • OpenGL (1)
  • その他 (1)
  • コラム (2)
  • 技術情報 (5)
  • 未分類 (2)
  • 製品情報 (2)
  • ARCHIVE
  • 2010年11月 (6)
  • 2010年10月 (5)
  • RECENT TRACKBACKS
  • 2011/7/12 OpenGLで省電力 « BridgeM...
  • 2011/6/21 今度TBXMLと速度比較し...
  • 2010/12/4 [iPhoneSDK] / UIBezierPathの...
  • 2010/12/2 アンチエイリアスが有...
  • 2010/11/28 iPhone/iPadアプリでのXML...

  • BM ON FACE BOOK
    Copyright © 2011 Bridge Metaware Co., Ltd. All Rights Reserved.