5

Tôi đang viết một ứng dụng iPhone trong Objective-C sử dụng một số bản vẽ tùy chỉnh trong quan điểm và tôi muốn chuẩn bị các bản sửa đổi khác nhau của mã của tôi để xem những gì thực sự hữu ích. Tôi đã định làm điều này bằng cách thiết lập một ứng dụng mới, thêm mã vẽ tùy chỉnh của tôi vào phương thức drawRect: của khung nhìn, sau đó, trong vòng lặp for trong bộ điều khiển khung nhìn, gửi [UIView setNeedsDisplay] một số lượng lớn thời gian và thời gian nó cần hoàn thành. Tuy nhiên, các cuộc gọi setNeedsDisplay dường như được lưu vào bộ nhớ cache vì vậy mặc dù tôi gọi nó là 1000 lần trong vòng lặp for, phương thức drawRect: chỉ được gọi một lần. Ngoài ra, tôi đã thử gọi drawRect: trực tiếp nhưng tôi cần một bối cảnh đồ họa để làm một số bản vẽ trong và khi tôi không sử dụng setNeedsDisplay: UIGraphicsGetCurrentContext() không cho tôi một ngữ cảnh.Điểm chuẩn UIView drawRect: phương pháp

Mọi đề xuất?

Cảm ơn,

Kyle

Trả lời

5

Bạn có thể điểm chuẩn một cái nhìn bằng cách làm như sau:

- (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]; 
} 

(đã không thử nó, nhưng nó phải làm việc)

+0

Điều đó hoạt động hoàn hảo, cảm ơn. – Kyle

0

Bên trong .m của NSView của bạn. Rõ ràng bạn có thể muốn kết nối nó với UI hoặc một thứ gì đó.

- (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); 
} 
+0

lockFocus không xuất hiện để có sẵn trên UIViews, Ngoài ra, tôi cần một số cách để có được một bối cảnh đồ họa để vẽ trong drawRect của tôi: function, setNeedsDisplay cung cấp một thông qua UIGraphicsGetCurrentContext() nhưng gọi drawRect: trực tiếp dường như không làm điều tương tự. – Kyle

0

Đừng quên bạn cũng có thể sử dụng CoreImage công cụ hiệu suất và nhận được framerates nếu drawRect của bạn được sử dụng thường xuyên.

Bạn cũng có thể sử dụng một số công cụ hiệu suất để xem khoảng thời gian được sử dụng trong phương thức đó.

0

Nếu bạn đang tìm kiếm cái gì đó có thể đưa ra một chút sâu hơn phân tích, tôi có một tập hợp các macro mà bạn có thể sử dụng cho thời gian profiling đây: https://gist.github.com/952456

Các vấn đề liên quan