1

私は画像処理のためにカスタムRenderScriptスクリプトを使用するアプリケーションで作業しています。さて、私はこれらのスクリプトをたくさん使用しているので、最初にアプリを起動します。 「プリロード」とは、各スクリプトをインスタンス化し、デバイス上でコンパイルすることを意味します。 Bellowはこの操作のコードスニペットです。約60のスクリプトがありますが、これは操作を説明するのに十分だと思いました。Renderscript ScriptCメインスレッドのブロックをコンパイル

public class Load extends Thread { 

    public Load() { 
     super(); 
     setPriority(Thread.MIN_PRIORITY); 
    } 

    @Override 
    public void run() { 
     new ScriptC_first(RenderScriptHelper.getInstance()); 
     new ScriptC_second(RenderScriptHelper.getInstance()); 
     new ScriptC_third(RenderScriptHelper.getInstance()); 
    } 
} 

ご覧のとおり、バックグラウンドスレッドでこれを実行しています。問題は、スクリプトがこれに関係なくメインスレッドでコンパイルされているように見えることです。問題はそれらがUIをブロックしていることです。私はAsyncTaskとServiceで同じ結果を試してみました。 RenderScriptがメインスレッドで内部的にホップして、それらをコンパイルすると思われます。

Android Nougat(7.0)より前のバージョンでは、デバイスの速度に応じて同じ量のスクリプトをプリロードするのに10秒かかりました。ノーガットでは、アプリの最初の起動時であっても、UIをブロックしていると考えれば、それは大きな問題です。その後の起動ごとに、スクリプトはすでにコンパイルされているため、数秒でプリロードされます。

プリロードする必要があるのは、オンデマンドでスクリプトをインスタンス化するオプションではないためです。ユーザーがアプリを使用すると、すべてのスクリプトを準備してコンパイルする必要があるからです。 logcatの

関連部分:

E/RenderScript: Unable to open shared library (/data/user/0/com.company.myapp/cache/librs.contrast_v001.so): undefined symbol: .rs.dtor 
V/RenderScript: Invoking /system/bin/bcc with args '/system/bin/bcc -unroll-runtime -scalarize-load-store -rs-global-info -rs-global-info-skip-constant -o contrast_v001 -output_path /data/user/0/com.company.myapp/cache -bclib /system/lib/libclcore.bc -mtriple armv7-none-linux-gnueabi -O 3 -load libbccQTI.so -fPIC -embedRSInfo /data/user/0/com.company.myapp/cache/contrast_v001.bc -build-checksum abadcafe' 
V/RenderScript: Invoking /system/bin/ld.mc with args '/system/bin/ld.mc -shared -nostdlib /system/lib/libcompiler_rt.so -mtriple=armv7-none-linux-gnueabi --library-path=/system/vendor/lib --library-path=/system/lib -lRSDriver_adreno -lm -lc /data/user/0/com.company.myapp/cache/contrast_v001.o -o /data/user/0/com.company.myapp/cache/librs.contrast_v001.so' 

また、私は、後続の各開始の最初のアプリの起動とRenderScript.ContextType.NORMALにRenderScript.ContextType.PROFILEを使用していた場合に、関連します。使用RenderScript.ContextType.DEBUGは、他のコンテキストと同じ時間を取って、各アプリの起動時にコンパイルするためのスクリプトを引き起こし、logcat出力が若干異なっている:build.gradleの

V/RenderScript: Invoking /system/bin/bcc with args '/system/bin/bcc -unroll-runtime -scalarize-load-store -rs-global-info -rs-global-info-skip-constant -o contrast_v001 -output_path /data/user/0/com.company.myapp/cache -bclib /system/lib/libclcore_debug.bc -mtriple armv7-none-linux-gnueabi -O 3 -rs-debug-ctx -fPIC -embedRSInfo /data/user/0/com.company.myapp/cache/contrast_v001.bc -build-checksum abadcafe' 
V/RenderScript: Invoking /system/bin/ld.mc with args '/system/bin/ld.mc -shared -nostdlib /system/lib/libcompiler_rt.so -mtriple=armv7-none-linux-gnueabi --library-path=/system/vendor/lib --library-path=/system/lib -lRSDriver_adreno -lm -lc /data/user/0/com.company.myapp/cache/contrast_v001.o -o /data/user/0/com.company.myapp/cache/librs.contrast_v001.so' 

関連部分:

renderscriptTargetApi 23 
renderscriptSupportModeEnabled true 

RenderScriptの内部動作に関するドキュメントと情報を検索しましたが、ほとんどの内部動作がデバイスベンダーの裁量に委ねられているため、RenderScriptの内部動作についての情報はほとんど見つかりませんでした。

私の質問は、UIをブロックせずに、バックグラウンドスレッドでスクリプトをコンパイルするようにRenderScriptを強制することです。

何か助けていただければ幸いです。この問題に遭遇誰のための

答えて

2

:私はアプリのプライベートプロセスで実行中のサービスの問題を解決するために管理し、そのように宣言:

<service 
    android:name="com.company.LoadService" 
    android:process=":loadService" 
    android:exported="false" /> 

私は内部でScriptC_something.class-ESをインスタンス化それは別のプロセスなので、私のUIスレッドはもう一度無料です。

これは誰かを助けることを望みます。

関連する問題