Le programme se bloque lorsque UIImage est publié après avoir généré la texture OpenGL ES

StackOverflow https://stackoverflow.com/questions/1411410

  •  05-07-2019
  •  | 
  •  

Question

À présent, j'ai suivi ce tutoriel:

http: // iphonedevelopment .blogspot.com / 2009/05 / opengl-es-from-ground-up-part-6_25.html

Cela ne fonctionnera pas si j'essayais de publier UIImage: j'obtiendrai un 'EXC_BAD_ACCESS'. Maintenant, j'ai fait de UIImage des variables d'instance et les conserve. Je ne le fais pas autorelease. Mais le problème est parfois que je veux supprimer ma texture. Je dois libérer ces UIImage sinon je vais avoir une fuite. (Les fuites de l'outil de performance signalent que UIImage provoque des fuites) Mais si je libère UIImage, j'obtiendrai EXC_BAD_ACCESS. Et je ne suis même pas en train de les dessiner ou de les consulter nulle part. Le programme se bloque juste à l'endroit où il a été publié:

#0  0x30011940 in objc_msgSend ()
#1  0x302395f4 in CFGetTypeID ()
#2  0x308f480c in -[UIImage(UIImageDeprecated) imageRef] ()
#3  0x308f4ae0 in SharedIdentifierForImage ()
#4  0x308f4a30 in _UISharedImageDealloc ()
#5  0x308f4964 in -[UIImage dealloc] ()
#6  0x30236b78 in -[NSObject release] ()
#7  0x0000a374 in -[Texture dealloc] (self=0x184b30, _cmd=0x300f7fd0) at /Users/akaraphan/Desktop/Competition/TrapRoom/Classes/Texture.m:329
#8  0x30236b78 in -[NSObject release] ()
#9  0x30235f24 in CFRelease ()
#10 0x302043bc in __CFTypeCollectionRelease ()
#11 0x30205dac in __CFArrayReleaseValues ()
#12 0x30205c18 in __CFArrayDeallocate ()
#13 0x30236020 in _CFRelease ()
#14 0x30235efe in CFRelease ()
#15 0x3054836a in -[NSCFArray release] ()
#16 0x00011658 in -[GameSprite dealloc] (self=0x1838d0, _cmd=0x300f7fd0) at /Users/akaraphan/Desktop/Competition/TrapRoom/Classes/GameSprite.m:40
...
...

La ligne 329 dans Texture.m est le lieu où je publie mon UIImage.

Mon code est un peu différent du didacticiel, mais il devrait fonctionner de manière très similaire:

- (id) initFromImage: (NSString*)imageFile{

    if (self = [super init]){

        path = [[NSBundle mainBundle] pathForResource:imageFile ofType:@"png"];
        texData = [[NSData alloc] initWithContentsOfFile:path];
        img = [[UIImage alloc] initWithData:texData];

        CGImageRef image = img.CGImage;

        width = CGImageGetWidth(image);
        height = CGImageGetHeight(image);

        if (image){
            int tempWidth = (int)width, tempHeight = (int)height;

            if ((tempWidth & (tempWidth - 1)) != 0 ){
                NSLog(@"CAUTION! width is not power of 2. width == %d", tempWidth);
            }else if ((tempHeight & (tempHeight - 1)) != 0 ){
                NSLog(@"CAUTION! height is not power of 2. height == %d", tempHeight);
            }else{
                GLubyte *spriteData = (GLubyte*) calloc(width * 4, height * 4);

                CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4, CGImageGetColorSpace(image), kCGImageAlphaPremultipliedLast);

                CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, width, height), image);

                CGContextRelease(spriteContext);

                glGenTextures(1, &GLtexture);

                glBindTexture(GL_TEXTURE_2D, GLtexture);

                glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);

                free(spriteData);

                CGImageRelease(image);

                NSLog(@"Texture %d", GLtexture);

            }

        }else NSLog(@"ERROR: Image not loaded...");

        return self;
    }
    return nil;
}

Si vous pouvez voir ce qui ne va pas, veuillez me guider. Merci.

Était-ce utile?

La solution

En quelque sorte supprimer

CGImageRelease(image)

résolu le problème. Je peux enlever UIImage après cela sans problème et il n’ya pas non plus de fuite.

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