本文译自:http://developer.android.com/guide/topics/renderscript/compute.html#creating-renderscript
渲染脚本(Renderscript)提供用C语言(C99标准)编写的原生级高性能的计算API。Renderscript让你的应用程序有能力跨越所有可用的处理器内核来自动的平行的运行各种操作。它还提供了对不同类型的处理的支持,如CPU、GPU或DSP等。Renderscript对于图形处理、数学模型或其他任何需要大量的数学计算的应用程序都使用有用的。
另外,不需要编写代码你就能够访问所有这些功能来支持不同的架构或不同数量的处理器内核。也不需要针对不同的处理器类型来编译你的应用程序,因为Renderscript代码是在设备上运行时被编译的。
注意:早期的Renderscript版本包含了一个实验性的图形引擎组件。这个组件限制被Android4.1弃用了(rs_graphics.rsh中的大多数API和android.renderscript中对应的API)。如果你有使用Renderscript来渲染图形的应用程序,强烈推荐你把代码转换到另外的Android图形渲染选项。
Renderscript系统概述
Renderscript运行时的操作是原生级别的,并且依然需要跟Android的虚拟机(VM)进行通信,因此创建一个Renderscript应用程序的方法不同于纯粹的虚拟机应用程序。除了你为程序编写的所需要的Renderscript代码之外,使用Renderscript的应用程序依然是一个运行在虚拟机(VM)中的应用程序,不管你使用它做什么,Renderscript依然保留它的平台独立性,因此不必编写多架构(例如:ARM v5、ARM v7、x86)的Renderscript代码。
Renderscript系统采用了一个控制和从属的架构,在这个架构中低级别的Renderscript运行时代码是由运行在虚拟机(VM)中高级别的Android来控制的。Android VM依然保留所有的对内存管理和分配给Renderscript运行时的绑定内存的控制,因此Renderscript的代码能够访问它。Android框架使用异步的方式调用Renderscript,并且调用会被放到消息队列中,直到它被处理。图1显示了Renderscript系统的结构:
图1.Renderscript系统概要
在使用Renderscript时,在Renderscript运行时和Android框架代码之间有三个层次来确保API的通信:
1. Renderscript运行时API,它允许执行应用程序所需要的计算。
2. 反射层API是一组从Renderscript运行代码中反射出来的类。它是围绕Renderscript代码的一个基本的封装,这个封装允许Android框架和Renderscript运行时进行交互。Android编译工具在编译期间会自动的生成这个层次的类。这些类跟NDK代码一样不需要编写JNI代码。
3. Android框架层,它调用反射层来访问Renderscript运行时。
Renderscript的这种结构的主要优点是:
1. 便捷性:Renderscript被设计层可运行在不同处理器(CPU、GPU和DSP的实例)架构的很多设备上。它所支持的所有这些架构,都不是针对每个特定设备的,因为它的代码会在运行时在设备上被编译和缓存。
2. 高效性:Renderscript通过跨越设备上的过个内核,用并行的方式,提供了高性能的计算API。
3. 易用性:Renderscript在可能的情况下,简化了开发,如取消了JNI代码。
主要缺点是:
1. 开发的复杂性:Renderscript引入了一组新的需要你学习的API;
2. 调试的可见性:Renderscript可能在主CPU以外的处理器(如GPU)上执行(后续的发布计划中),因此如果发生这种事情,调试会变的更加困难。
有关这些层次是如何在一起工作的,
请看“高级Renderscript”(http://developer.android.com/guide/topics/renderscript/advanced.html)