2017-10-26 16 views
0

AndroidでV8サポートライブラリとデフォルトのRenderScriptランタイムを使用しているときに、Javaレベルで同じRenderScriptコードが異なる結果を生成することがあることに気付きました。RenderScriptとV8のサポートライブラリの違い

たとえば、いくつかの組み込み関数の実装が異なるため、結果の画像に若干の違いがあります。

サポートライブラリのバージョンがネイティブのバージョンよりも「非同期」であることに気付きました。ネイティブバージョンは "forEach()"メソッドを処理するのに時間がかかり、 "forEach()"呼び出しの後すぐにサポートライブラリが戻り、 "copyTo"または "finish()"が呼び出されたときにすべての作業を行います。

"Allocation.createFromBitmap()"が呼び出されたとき、サポートライブラリはビットマップメモリ​​を使用し、VMの外に余分なスペースを割り当てないことに気付きました。ネイティブバージョンは常により多くのスペースを割り当てます。私はQualcom's Trepn profilerを使ってこの結論に達しました。

違いはどこかに書かれていますか?

答えて

1

RenderScriptサポートライブラリは、本質的にCPUパスのネイティブRenderScriptと同じです。

いくつかの違いががあります。プライベートのAndroidのAPI(非NDKのAPI)に依存

  1. 一部の機能はサポートlibに存在しません。
  2. カーネル(.rs)ファイルはサポートライブラリ用にあらかじめコンパイルされていますが、ネイティブRenderScriptはデバイス上でJITコンパイルを行います。
  3. サポートlibは、デバイスのAndroidバージョンが "renderscriptTargetApi"と "targetSdkVersion"よりも高い場合、ネイティブRenderScriptパスでも実行できます。

メモリ使用量やその他の動作の違いは、デバイスのGPUドライバからのものである可能性があります。 GPUは、指定されたストライド/アライメントでビットマップをGPUメモリにコピーする必要があります。

+0

3番目のステートメントを少し良く説明できますか?デバイスのAndroidバージョンが "renderscriptTargetApi"に等しい場合はどうなりますか? 正しく理解すると、高い「targetSdkVersion」は、ネイティブRenderScriptパスの代わりにライブラリを使用する比較的新しいデバイスになります。 – Petrakeas

+0

あなたは正しいです。 RenderScriptには、Allocation、IntrinsicsなどのフレームワークAPIとランタイムAPI(https://developer.android.com/guide/topics/renderscript/reference/overview.html)の両方があります。一般に、renderscriptTargetApiは、必要なすべてのRenderScriptランタイムAPIを提供する最小限のAPIです。 targetSdkVersionは、アプリケーションがターゲットとするAndroid Frameworks APIです。サポートlibは、ランタイムパートとフレームワークパートの両方がネイティブパスで実行できることを確認する必要があります。 –

+0

サポートライブラリはGPUパスを使用していますか? – Petrakeas

関連する問題