5

次のバックトレースで、顧客からのクラッシュが発生しています。

0   libGPUSupportMercury.dylib          0x3542ae2e gpus_ReturnNotPermittedKillClient + 10
1   IMGSGX543RC2GLDriver                0x30bbf5e5 SubmitPacketsIfAny + 245
2   GLEngine                            0x32f827db glFinish_Exec + 167
3   CoreImage                           0x31fb85b7 CI::GLESContext::recursive_render(CI::Node const*, CGRect, bool) + 219
4   CoreImage                           0x31fbb351 CI::GLESContext::render(CI::Node*,     CGRect) + 41
5   CoreImage                           0x31fc2901 CI::image_get_cgimage(CI::Context*, CI::Image*, CGRect, CGColorSpace*, CI::PixelFormat) + 1313
6   CoreImage                           0x31fa8427 -[CIContext createCGImage:fromRect:format:colorSpace:] + 487
7   CoreImage                           0x31fa81e9 -[CIContext createCGImage:fromRect:] + 89
8   App                                 0x0013c9db -[PZTiledImageLayer drawInContext:] (PZTiledImageLayer.m:129)

これは、アプリがバックグラウンドにある (許可されていない) ときに GPU にアクセスすることが原因です。

このクラッシュの原因となるコードは次のとおりです。

if([UIApplication sharedApplication].applicationState == UIApplicationStateActive)
{
    cg_image = [self.imageContext createCGImage:im fromRect:rclip];
}

これは、私のチェックの後、GPU が Core Image API 内でアクセスする前に、アプリの状態が変化することを意味します。

この Core Image API を使用する場合、アプリのバックグラウンド状態の状況を処理する適切な方法は何ですか?

4

1 に答える 1

0

これがバックグラウンド スレッドで発生している場合は、メイン スレッドに移動してみてください。そうすれば、この関数の実行は AppDelegate コールバックとインターリーブされません。

- (void)applicationDidEnterBackground:(UIApplication *)application

並行性を気にすることなく、そこにいくつかのシグナリングを実装できます。

于 2013-07-22T08:38:23.370 に答える