我正在编写一小段Renderscript来动态拍摄图像,并根据每个像素的RGB值将像素分类为“桶”。桶的数量可能会有所不同,所以我的直觉就是创建一个arraylist。显然,这在Renderscript中是不可能的,所以我想知道在脚本中创建动态结构列表的方法是什么。任何帮助非常感谢。
答案 0 :(得分:1)
对此没有明确的答案。问题在于动态内存管理对RenderScript这样的平台来说是一种诅咒 - 它很慢,意味着很多关于页面表和TLB的东西在任意时间都不容易从给定的处理器保证,并且几乎从不高效做你想做的事。
正确的替代方案完全取决于您在创建后对存储桶执行的操作。您是否需要分类的所有内容而不将所有内容分类到桶中?只需创建一个每像素的蒙版(或使用alpha通道)并将类别与像素数据一起存储。你对每个桶的大小有一些上限吗?将每个桶分配为该大小。
很抱歉这是开放式的,但内存管理是使高性能代码戛然而止的原因之一。解决方法是必要的,但正确的解决方法在每种情况下都有所不同。
答案 1 :(得分:1)
我会尝试回答您对像素值进行分类的目标问题,而不是您创建动态大小的结构列表的标题问题。
在不了解您的算法的情况下,我将使用两种算法之一构建我的答案:
两种算法都需要每个工作线程有大量内存。此外,两种算法都很难适应GPU,因为它们需要某种随机存储器访问(注意)。因此,两种算法很可能最终都会在CPU上执行。因此,减少线程数量是个好主意。避免增加内存需求。
注意:非合并(非顺序)内存访问 - 读取,写入或两者兼而有之。
最好的方法是使用Renderscript计算联合颜色直方图,然后在直方图上运行您的分类算法(可能在CPU上)。之后,您可以在Renderscript中执行像素标签分配的最后一步。
整个过程与Tim Murray在Google I / O 2013中的Renderscript演示几乎完全相同。
关节颜色直方图必须具有硬编码大小。例如,32x32x32 RGB联合直方图使用32768个直方图箱。这允许每个通道有32级阴影。每个通道的误差为256级中的+/- 2级。
我在Renderscript上成功实现了多线程连接组件标记。请注意,我的实现仅限于在CPU上执行;无法在GPU上执行我的实现。
<强>先决条件。强>
一些设计选择。
一个小而重要的实施细节。
<强>步骤。强>