首页 > 解决方案 > 在android renderscript中使用大数据数组时等待阻塞GC ProfileSaver

问题描述

我想使用渲染脚本来处理一些需要为每个执行的线程提供相当“大”数据数组的东西。我仍然不确定它是否足够大,但使用它会在 logcat 中触发“等待阻塞的 GC ProfileSaver”消息,并像......永远阻止应用程序。我正在使用在 rs 文件中定义的自定义结构,如下所示:

typedef struct myStruct {
    int data[65000];
} myStruct_t;

并在 rs 内核中使用它,使用 forEach 函数调用:

// in rs file
myStruct_t RS_KERNEL process(myStruct_t aIn, uint32_t x) {
    myStruct_t aOut;
    // do stuff with aIn and save the result in aOut.
    // and finally return aOut
    return aOut;
}
// in java file
...
RenderScript rs = RenderScript.create(this);
Element el = ScriptField_myStruct.createElement(rs);
alloc = Allocation.createSized(rs, el, 10);
retval = Allocation.createTyped(rs, alloc.getType());
process = new ScriptC_process(rs);
...
alloc.copyFromUnchecked(data); // data is array of integer
process.forEach_process(alloc, retval);

基本上,我有 650K 数据(int)要处理,我想使用 renderscript 将其分布在 10 个线程中。但是,当我将数组缩小到大约 2000,并将分配计数增加到 325(总共仍然是 650K)时,仍然出现“等待阻塞 GC ProfileSaver”,但应用程序可以在 13-14 秒后显示主要活动延迟(由于 GC)。我很确定我没有内存问题(有大量可用内存)。

这对于自定义元素来说是否太大而无法在其中包含 65K 数组数据?我可以使用任何解决方法吗?

提前致谢!

标签: androidrenderscript

解决方案


我在分配时使用不同的方法解决了这个问题。我不是使用每个具有 65k 个整数的自定义结构(元素)然后分配其中的 10 个(所以 65k * 10 = 650k),而是一次性分配 650k 个整数并使用 ScriptC'bind_${var}在 rs 内核中访问它们。


推荐阅读