2012-11-06 1 views
1

Existe-t-il un moyen de stocker et de charger des données brutes sur disque sous iOS afin de gagner du temps et de la mémoire lors de la décompression et réduire l'empreinte mémoire sale de l'application? Paul Haddad a été hinting to something like this et je comprends que cette technique est utilisée pour efficient game texture loading with OpenGL.UIImage (CGImage) avec données brutes mappées en mémoire

Mon cas d'utilisation si pour un fond d'écran plein écran fourni par l'utilisateur, qui est toujours affiché en arrière-plan. Actuellement, je l'enregistre au format PNG et le charge au démarrage de l'application. Cela gaspille de la mémoire et du CPU pour décompresser l'image. Je voudrais enregistrer l'image, puis le charger plus tard en tant que fichier mappé en mémoire. Existe-t-il un moyen d'atteindre cet objectif dans CoreGraphics/UIKit land?

Répondre

1

Je l'ai utilisé cette option pour enregistrer les tranches de la mémoire tampon vidéo en temps réel

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 

    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    CVPixelBufferLockBaseAddress(imageBuffer,0); 
    bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); 

    size_t sliceSize = bytesPerRow*sliceWidth*sizeof(char); 
    int slicePos= bytesPerRow*sliceStart*sizeof(char); 
    NSData *rawFrame = [NSData dataWithBytes:(void*)baseAddress+slicePos length:sliceSize]; 

    inputPath = [NSString stringWithFormat:@"%@%@%d", NSTemporaryDirectory(), @"slice",step]; 
    [[NSData dataWithData:rawFrame] writeToFile:inputPath atomically:NO]; 
} 

Je relis avec

-(void)readSlice 
{ 
    //read slice i 
    NSString *filePath = [NSString stringWithFormat:@"%@%@%d", NSTemporaryDirectory(), @"slice",i];    
    char* imgD= (char*)malloc(sliceSize); 
    [[NSData dataWithContentsOfFile:filePath] getBytes:imgD]; 
    CGContextRef context = CGBitmapContextCreate(imgD, sliceHeight,sliceWidth, 8, bytesPerRad, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
    CGImageRef quartzImage = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 
    free(imgD); 
    //do something with quartzImage 
} 
+0

Ce n'est que marginalement liée à ma question. Pourriez-vous adresser la partie de mappage de la mémoire? – Palimondo