我是RenderScript的新手,并且在阻止Java层的呼叫的性质上仍然没有那么好主意。一般问题是:哪些情况阻止了代码并允许Renderscript完成。特别是:
- 从Java我使用
forEach_kernel()
调用了一个内核,这并没有阻止 - 我必须添加额外的Allocation.copyTo()
,以便可以使用结果。还有另一种方式吗? - 我在某个地方读到,如果有2个内核,那么呼叫第二个将阻塞直到第一个核心将完成。什么条件会导致这一点 - 也许只有在相同的分配工作时才可能?
- 可调用的功能会阻塞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
完成。从文档中来看,这并不是那么明显。第三行将阻塞直到一切都完成。