سؤال

وأنا أكتب تطبيق اي فون في الهدف-C التي تستخدم بعض الرسم المخصصة في وجهات النظر وأود أن التعديلات المختلفة القياسي من قانون بلدي لمعرفة ما يساعد حقا. كنت تخطط على القيام بذلك عن طريق إنشاء تطبيق جديد، مضيفا عادتي كود الرسم إلى drawRect: طريقة العرض، ثم، في لحلقة في وحدة تحكم الرأي، وإرسال [UIView setNeedsDisplay] بعض عدد كبير من المرات، وتوقيت كم من الوقت يأخذ لإكمال. ومع ذلك فإن الدعوات setNeedsDisplay إلى أن يكون مؤقتا وذلك على الرغم أسميها 1000 مرة في لحلقة، ويحصل على استدعاء الأسلوب drawRect: مرة واحدة فقط. أيضا، حاولت استدعاء 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 الخاص بك. من الواضح أنك قد ترغب في ربط هذا الأمر إلى واجهة المستخدم أو شيء من هذا.

- (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 في كثير من الأحيان.

ويمكنك أيضا استخدام بعض أدوات الأداء لمعرفة متى يتم انفاقه في هذا الأسلوب.

إذا كنت تبحث عن شيء يمكن أن تعطي أكثر قليلا من التحليل المتعمق، ولدي مجموعة من وحدات الماكرو التي يمكنك استخدامها لمرة والتنميط هنا: <لأ href = "https://gist.github.com/952456 "يختلط =" نوفولو "> https://gist.github.com/952456

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top