Microsoft Accelerator が機能するのと同様に、プログラマーが簡単に使用できる API を作成する目的で、最近 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);
}
しかし、これには 2 つの問題があります。最初の 1 つは RenderScript の非同期性です。これは、Java レイヤーが値を要求したときに、スクリプトがまだ操作を実行していないか、既に実行しており、出力の値を破棄することを意味します。そして次の仕事を始めました。また、RenderScript のデバッグ可視性が低いため、判断する方法がありません。
もう 1 つの問題は、あまり効率的ではないことです。コードは常に RenderScript 関数を呼び出して 2 つの数値を加算しています。理想的には、配列を RenderScript に渡し、それを構造体に格納して、操作全体を多数ではなく 1 回のスクリプト呼び出しで実行したいと考えています。しかし、それを取り戻すには、rsSendtoClient関数を使用する必要があると思いますが、使用方法に関する資料は見つかりませんでした。できれば rsForEach 戦略を使用したいのですが、やはり情報は怖いものです。
誰かに何かアイデアがあれば、私はとても感謝しています。ありがとう。
ウィル・スコット・ジャクソン