2009-12-04 4 views
0

Plus lent que quoi? plus lent que de créer les mêmes textures à partir d'une image chargée à partir de l'ensemble de l'application. Combien plus lent? 80 fois plus lent sur iPhone, ratio similaire (mais globalement plus rapide) sur Mac.iPhone: créer Texture2D beaucoup plus lent lorsque l'image est chargée à partir du fichier dans les documents de l'application, pourquoi?

Mon exemple ci-dessous montre le chargement d'une image avec imageNamed:; créer des textures à partir de la première image; enregistrer l'image dans un fichier du répertoire Documents de l'application; charger une image de ce fichier; créer des textures à partir de la deuxième image.

Les images sont 640x640 png, 100 textures 64x64 sont créées dans chaque cas. Les temps de création sont de 0,51 s contre 41,3 s.

Quelqu'un peut-il expliquer cette différence énorme, et me montrer les voies et moyens d'accélérer le deuxième cas, de le rendre aussi rapide que le premier, si possible?

Rudif

#import "Texture2D.h" 

#define START_TIMER NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; 
#define END_TIMER NSTimeInterval stop = [NSDate timeIntervalSinceReferenceDate]; NSLog(@"Time = %f", stop-start); 


@interface UIImage (CS_Extensions) 
-(UIImage *) imageAtRect:(CGRect)rect; 
+(NSString *) documentsDirectory; 
+(void) saveImage:(UIImage *)image toDocumentsFile:(NSString *)filename; 
+(UIImage *) imageFromDocumentsFile:(NSString *)filename; 
+(BOOL) documentsFileExists:(NSString *)filename; 
+(void) createTexturesFromImage:(UIImage *)image640x640 texture:(Texture2D **)texture; 

@end; 

@implementation UIImage (MiscExt) 

-(UIImage *)imageAtRect:(CGRect)rect { 
    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], rect); 
    UIImage* subImage = [UIImage imageWithCGImage: imageRef]; 
    CGImageRelease(imageRef); 
    return subImage; 
} 

+(NSString *) documentsDirectory { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return documentsDirectory; 
} 

+(UIImage *) imageFromDocumentsFile:(NSString *)filename { 
    // NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
    NSString *documentsDirectory = [self documentsDirectory]; 
    NSString *path = [NSString stringWithFormat:@"%@/%@", documentsDirectory, filename]; 
    NSLog(@"%s : path %@", __FUNCTION__, path); 
    NSData *data = [[NSData alloc] initWithContentsOfFile:path]; 
    UIImage *image = [[UIImage alloc] initWithData:data]; 
    return image; 
} 

+(void) saveImage:(UIImage *)image toDocumentsFile:(NSString *)filename { 
    if (image != nil) {  // save to local file 
     //  NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
     NSString *documentsDirectory = [self documentsDirectory]; 
     NSString *path = [NSString stringWithFormat:@"%@/%@", documentsDirectory, filename]; 
     NSLog(@"%s : path %@", __FUNCTION__, path); 
     //You can write an NSData to the fs w/ a method on NSData. 
     //If you have a UIImage, you can do UIImageJPEGRepresentation() or UIImagePNGRepresentation to get data. 
     NSData *data = UIImagePNGRepresentation(image); 
     [data writeToFile:path atomically:YES]; 
     // Check if file exists 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 
     BOOL ok = [fileManager fileExistsAtPath:path]; 
     if (ok) { 
      NSLog(@"%s : written file %@", __FUNCTION__, path); 
     } 
     else { 
      NSLog(@"%s : failed to write file %@", __FUNCTION__, path); 
     } 
    } 
} 

+(BOOL) documentsFileExists:(NSString *)filename { 
    NSString *documentsDirectory = [self documentsDirectory]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:filename]; 
    NSLog(@"%s : path %@", __FUNCTION__, path); 
    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:path]; 
    return exists; 
} 

+(void) createTexturesFromImage:(UIImage *)image640x640 texture:(Texture2D **)texture { 
    NSLog(@"%s -> ", __FUNCTION__); 
    START_TIMER; 
    for (int x = 0; x < 9; ++x) { 
     for (int y = 0; y < 9; ++y) { 
      UIImage *ulCorner = [image640x640 imageAtRect:CGRectMake(x*64,y*64,64,64)]; 
      texture[y*10+x] = [[Texture2D alloc] initWithImage:ulCorner]; 
     } 
    } 
    END_TIMER; 
    NSLog(@"%s <- ", __FUNCTION__); 
} 

@end 


-(void) test { 

    Texture2D *texture1[100]; 
    Texture2D *texture2[100]; 

    // compare texture creation from a bundled file vs Documents file 
    { 
     UIImage *imageBundled = [UIImage imageNamed:@"bivio-640x640.png"]; 
     [UIImage createTexturesFromImage:imageBundled texture:texture1]; 

     [UIImage saveImage:imageBundled toDocumentsFile:@"docfile.png"]; 
     BOOL ok = [UIImage documentsFileExists:@"docfile.png"]; 

     UIImage *imageFromFile = [UIImage imageFromDocumentsFile:@"docfile.png"]; 
     [UIImage createTexturesFromImage:imageFromFile texture:texture2]; 
    } 
} 

Répondre

Questions connexes