2009-12-04 121 views
0

比什麼慢?比從應用程序包加載的圖像創建相同的紋理要慢。 慢多少?在iPhone上速度減慢80倍,在Mac上的比例相似(但總體速度更快)。iPhone:爲什麼在從應用程序文檔中的文件加載圖像時創建Texture2D要慢得多?

我下面的示例顯示了使用imageNamed加載圖像:;從第一個圖像創建紋理;將圖像保存到應用程序的Documents目錄中的文件;從該文件加載圖像;從第二張圖像創建紋理。

圖像爲640x640 png,每種情況下創建100個紋理64x64。創造時間是0.51秒比41.3秒。

任何人都可以解釋這種巨大的差異,並指出我加快第二種情況的方法和手段,如果可能的話,讓它像第一種情況一樣快?

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

回答

相關問題