RenderScript阻塞函数调用

时间:2014-01-26 01:55:44

标签: android renderscript

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

  1. 从Java我使用forEach_kernel()调用内核并且没有阻塞 - 我不得不添加额外的Allocation.copyTo()以便我可以使用结果。还有另一种方式吗?
  2. 我读到某个地方,如果有2个内核,那么调用第二个将阻塞,直到第一个完成。导致这种情况的原因是什么 - 可能只有在进行相同的分配时?
  3. 可调用函数会阻止a)彼此,b)内核吗?特别是,我有一个自定义初始化程序可调用函数,我需要准备一些稍后将由内核使用的数据。这个准备可能需要一些时间,所以我想知道用Java调用script.invoke_somefunc()然后立即调用script.forEach_kernel()是否有危险?

2 个答案:

答案 0 :(得分:7)

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

2)我们一次只允许一个内核执行(忽略ScriptGroup,你有一个内核的DAG,因此可能有一些额外的优化空间)。在这种情况下,第二个内核在第一个内核完成之前不会开始运行。

3)Invokable函数(即你用Java调用_ *()运行的东西)异步。您将阻止它们在Java端完成。因此,它们会相互阻塞,或者内核。如果你有一个内核后跟一个调用,你将异步启动内核,但是在内核完成之前调用才会开始。然后,您将等待调用完成。

还有一个细节。如果初始化程序不需要参数,则可以将其置于实际的“void init(void)”函数中。那些在创建ScriptC时运行一次。

答案 1 :(得分:2)

我的实验表明,即使函数在Java级别上异步调用,它们也会在RenderScript中一个接一个地执行。所以基本上有:

script.invoke_somefunc();
script.forEach_kernel();
alloc.copyTo(); // or rs.finish();

将立即从前2行返回,但在kernel完成之前,RenderScript级别somefunc将不会启动。从文档中可以看出这一点并不明显。第三行将阻止,直到一切都完成。