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,您的内核小点,因此也许还有一些额外的优化空间)。在这种情况下,您的第二个内核不会在第一个内核完成之前开始运行。

3)可调用功能(即用Java的Invoke _*()运行的事物)是不是 asynchronous。您将阻止他们在爪哇一侧完成。因此,它们将互相阻挡或内核。如果您有内核,然后是调用,则将异步启动内核,但是直到内核完成后才开始启动。然后,您也将等待调用完成。

另外一个细节。如果您的初始化器不需要参数,则可以将其放置在实际的" void Init(void)"函数中。这些创建脚本时会运行一次。

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

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

将立即从前2行返回,但是在Renderscript级别上,kernel才能启动,直到somefunc完成。从文档中来看,这并不是那么明显。第三行将阻塞直到一切都完成。

最新更新