【问题标题】:Memory Allocation in RenderscriptRenderscript 中的内存分配
【发布时间】:2014-01-15 11:47:32
【问题描述】:

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

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

文档说明:

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

总是这样吗?

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

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

使用 RenderScript 的应用程序仍在 Android VM 中运行。这 然而,实际的 RenderScript 代码是本地运行的,需要访问 Android VM 中分配的内存。

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

【问题讨论】:

    标签: android memory-management renderscript


    【解决方案1】:

    假设您有一个脚本 (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 访问的本机对象绑定。本机对象包含分配的实际后备存储、内核的实际位码等。

    供应商驱动程序可能会将缓冲区放置在其 GPU 或类似设备的特殊位置,但来自应用程序开发人员的 POV,这相当于在 Dalvik 堆之外分配的内存。

    【讨论】:

    • 所以,假设我们希望处理大位图,我们可以传递输入位图并立即回收它,然后给它一个新的输出位图以将数据放入(或者实际上根本不回收,而只是给出相同的位图对象)?这样一来,您就没有时间在 dalvik VM 堆内存上保存 2 个位图了,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多