1

次の RenderScript コードを使用してビットマップのピクセルをカウントしたい

RenderScript

ファイル名:counter.rs

#pragma version(1)
#pragma rs java_package_name(com.mypackage)
#pragma rs_fp_relaxed

uint count; // initialized in Java
void countPixels(uchar4* unused, uint x, uint y) {
  rsAtomicInc(&count);
}

ジャワ

Application context = ...; // The application context
RenderScript rs = RenderScript.create(applicationContext);

Bitmap bitmap = ...; // A random bitmap
Allocation allocation = Allocation.createFromBitmap(rs, bitmap);

ScriptC_Counter script = new ScriptC_Counter(rs);
script.set_count(0);
script.forEach_countPixels(allocation);

allocation.syncAll(Allocation.USAGE_SCRIPT);
long count = script.get_count();

エラー

これは私が得るエラーメッセージです:

エラー: カウントのアドレスが見つかりません

質問

  • コードが機能しないのはなぜですか?
  • どうすれば修正できますか?

リンク

4

2 に答える 2

1

余談ですが、必要でない限り、並列計算でアトミック操作を使用することは、通常は良い方法ではありません。RenderScript は、実際にこの種のアプリケーションにリダクション カーネルを提供します。多分あなたはそれを試してみることができます。

コードにはいくつかの問題があります。

  1. 変数「count」は「volatile」と宣言されている必要があります
  2. countPixels は「void RS_KERNEL countPixels(uchar4 in)」である必要がありました
  3. script.get_count() は「カウント」の最新の値を取得しません。割り当てで値を取得する必要があります。

rsAtomicInc を使用する必要がある場合、実際の良い例は RenderScript CTS テストです。

AtomicTest.rs

AtomicTest.java

于 2016-12-23T01:30:56.333 に答える