最近、Microsoft Acceleratorの動作と同様に、プログラマが使いやすいAPIを作成する目的でRenderScriptを使用しています。割り当てを使用してAndroid RenderScriptとの間で配列の値をやり取りする方法
RenderScriptレイヤーとの間で値を渡し、すべてを最も効率的な方法で実行したいと思っている現時点で問題になっています。これは私のソースコードの抽出です。
int[] A = new int[10];
int[] B = new int[10];
for (int i = 0; i < 10; i++) {
A[i] = 2;
B[i] = i;
}
intAdd(A, B);
これはちょうど2つの基本的な配列を作成し、それらを値で塗りつぶし、それらをRenderScriptに送る関数を呼び出します。
private void intAdd(int[] A, int[] B) {
RenderScript rs = RenderScript.create(this);
ScriptC_rsintadd intaddscript = new ScriptC_rsintadd(rs, getResources(), R.raw.rsintadd);
mScript = intaddscript;
for(int i = 0; i < A.length; i++) {
setNewValues(mScript, A[i], B[i]);
intaddscript.invoke_intAdd();
int C = getResult(mScript);
notifyUser.append(" " + C);
}
}
public void setNewValues(Script script, int A, int B) {
mScript.set_numberA(A);
mScript.set_numberB(B);
}
public int getResult(Script script) {
int C = mScript.get_numberC();
return C;
}
これは、次のrenderScriptコードに値のペアを送信します:
int numberA;
int numberB;
int numberC;
void intAdd() {
/*Add the two together*/
numberC = numberA + numberB;
/*Send their values to the logcat*/
rsDebug("Current Value", numberC);
}
しかし、これには二つの問題があり、最初のものはのrenderScriptの非同期な性質であることと、Java層を意味値を要求します。スクリプトはまだ操作を実行していないか、すでに完了しています。出力の値を破棄し、次の値から開始します。また、RenderScriptのデバッグの可視性が低いため、表示方法がありません。
もう1つの問題は、非常に効率的ではないということです。コードでは、常に2つの数値を加算するRenderScript関数を呼び出しています。理想的には、配列をRenderScriptに渡して構造体に格納し、操作全体を多くのスクリプト呼び出しではなく1つのスクリプト呼び出しで実行したいと考えています。しかし、それを元に戻すためには、rsSendtoClient関数をユーザーに提示する必要があると思いますが、使用方法については何も見つかりませんでした。そして、好ましくは、私はrsForEach戦略を使いたいですが、もう一度情報は恐怖です。
誰かが何か考えがあるなら、私はとても感謝しています。ありがとう。
ウィル・スコット・ジャクソン