Renderscript中的内存分配

时间:2014-01-15 11:47:32

标签: android memory-management renderscript

我想更好地了解内存分配在Renderscript中的工作原理。

首先,我想确认是在运行时还是编译时分配内存。

文档说明:

  

您在RenderScript中声明的非静态全局变量   在编译时分配内存。

总是这样吗?

第二,Renderscript是否请求分配给Android VM或Android物理内存的内存?

在文档中我只能找到以下内容:

  

使用RenderScript的应用程序仍在Android VM中运行。该   但是,实际的RenderScript代码本机运行并需要访问   Android VM中分配的内存。

这不能清楚地回答上述问题。

1 个答案:

答案 0 :(得分:2)

假设您有一个脚本(cats.rs),其中包含一些像

这样的全局变量
int hats[4096];
char bats[32];
float rats;
// a bunch of kernels follow here

当您创建新的ScriptC_cats时,所有这些缓冲区将被分配为该脚本对象的一部分;大小要求是在编译时设置的,并且在实例化时服从,所以正确的事情会发生在你身上。

所有RenderScript对象分为两部分。首先,有一个API对象,这是您在致电RenderScript.create()new ScriptC_cats时实际收到的内容。这些API对象存在于Dalvik堆中,并且非常小(对于较大的对象,可能有几百个字节)。这些API对象与Java API通过JNI访问的本机对象相关联。本机对象包含分配的实际后备存储,内核的实际bitcode等。

供应商驱动程序可能会将缓冲区放入GPU的特殊位置或类似的位置,但是应用程序开发人员POV等同于在Dalvik堆之外分配的内存。