Renderscript:创建一个结构矢量

时间:2013-09-28 17:14:48

标签: android renderscript

我正在编写一小段Renderscript来动态拍摄图像,并根据每个像素的RGB值将像素分类为“桶”。桶的数量可能会有所不同,所以我的直觉就是创建一个arraylist。显然,这在Renderscript中是不可能的,所以我想知道在脚本中创建动态结构列表的方法是什么。任何帮助非常感谢。

2 个答案:

答案 0 :(得分:1)

对此没有明确的答案。问题在于动态内存管理对RenderScript这样的平台来说是一种诅咒 - 它很慢,意味着很多关于页面表和TLB的东西在任意时间都不容易从给定的处理器保证,并且几乎从不高效做你想做的事。

正确的替代方案完全取决于您在创建后对存储桶执行的操作。您是否需要分类的所有内容而不将所有内容分类到桶中?只需创建一个每像素的蒙版(或使用alpha通道)并将类别与像素数据一起存储。你对每个桶的大小有一些上限吗?将每个桶分配为该大小。

很抱歉这是开放式的,但内存管理是使高性能代码戛然而止的原因之一。解决方法是必要的,但正确的解决方法在每种情况下都有所不同。

答案 1 :(得分:1)

我会尝试回答您对像素值进行分类的目标问题,而不是您创建动态大小的结构列表的标题问题。


在不了解您的算法的情况下,我将使用两种算法之一构建我的答案:

  1. RGB联合直方图
    • 不使用相邻像素值。
  2. 连接组件
    • 需要相邻的像素值。
    • 需要名为"Disjoint set"的支持数据结构。

  3. 常见建议。

    两种算法都需要每个工作线程有大量内存。此外,两种算法都很难适应GPU,因为它们需要某种随机存储器访问(注意)。因此,两种算法很可能最终都会在CPU上执行。因此,减少线程数量是个好主意。避免增加内存需求。

    注意:非合并(非顺序)内存访问 - 读取,写入或两者兼而有之。


    RGB联合直方图

    最好的方法是使用Renderscript计算联合颜色直方图,然后在直方图上运行您的分类算法(可能在CPU上)。之后,您可以在Renderscript中执行像素标签分配的最后一步。

    整个过程与Tim Murray在Google I / O 2013中的Renderscript演示几乎完全相同。

    关节颜色直方图必须具有硬编码大小。例如,32x32x32 RGB联合直方图使用32768个直方图箱。这允许每个通道有32级阴影。每个通道的误差为256级中的+/- 2级。


    连接组件

    我在Renderscript上成功实现了多线程连接组件标记。请注意,我的实现仅限于在CPU上执行;无法在GPU上执行我的实现。

    <强>先决条件。

    • 了解Union-Find算法(及其各种理论部分,例如路径压缩和排名)以及连接组件标签如何从中受益。

    一些设计选择。

    1. 我使用与图像大小相同的32位整数数组来存储&#34;链接&#34;。
    2. 链接的发生方式与Union-Find相同,只是我没有排名的好处。这意味着树可能变得非常不平衡,因此路径长度可能会变长。
    3. 另一方面,我在算法的各个步骤执行路径压缩,通过缩短路径(深度)来抵消次优树合并的风险。
    4. 一个小而重要的实施细节。

      1. 存储在整数数组中的值本质上是&#34;(x,y)&#34;的编码。坐标到(i)本身,如果像素是它自己的根,或(ii)与当前像素具有相同标签的不同像素。
      2. <强>步骤。

        • 多线程阶段。
          • 将图像分成小块。
          • 在每个图块中,使用该图块的本地标签值计算连接的组件。
          • 在每个磁贴内执行路径压缩。
          • 将标签值转换为全局坐标,并将平铺标签复制到主结果矩阵中。
        • 单线程阶段。
          • 水平缝合。
          • 垂直缝合。
          • 全球路径压缩。
相关问题