0

画像をレンダリングする素敵なOpenGLESコードスライスがあります。必要に応じて、関数を呼び出すことができます。

-(UIImage *)renderToImage;

これは多くのレンダリング作業を行い、画像を返します。これには、FBO、テクスチャなどの生成が含まれます。

最近、私はこれを強化する必要があることに気づきました。画像の生成には4秒かかるので、作業を別のスレッドに渡してアプリを続行させたいと思います。これは簡単に思えました。私はこのコードでメソッドを作成しました:

-(void) generateRandomNewImage:(MyViewController *)evc{
UIImage * renderedImage = [self renderToImage];
NSString * fileLoc = [self writeToTempFile:renderedImage];
NSLog(@"File location:%@",fileLoc);
[evc performSelectorOnMainThread:@selector(imageGenerationComplete:) withObject:fileLoc waitUntilDone:NO];
}

うまくいけば、ここでロジックが進行しているのを見ることができます。このメソッドは、画像をレンダリングしてファイルシステムに保存し、メインスレッドのビューコントローラーでメソッドを呼び出して、ファイルの準備ができたことを通知します。このコードは私のopenglレンダラーの中にあります。これは、メインスレッドのビューコントローラでここで呼び出されます。

thread = [[NSThread alloc] initWithTarget:renderer 
                           selector:@selector(generateRandomNewImage:) 
                           object:self];
[thread start];

私には、それも問題ないようです。このコードを実行すると、コンソールでフレームバッファオブジェクトのステータスがエラーになり、ステータスがゼロであることが通知されます。理由はわかりません。その結果、空白の画像が表示されます(一時ファイルへの保存は機能しますが、テストしました)。

テストするために、このコードをすべてメインスレッドに入れ、新しいスレッドなどは作成しませんでした。それはすべてうまくいきました。画像生成を別のスレッドに渡そうとするとすぐに、問題が発生します。

4

1 に答える 1

2

別のスレッドでOpenGLを使用することはそれほど単純ではなく、一度に1つのスレッドのみがOpenGLコンテキストを使用でき、2番目のスレッドにはOpenGLコンテキストがないため、すべてのOpenGL呼び出しが失敗します。

解決策:2番目のスレッド用に別のOpenGLコンテキストを作成し、これを読んでください。

于 2010-07-22T15:21:39.743 に答える