1

float数値の配列をRenderScript カーネルに転送するために次の手順を使用すると、正常に動作します。

float[] w = new float[10];
Allocation w_rs = Allocation.createSized(rs, Element.F32(rs), 10);
w_rs.copy1DRangeFrom(0, 10, w);

次のように Float4 値を転送するために同様の手順を使用したい

Float4[] w = new Float4[10];
for (int i = 0; i < 10; i++) {
   w[i] = new Float4(i, 2*i, 3*i, 4*i);
}
Allocation w_rs = Allocation.createSized(rs, Element.F32_4(rs), 10);    
w_rs.copy1DRangeFromUnchecked(0, 10, w);

次のエラーが発生します

渡されたオブジェクトはプリミティブの配列ではありません

どうやら、wプリミティブの配列である必要があります。wしかし、私はの配列になりたいですFloat4

4

1 に答える 1

1

以下を簡単に使用できます。

float[] w = new float[4 * 10];
for (int i = 0; i < 10; i++) {
    w[i * 4 + 0] = i;
    w[i * 4 + 1] = i*2;
    w[i * 4 + 2] = i*3;
    w[i * 4 + 3] = i*4;
}
Allocation w_rs = Allocation.createSized(rs, Element.F32_4(rs), 10);

w_rs.copyFrom(w);
// Or 
w_rs.copy1DRangeFrom(0,40,w);

無痛:)

リファレンス: RenderScript: Android での並列計算、簡単な方法

より深い説明

RenderScript Java ソース コード内に、次のミドルウェア関数が表示されます。

public void copy1DRangeFromUnchecked(int off, int count, Object array) {
    copy1DRangeFromUnchecked(off, count, array,
                             validateObjectIsPrimitiveArray(array, false),
                             java.lang.reflect.Array.getLength(array));
}

これvalidateObjectIsPrimitiveArrayは、任意のコピー メソッド呼び出しで実行されます。生の配列のみを渡すことができます。

于 2016-07-06T11:19:24.823 に答える