ベンチマークUIViewのdrawRect:方法
-
21-08-2019 - |
質問
私はビュー内のカスタム描画を利用する Objective-C で iPhone アプリケーションを作成しています。コードのさまざまなリビジョンをベンチマークして、何が本当に役立つのかを確認したいと考えています。新しいアプリケーションをセットアップし、カスタム描画コードをdrawRectに追加することでこれを行う予定でした。ビューのメソッドを呼び出し、ビュー コントローラーの for ループで送信します。 [UIView setNeedsDisplay]
完了するまでにかかる回数とタイミング。しかし setNeedsDisplay
呼び出しはキャッシュされているようで、for ループで 1000 回呼び出しても、 drawRect:
メソッドは 1 回だけ呼び出されます。また、drawRect を呼び出してみました。直接ですが、描画を行うため、または使用しないときにグラフィックスコンテキストが必要です setNeedsDisplay:
UIGraphicsGetCurrentContext() はコンテキストを提供しません。
助言がありますか?
ありがとう、
カイル
解決
することはできベンチマーク次の手順を実行して、ビューます:
- (NSTimeInterval)timeTakenToDrawView:(UIView *)view count:(NSInteger)count
{
CGRect bounds = [view bounds];
NSDate *startDate = [NSDate date];
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
NSInteger i = 0;
for (i = 0; i < count; i++) {
CGContextSaveGState(context);
[view drawRect:bounds];
CGContextRestoreGState(context);
}
UIGraphicsEndImageContext();
return [[NSDate date] timeIntervalSinceDate:startDate];
}
タグ(それを試していないが、それが動作するはずです)
他のヒント
あなたのNSViewの.mファイルの内部。もちろん、あなたがUIか何かにこれをフックアップすることがあります。
- (void)awakeFromNib {
// Have to wait for the window to be onscreen, graphics context ready, etc
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired:) userInfo:NULL repeats:NO];
}
- (void)timerFired:(NSTimer *)aTimer {
[self lockFocus];
NSDate* then = [NSDate date];
int callIdx = 0;
for( callIdx = 0; callIdx < 1000; callIdx++ ) {
[self drawRect:[self bounds]];
}
NSDate* now = [NSDate date];
[self unlockFocus];
NSLog(@"Took %f seconds", [now timeIntervalSinceDate:then]);
}
- (void)drawRect:(NSRect)rect {
[[NSColor redColor] set];
NSRectFill(rect);
}
あなたもCoreImageのパフォーマンスツールを使用して、あなたのdrawRectが頻繁に使用された場合のフレームレートを取得することができます忘れないでください。
また、そのメソッドに費やされる時間の長さを表示するにパフォーマンスツールの一部を使用することができます。
もう少し詳細な分析ができるものをお探しの場合は、時間プロファイリングに使用できるマクロのセットをここに用意しています。 https://gist.github.com/952456