Вопрос

У меня есть диаграмма, нарисованная с Coregraphics.

Этот график можно прокрутить горизонтально, и она рисуется, когда мы прокручиваем его.

Проблема в том, что на 3G / 3GS скорость и производительность свитка хороша, но на iPhone 4 медленнее, чем ожидалось.

Я полагаю, что это проблема, связанная с более высоким разрешением iPhone 4. Это правильно?

Как я могу увеличить производительность на iPhone 4? Рамочная автоматическая преобразование для вытягивания на разрешение iPhone 4 или это моя работа?

Спасибо большое.

Это было полезно?

Решение

IPhone 4 может быть много медленнее, когда дело доходит до обработки кооргамента.

Одна возможная идея для вашего дела. Когда пользователь прокручивается, вместо того, чтобы сделать полное разрешение, нарисуйте вашу COREGRAPHICS, связанные с этим контекстом разрешения. Затем возьмите это контекст как растровое изображение и масштабируйте его до полного разрешения. Это было бы только для iPhone4, и вы потеряете хорошее качество более высокого разрешения, но только будь то, когда пользователь прокручивается.

Вот какой-то код, который я записал на тестирование между различными устройствами.

Мои результаты при отображении вида на полном экране.

  • 3G, 9 FPS.
  • 3GS, 16 FPS.
  • I4, 5 FPS. (Bummer)

Coregraphicstestview.h.

#import <UIKit/UIKit.h>
@interface CoreGraphicsTestView : UIView 
{
    int displayCounter;
    float displayInterval;
    char fps[50];
}
@end

Coregraphicstestview.m.

#import "CoreGraphicsTestView.h"
#define RNDN(s, e) ((((CGFloat)rand() / (CGFloat)INT_MAX) * ((e)-(s)) + (s)))
#define RNDX(s, e, r) (RNDN((s), (e)) * (r).size.width)
#define RNDY(s, e, r) (RNDN((s), (e)) * (r).size.height)
#define RNDR(r) (CGRectMake(RNDX(0,0.50,(r)),RNDY(0,0.50,(r)),RNDX(0.50,1.0,(r)),RNDY(0.50,1.0,(r))))
@implementation CoreGraphicsTestView
- (id)initWithFrame:(CGRect)frame 
{
    if ((self = [super initWithFrame:frame])) 
    {
        self.backgroundColor = [UIColor blackColor];
        srand(time(NULL));
        fps[0] = '\0';
    }
    return self;
}
- (void)updateDisplayCounter:(CGContextRef)c rect:(CGRect)rect
{
    displayCounter++;
    float now = (float)clock() / (float)CLOCKS_PER_SEC;
    if (now - displayInterval > 1)
    {
        sprintf(fps, "%0.0f", displayCounter / (now - displayInterval));
        printf("%s\n", fps);
        displayInterval = now;
        displayCounter = 0;
    }
    CGContextTranslateCTM(c, 5, 40);
    CGContextScaleCTM(c, 1.0, -1.0); 
    CGContextSetFillColorWithColor(c, [UIColor whiteColor].CGColor);
    CGContextSelectFont(c, "Arial", 18, kCGEncodingMacRoman);
    CGContextShowTextAtPoint(c, 0, 0, fps, strlen(fps));
}
- (void)setRandomColor:(CGContextRef)c
{
    CGFloat components[4] = {1,RNDN(0, 1),RNDN(0, 1),RNDN(0, 1)};
    CGContextSetFillColor(c, components);
}
- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext(); 
    for (int i=0;i<5;i++)
    {
        [self setRandomColor:c];
        CGContextFillRect(c, RNDR(rect));
        [self setRandomColor:c];
        CGContextFillEllipseInRect(c, RNDR(rect));
    }
    [self updateDisplayCounter:c rect:rect];
    [self performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0.0];
}
@end

Другие советы

Опыт «Медленнее», не могли бы вы описать его более точно? Я предполагаю, что частота кадра прокрутки была снижена, где она не выглядит гладкими или даже заискателями.

Если это так, и если вы уверены, что это разрешение, которое является причиной этого, есть два общих метода, которые я вижу.

  • Обновите например, половину интервала, рендеринг половины как широкие ломтики. Если Cocoa Touch не облегчает то, что вы можете вызвать обратный вызов при временном интервале из метода рендеринга, который вы имеете сейчас.
  • Сделайте «дальше заранее», так что часть графа, скрытая дальше снаружи, отображаемая область, отображается, когда она прокручивается в поле зрения.

Я предполагаю, что вы уже смотрели на «рисунок» свойства вида, непрозрачного и т. Д., поскольку они влияют на производительность.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top