我是RenderScript的新手,对于Java层调用的阻塞/非阻塞性质仍然不太了解。一般问题是:哪些情况会阻止代码并允许RenderScript完成。特别:
forEach_kernel()
调用内核并且没有阻塞 - 我不得不添加额外的Allocation.copyTo()
以便我可以使用结果。还有另一种方式吗?script.invoke_somefunc()
然后立即调用script.forEach_kernel()
是否有危险? 答案 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
将不会启动。从文档中可以看出这一点并不明显。第三行将阻止,直到一切都完成。