iPhone: die Schaffung Texture2D viel langsamer, wenn Bild aus Datei Dokumente in App geladen, warum?
Frage
Langsamer als was? langsamer als die gleichen Texturen aus einem Bild zu schaffen aus dem App Bündel geladen. Wie viel langsamer? 80-mal langsamer auf iPhone, ähnliches Verhältnis (aber insgesamt schneller) auf dem Mac.
Mein Beispiel unten zeigt ein Bild mit imagenamed Laden:; Texturen aus dem ersten Bild erzeugt wird; Speichern Bild in einer Datei im Verzeichnis Dokumente der App; ein Bild aus der Datei geladen; Erstellen von Texturen aus dem zweiten Bild.
Die Bilder werden 640x640 png, 100 Texturen 64x64 sind jeweils erstellt. Erstellungszeiten sind 0.51 s vs. 41,3 s.
Kann jemand diesen großen Unterschied erklären, und zeigen Sie mir Mittel und Wege, den zweiten Fall zu beschleunigen, um es so schnell wie die erste, wenn möglich?
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];
}
}
Lösung
Wenn Sie Ihr Projekt gebaut, XCode optimiert PNGs, die Sie in Ressourcen setzen.
Dieser Artikel erklärt, es im Detail: http: // iphonedevelopment. blogspot.com/2008/10/iphone-optimized-pngs.html