RenderScript阻塞函数调用

fra*_*yan 4 android renderscript

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

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

Ste*_*nes 7

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

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

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

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