当前位置:操作系统 > 安卓/Android >>

Android高级Renderscript---Andvanced Renderscript(一)

因为利用Renderscript的应用程序依然运行在Android虚拟机(VM)内部,所以能够访问所有你熟悉的框架API,但也可在适当的时机利用Renderscript。为了促进Renderscript运行时和框架之间的相互作用,利用中间层代码来帮。助两个代码层之间的通信和内存管理。本文深入讨论不同代码层的更多细节,以及Android VM和Renderscript运行时之间是共享内存的。

Renderscript Runtime层

Renderscript 代码被编译,并且在一个简洁而明确的Runtime层被执行。Renderscript运行时API提供了对密集计算的支持,它能够方便而自动的扩展到可用处理器内核上。

注意:NDK中标准的C函数保证要运行在CPU上,所以Renderscript不能访问这些类库,因为Renderscript被设计成要运行在不同类型的处理器上。

Renderscript代码要定义在Android工程src/目录中的*.rs和*.rsh文件中。通过llvm编译器Renderscript代码被编译成中间字节码,llvm编译器是作为Android编译的一部分来运行的。当应用程序在设备上运行时,该字节码会通过驻留在设备上的另一个llvm编译器即时的编译成机器码。该机器码会针对设备进行优化并被缓存,因此后续对该Renderscript的使用不需要重新编译该字节码。

Renderscript运行时类库包括以下一些关键的功能:

1. 内存分配请求的功能;

2. 带有标量和矢量类型的数学函数库,该函数库是许多共同例程的重载版本。如加法运算、乘法运算、点阵运算、叉积运算以及原子计算和比较函数等都是有效的;

3. 原始数据和向量、矩阵、日期和时间的转换;

4. 支持Renderscript系统的数据类型和结构,如针对向量类型所定义的二维、三维、四维向量;

5. 日志函数。

反射层

反射层是一组由Android编译工具生成的类,使用这些类允许从Android框架中访问Renderscript运行时。该层还提供了一些方法和构造器,它们允许使用在Renderscript代码中定义的指针所指向的内存来进行内存分配和相关工作。下面列出了一些主要的反射组件:

1. 你创建的每个.rs文件都会生成一个ScriptC类型的名叫project_root/gen/package/name/ScriptC_renderscript_filename的类,这个文件是你的.rs文件的.java版,你能够在Android框架中调用这个类。该类包含了从.rs文件中反射来的以下项目:

    A. 非静态函数;

    B.非静态的,全局的Renderscript变量。Android编译工具会给每个变量生成访问器方法,以便能够在Android框架中读写这些Renderscript变量。如果一个全局变量在Renderscript运行时层被初始化,那么那些初始化的值会被用于初始化Android框架层中对应的变量。如果全局变量被标记为const,那么就不会生成set方法。

    C.全局指针www.zzzyk.com

一个被反射到自己类的名叫project_root/get/package/name/ScriptField_struct_name的struct,它继承Script.FielBase类。这个代表了一个struct数组,它允许给这个struct的多个实例分配内存。

 


作者:FireOfStar
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,