4

アプリで RenderScript を使用して、いくつかの画像処理タスクを実行しています。

時々、次の例外がランダムに発生します。

10-10 15:27:04.479: E/AndroidRuntime(2113): FATAL EXCEPTION: FinalizerWatchdogDaemon
10-10 15:27:04.479: E/AndroidRuntime(2113): java.util.concurrent.TimeoutException: android.renderscript.Type.finalize() timed out after 10 seconds
10-10 15:27:04.479: E/AndroidRuntime(2113):     at android.renderscript.RenderScript.nObjDestroy(RenderScript.java:216)
10-10 15:27:04.479: E/AndroidRuntime(2113):     at android.renderscript.BaseObj.finalize(BaseObj.java:116)
10-10 15:27:04.479: E/AndroidRuntime(2113):     at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187)
10-10 15:27:04.479: E/AndroidRuntime(2113):     at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
10-10 15:27:04.479: E/AndroidRuntime(2113):     at java.lang.Thread.run(Thread.java:856)

すべての RenderScript 呼び出しは、同じスクリプトが並行して実行されるのを防ぐために、セマフォで囲まれています。このメッセージの意味と、それを防ぐ方法を誰か教えてもらえますか?

4

1 に答える 1

2

非常に長時間実行されるカーネルはありますか?

このスレッドは、GC が Java コード参照を削除するときに RS オブジェクトをクリーンアップしようとしています。非常に長時間実行されているカーネルがある場合、表示されているものをトリガーするのに十分な時間ブロックされる可能性があります。カーネルの実行中に外部スレッドによってオブジェクトが変更されることは許可されていないため、実際には外部スレッドはカーネルが完了するまでブロックされます。

于 2013-10-11T00:47:16.567 に答える