0

この関数は私の GLKViewController にあり、EAGLContext が作成され、setCurrent が作成された後、ビューが読み込まれる前に呼び出されます。

-(GLint)prepareTextureWithImage:(UIImage *)image andName:(NSString *)name
{
    NSLog(@"[INFO] image has CGImage %@", image.CGImage);
    NSLog(@"[INFO] image has size %f, %f", image.size.width, image.size.height);

    NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithBool:YES],
                              GLKTextureLoaderOriginBottomLeft,
                              nil];

    NSError *error;
    GLKTextureInfo *texture = [GLKTextureLoader textureWithCGImage:image.CGImage options:options error:&error];
    if (error) {
        NSLog(@"[ERROR] Error loading texture from image: %@",error);
        return -1;
    }
    else {
        NSLog(@"[INFO] GlkitViewController prepared texture %@", texture);
        [textures setObject:texture forKey:name];
        return texture.name;
    }
}

これは、Titanium モジュールの TiViewProxy から次のように呼び出されます。

-(void)prepareTexture:(id)args
{
    ENSURE_UI_THREAD_1_ARG(args);
    ENSURE_SINGLE_ARG(args,NSDictionary);

    NSString *name = [TiUtils stringValue:[args objectForKey:@"name"]];

    TiBlob *blob = [args objectForKey:@"image"];
    UIImage *image = [blob image];
    [image retain];

    GlkitOverlayView *overlayView = (GlkitOverlayView *)view;
    GLKitViewController *vc = (GLKitViewController *)overlayView.viewController;

    NSLog(@"[INFO] using viewcontroller %@", vc);

    [vc prepareTextureWithImage:image andName:name];
}

コンソールに適切な出力が表示されます。

[INFO]  using viewcontroller <GLKitViewController: 0xd5b68a0>
[INFO]  image has CGImage <CGImage 0xd5c6d40>
[INFO]  image has size 64.000000, 64.000000

しかし、それはクラッシュ前の最後の出力です。

この GLKTextureLoader への呼び出しがクラッシュするのはなぜですか?

4

1 に答える 1

0

同期呼び出しがクラッシュした理由はわかりませんが、関数のこの非同期バージョンはうまく機能しています。テクスチャが読み込まれ、glview に正しく表示されます。

-(GLint)prepareTextureWithImage:(UIImage *)image andName:(NSString *)name
{
    NSLog(@"[INFO] image has CGImage %@", image.CGImage);
    NSLog(@"[INFO] image has size %f, %f", image.size.width, image.size.height);

    NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithBool:YES],
                              GLKTextureLoaderOriginBottomLeft,
                              nil];
    NSError *error;

    GLKTextureLoader *textureloader = [[GLKTextureLoader alloc] initWithSharegroup:self.context.sharegroup];
    GLKTextureInfo *myTexture;
    [textureloader textureWithCGImage:image.CGImage options:nil queue:nil completionHandler:^(GLKTextureInfo *textureInfo, NSError *error) {

        if(error) {
            NSLog(@"[ERROR] Error loading texture from image: %@",error);
        }
        else {
            NSLog(@"[INFO] GlkitViewController prepared texture %@", textureInfo);
            [textures setObject:textureInfo forKey:name];
        }
    }];
}
于 2013-04-28T02:10:38.490 に答える