android - Renderscript 中的内存分配

标签 android memory-management renderscript

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

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

文档指出:

Non-static, global variables that you declare in your RenderScript are allocated memory at compile time.

情况总是如此吗?

其次,Renderscript 是否请求分配给 Android VM 的内存还是 Android 物理内存?

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

Applications that use RenderScript still run in the Android VM. The actual RenderScript code, however, runs natively and needs access to the memory allocated in the Android VM.

这并没有清楚地回答上述问题。

最佳答案

假设您有一个脚本(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 对象与 native 对象相关联,Java API 通过 JNI 访问这些对象。 native 对象包含分配的实际后备存储、内核的实际位码等。

供应商驱动程序可能会将缓冲区放入其 GPU 或类似内容的特殊位置,但从应用程序开发人员的角度来看,这相当于在 Dalvik 堆外部分配的内存。

关于android - Renderscript 中的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21136588/

相关文章:

android - 更改抽屉导航中的布局

android - 如何使用名称android的首字母两个字符制作缩略图?

memory-management - CUDA 分配数组

android - RenderScript 应用程序中的 SIGSEGV

renderscript - 如何在 Android RenderScript 中同时缩放、裁剪和旋转

android - 连接 iPhone 和 Android 设备(同一局域网)

java - 如何使用适用于 Android 的 OpenGL 2.0 绘制 UV 球体并对其进行纹理处理

java - Java URLClassLoader 内存泄漏

objective-c - 返回指向不同对象的指针的方法是否会自动分配和初始化其他对象?

android - 在 Android studio 1.0.1 with API @ 21 and SDKTools @ 21.1.2 添加 Renderscript 导致构建错误