【问题标题】:Calling RenderScript from C / JNI从 C/JNI 调用 RenderScript
【发布时间】:2017-09-26 19:10:15
【问题描述】:

我希望用更高效的方法替换 C atan2 函数。 RenderScript 确实提供了atan2,包括采用向量的版本。

我找到的示例演示了从 Java 调用 RenderScript。是否可以从 C 代码调用 RS?举个例子就好了。

谢谢

【问题讨论】:

  • 我认为 RenderScript 的“更高效”声称与 java 性能有关,而不是 C 性能。如果您已经使用 C 进行编程,那么很可能 C 标准库的 atan2 已经为您提供了最佳性能。
  • @BitTickler 真正的原因是我想把它从 CPU 转移到 GPU。

标签: renderscript


【解决方案1】:

这曾经是可能的,尽管 NDK 中的 RS 支持已经放弃了一段时间。可能仍然有可能,但即使是 NDK 样本也不再包含 RS 样本。从 Android 7 开始,您可以尝试使用“Single Source RenderScript”,描述为here,这应该可以通过 C/C++ 代码实现。

您可能会看到使用 RS 的效率提升是由于几个可能的原因(非常依赖于平台):

  1. RS 将对您的数据集进行并行操作。在某些情况下,您正在调用的函数(例如 atan2)可能会并行执行操作。
  2. 您的 RS 代码可以在协处理器(例如 GPU 或 DSP)上执行。
  3. RS 提供的内在函数和库函数针对平台进行了高度优化。再次以atan2 为例,RS 内核中的函数可能比标准 C 库更优化,因为它可能使用协处理器,也可能使用架构特定的优化实现(汇编)。

综上所述,在将 RS 空间 (Allocation) 之间的数据移回非 RS 代码时,您的代码可能会受到 I/O 影响。

【讨论】:

  • 是否有在 C 中运行的单源 RenderScript 示例?
  • Larry,这是否意味着它将来可能会停止工作?我正在考虑从 Java 调用切换到 C 调用,以更好地隐藏我的 RS 代码。还希望它可以在运行 7 之前的设备上运行。
  • 我不知道是否有任何 C 语言中的单一源示例,但我自己没有搜索或创建任何示例。至于 RS 支持的长期计划,只有 Google 知道。
  • 但是 SingleSource Renderscript 只能在 Android 7.0 及以上版本中运行
【解决方案2】:

我找到了两个例子;这是我要构建和运行的一个:

https://github.com/adhere/NDKCallRenderScriptDemo

我一直在搜索 C++ API 的文档,但没有找到。

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多