画像をレンダリングする素敵な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];
私には、それも問題ないようです。このコードを実行すると、コンソールでフレームバッファオブジェクトのステータスがエラーになり、ステータスがゼロであることが通知されます。理由はわかりません。その結果、空白の画像が表示されます(一時ファイルへの保存は機能しますが、テストしました)。
テストするために、このコードをすべてメインスレッドに入れ、新しいスレッドなどは作成しませんでした。それはすべてうまくいきました。画像生成を別のスレッドに渡そうとするとすぐに、問題が発生します。