我想更好地了解内存分配在Renderscript中的工作原理。
首先,我想确认是在运行时还是编译时分配内存。
文档说明:
您在RenderScript中声明的非静态全局变量 在编译时分配内存。
总是这样吗?
第二,Renderscript是否请求分配给Android VM或Android物理内存的内存?
在文档中我只能找到以下内容:
使用RenderScript的应用程序仍在Android VM中运行。该 但是,实际的RenderScript代码本机运行并需要访问 Android VM中分配的内存。
这不能清楚地回答上述问题。
答案 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堆之外分配的内存。