Android 3.0之后推出了Renderscript,最近也稍微研究了一下,觉得挺有意思,这里小做个总结以作备忘,以后有空的时候再写个demo。
简单的说,Renderscript的出现可以算作NDK的替代品,但它有其独特的优势。首先最重要的一点,它的可移植性。Renderscript是设计成可以在搭载不同处理器的设备上运行,因为它是在运行时编译缓存的。其次是简便,与NDK相比,它省去了编写JNI的过程,由编译工具自动生成对应的Java代码,也没有了繁琐的配置过程,使得开发过程更简单。但在性能上而言,Renderscript与NDK完全可以媲美,同时还提供了很多运算和图形渲染的API,因而当程序需要追求高效率时,Renderscript是一个很好的选择。
下面是Renderscript系统的结构图。
从图中可以看到很有意思的一点,Renderscript的内存分配在framework层,之后再通过Memory Binding这样的一个过程将内存分配给Renderscript运行时。为什么要这样设计呢?想想在用c/c++写代码的时候,内存管理往往是很容易出问题的一个环节,而Java由于有GC的存在,因而在编码的时候不用时时想着要去释放内存,这对于程序员来说是件很开心的事情。所以将内存管理的部分放在Java层,也是为我们程序员们着想。另外Renderscript出现的目的主要是提供高效的运算和图形渲染,把内存分配给剥离出来,把最主要的运算和图形处理交给Renderscript,做好明确的分工,这样也能够减少一些逻辑上的复杂度。
Renderscript分为三层结构:Android框架层、反射层和Renderscript运行时。 Renderscript的代码是运行在Renderscript运行时上的。实际上Renderscript代码的语法其实就和c一样,就连文件后缀名“.rs”和“.rsh”也分别与“.c"和”.h“一致。Renderscript代码在build应用的时候编译成字节码,在应用运行时编译成机器码,并且机器码会缓存起来,不需要每次运行的时候都要将字节码再编译成机器码。运行时库主要包括了:图形渲染函数、内存分配申请功能、大量数学运算函数、数据换算、数据类型以及Log函数。
至于反射层,是由android build工具将Renderscript代码自动生成的Java代码,具体的对应关系可以参看开发者文档http://developer.android.com/guide/topics/renderscript/index.html。
总结一下,Renderscript的主要用途在于当某些应用在数学运算和图形渲染上追求高效率(比如3D游戏)。下回尝试着用它写个小游戏试试,看看效率如何。