0

問題が発生しました。解決できません。エラーが表示されるだけです:

プログラム受信信号:「0」。

シグナル 10 (SIGBUS) により、デバッガーが終了しました。シグナル 10 (SIGBUS) により、デバッガーが終了しました。

ここにいくつかの方法があります。コメントアウトすると、問題は解決します

- (void)loadTexture {
     const int num_tex = 10;
     glGenTextures(num_tex, &textures[0]);

     //TEXTURE #1
     textureImage[0] = [UIImage imageNamed:@"wonder.jpg"].CGImage;
            //TEXTURE #2
     textureImage[1] = [UIImage imageNamed:@"wonder.jpg"].CGImage;
     //TEXTURE #3
     textureImage[2] = [UIImage imageNamed:@"wall_eyes.jpg"].CGImage;
     //TEXTURE #4
     textureImage[3] = [UIImage imageNamed:@"wall.jpg"].CGImage;
     //TEXTURE #5
     textureImage[4] = [UIImage imageNamed:@"books.jpg"].CGImage;
     //TEXTURE #6
     textureImage[5] = [UIImage imageNamed:@"bush.jpg"].CGImage;
     //TEXTURE #7
     textureImage[6] = [UIImage imageNamed:@"mushroom.jpg"].CGImage;
     //TEXTURE #8
     textureImage[7] = [UIImage imageNamed:@"roots.jpg"].CGImage;
     //TEXTURE #9
     textureImage[8] = [UIImage imageNamed:@"roots.jpg"].CGImage;
     //TEXTURE #10
     textureImage[9] = [UIImage imageNamed:@"clean.jpg"].CGImage; 

     for(int i=0; i<num_tex; i++) {
      NSInteger texWidth = CGImageGetWidth(textureImage[i]);
      NSInteger texHeight = CGImageGetHeight(textureImage[i]);
      GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4);

      CGContextRef textureContext = CGBitmapContextCreate(textureData,
                  texWidth, texHeight,
                  8, texWidth * 4,
                  CGImageGetColorSpace(textureImage[i]),
                  kCGImageAlphaPremultipliedLast);
      CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage[i]);
      CGContextRelease(textureContext);

      glBindTexture(GL_TEXTURE_2D, textures[i]);
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);

      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

      free(textureData);
     }
 }

このメソッドでオブジェクトを解放/削除するのを手伝ってくれる人はいますか? ありがとう。

4

3 に答える 3

0

このメソッドのコンテキスト外で textureImage 配列の要素にアクセスしようとしていますか?

その配列の要素は imageNamed: によって割り当てられ、自動解放されていますが、textureImage はメソッドの外で定義されているようです。後でその配列内の画像のいずれかでメソッドを呼び出そうとすると、表示されているエラーが表示されます。

配列内の要素が別の場所に必要な場合は、必ずここで CGImage または UIImage オブジェクトを保持し、完了したら解放してください。

于 2010-04-30T00:37:13.527 に答える
0

このような問題が発生するすべての人のために、dealloc でテクスチャを解放してください。以下に例を示します。

    for(int i=0; i<10; i++) {
        glDeleteTextures(1, &textures[i]);
    }
于 2010-04-30T13:00:38.093 に答える
0

[UIImage imagenamed:] は頻繁にメモリ リークを引き起こします。同様の問題があり、ここにある方法を使用して修正しました。基本的には、次のようなものを使用します。

NSString *fileName = [NSString stringWithFormat: @"%@/Image.png", [[NSBundle mainBundle] resourcePath]];
UIImage *tmp = [[UIImage alloc] initWithContentsOfFile: fileName];
CGImageRef cg = [tmp CGImage];
[tmp release];
//Do stuff
CGImageRelease(cg);
于 2010-04-26T22:00:25.973 に答える