Question

J'ai un tableau dessiné avec CoreGraphics.

Ce tableau peut être horizontale et défilée est dessiné comme nous défiler.

Le problème est que sur les réseaux 3G / 3GS la vitesse et la performance du défilement est bonne, mais sur l'iPhone 4 est plus lent que prévu.

Je suppose que cela est un problème lié à la résolution supérieure de l'iPhone 4. Est-ce exact?

Comment puis-je augmenter les performances sur iPhone 4? Est-ce que le cadre conversion automatique pour tirer sur la résolution iPhone 4 ou est-il mon travail?

Merci beaucoup.

Était-ce utile?

La solution

L'iPhone 4 peut être beaucoup plus lent en matière de traitement des CoreGraphics.

Une idée possible pour votre cas. Lorsque l'utilisateur défile, plutôt que de tirer en pleine résolution, tirer vos CoreGraphics choses liées un contexte de demi-résolution. Ensuite, prendre ce contexte comme une image bitmap et agrandissez à pleine résolution. Ce serait pour iPhone4 seulement et vous perdrez la belle qualité de résolution supérieure, mais seulement pendant que l'utilisateur défile.

Voici un code que j'ai écrit pour le test entre les différents appareils.

Mes résultats lors de l'affichage de la vue en plein écran.

  • 3G, 9 FPS
  • 3GS, 16 FPS
  • i4, 5 FPS (cool)

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

Autres conseils

L'expérience «il est plus lent », pourriez-vous décrire plus précisément? Je suppose que le framerate de la spirale a été réduit à l'endroit où il ne semble pas lisse ou même bégaie.

Si oui, et si vous êtes certain que c'est la résolution qui est la cause de cela, il y a je peux voir deux méthodes générales.

  • mise à jour à moitié par exemple l'intervalle, ce qui rend la moitié aussi large tranches. Si Cocoa Touch ne facilite pas, vous pouvez déclencher un rappel à un intervalle de temps de la méthode de rendu que vous avez maintenant.
  • rendre « plus à l'avance » de sorte qu'une partie du graphique caché plus en dehors de la zone d'affichage est rendu quand il trouve dans la vue.

Je suppose que vous avez déjà regardé les « Dessin » propriétés de la vue, etc. Opaque comme ils affectent la performance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top