android - RenderScript 阻塞函数调用

标签 android renderscript

我是 RenderScript 的新手,对来自 Java 层的调用的阻塞/非阻塞性质仍然不太了解。一般的问题是:哪些情况会阻止代码并允许 RenderScript 完成。特别是:

  1. 在 Java 中,我使用 forEach_kernel() 调用了一个内核,这并没有阻塞 - 我不得不添加一个额外的 Allocation.copyTo() 以便我可以使用结果。还有别的办法吗?
  2. 我在某处读到,如果有 2 个内核,那么调用第二个内核将阻塞,直到第一个内核完成。什么条件会导致这种情况 - 也许只有在处理相同的分配时才会这样?
  3. 可调用函数是否会阻塞 a) 彼此 b) 内核?特别是,我有一个自定义的初始化程序可调用函数,我需要准备一些数据供内核稍后使用。这个准备工作可能需要一些时间,所以我想知道在 Java 中调用 script.invoke_somefunc() 然后立即调用 script.forEach_kernel() 是否危险?

最佳答案

1) 您可以使用 rs.finish() 来确保等待内核完成。内核执行在 RS 中确实是异步的。

2) 我们一次只允许一个内核执行(忽略 ScriptGroup,其中您有内核的 D​​AG,因此可能有一些额外的优化空间)。在这种情况下,您的第二个内核将不会开始运行,直到第一个内核完成。

3) 可调用函数(即您使用 Java 中的 invoke_*() 运行的函数)不是异步的。您将阻塞直到它们在 Java 端完成。因此,它们将相互阻塞或阻塞内核。如果您有一个内核后跟一个调用,您将异步启动内核,但调用不会在内核完成之前开始。然后您还将等待调用完成。

再说一个细节。如果你的初始化器不需要参数,你可以把它放在一个实际的“void init(void)”函数中。这些在创建 ScriptC 时运行一次。

关于android - RenderScript 阻塞函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21358689/

相关文章:

android - Android 设备上的程序化自动助理

android - Renderscript 分配崩溃

gpu - 渲染脚本和 GPU

java - llvm-rs-cc : error: unknown argument: '-target-api' in Android renderscript

java - 从 Http Post 接收 UTF-8 响应

android - 标记元视口(viewport)

音频缓冲区上的 java.lang.OutOfMemoryError

android - Android 是否支持 MVC(Model View Controller)结构?

android - 如何分配要在 ScriptIntrinsic3DLUT 上使用的 LUT?

java - Android 上使用 RenderScript 的中值滤波器