RenderScipt 学习总结
Renderscript(渲染脚本)是Google全新加入的一个标志性功能,是一个新的 API, 旨在带来更高的性能的下级 API 给开发者,它带有高性能的 3D 渲染和计算操作,这可以很大程度的提高他们的应用程序的性能
Renderscript 已经被使用到了一些东西中,比如 Honeycomb 的动态壁纸中以及复杂的 YouTube 和 Book 应用中,这个内建的 Renderscript 是非常出色的,就像 Google 说的“接近极端”,它将提高你的设备上执行本地代码的性能。从目前的情况来看这是非常不错的,与现存的 NDK 不同,最终产品将可以跨平台工作。(以上介绍均来自网上)更多介绍请google。
光栅化:
确定最佳接近图形的像素集合,并用指定属性写像素的过程!也称为扫描转化。 OpenGL红宝书上解释为:把物体的数学描述以及与物体相关的颜色信息转换为屏幕上的像素,这个过程称为光栅化。
//解释什么是Allocation ,Type ,Element ,
Android自2.1以后增加了Renderscript以加强图像和3D方面的处理能力和速度。RenderScript简单的讲,可以概括为:
•什么是RenderScript
–提供了一套API,封装了着色器语言的使用和配置
–分为Java,JNI,Native三层
–Engine <- Script–Script执行前被编译成机器码
•干什么?
–帮助书写更加高效的OpenGL程序
–利用GPU的计算能力 •着色器语言实际是对GPU的高级编程
但是在讲RenderScript之前还是要简略介绍一下着色器语言,因为RenderScript其实主要是为了更便捷的使用它
Shader(着色器)是用来实现图像渲染的用来替代固定渲染管线的可编辑程序,它分为
–顶点着色器 •对每个顶点进行坐标转换,法向量转换,光照计算,将结果保存
–片断着色器 •对每个片断进行颜色计算
目前主流的分类 –OpenGL - GLSL–Direct3D - HLSL–Nvidia– CG
RenderScript 分为Java和Native两层,Java只是对Native的封装,因此我们只需要关注native的结构和运行,至于Java的接口使用比较繁琐,需要另文说明。下面就是RenderScritp的简要结构和个不部件之间的关系。
Context是一个独立的线程,维护着整个运行环境的上下文的运行状态。Context中包含至少一个Script对象,该对象首先根据设置的脚本文件路径读取脚本文件,然后将脚本通过libacc(一个小的c编译器)进行编译,将脚本中的固定符号(init和main())填充进自己固定的函数指针。Context这个线程会定时调用Sctipt的run()方法,进而执行Script中早已填充好的函数指针,从而完成脚本的运行。
但是只有脚本本身是远远不够的,它只能完成C语言的一个子集的功能。更多的和图像,3D有关的操作还要借助其他模块完成。整个辅助模块可以分为两组:
第一组是 存储类
第二组是 着色器处理程序类
存储类主要用来进行数据的存储和上层java的交换,包括Type,Element,Allocation。Element可以理解为一个结构体,ru
struct {
int a
} A;
就可以是一个element。Type是对这个结构体的类型的命名,A 就是这个type。但光有type和element不行,我们还需要切实的实例,而这个实例就是Allocation:
struct A AllocationOfA = new struct A{3};
AllocationOfA就是一个Allocation。
在RenderScript运行之前,必须的Allocation要分配好,他们可能是定点坐标,可能是纹理,也可能是用户的数据。
着色器处理程序类分为4类:ProgramFragment ProgramFragmentStore ProgramVertext Mesh。
ProgramFragment对应片断处理程序,对光栅化的每一个片断做独立的处理,包括映射纹理点,混合,着色等。
ProgramFragmentStore主要负责一些跟片断处理相关的辅助功能,如设置混合模式等。
ProgramVertext对应顶点处理程序,对每一个顶点做独立的处理,包括视景投影变换,法线变换等。
Mesh又叫网格,是方便对一组顶点的处理的类。
以上四个类最终都会被调用setupGL或render这样方法,在这些方法中讲用户的配置转换为OpenGL的具体操作序列。如果运行在GLES2.0上,这些OpenGL操作会使用真正的着色器语言来实现,这也是RenderScript最大功能的体现之一。
无论是存储类还是处理器类都是被context创建出来的,他们的声明周期也为context控制。Script在运行过程中,会从context中获取这些实例,以读写数据和执行相关的OpenGL操作。
RenderScript提供了一系列函数和实现来实现存储类和处理器类的操作,包括读allocation,写allocation,绑定处理器实例,以及一些绘图操作。用户在编写script的时候可以以预定和“库函数”方式调用这些函数。Script编译的时候这些“库函数”的符号就被解析成RenderSctipt中真正的对应函数地址。
最后我们可以总结一下renderscript的运行步骤
•Java
- 创建和设置
–创建RenderScriptContext
–设置Surface
–创建和设置处理器
•ProgramVertext - 顶点处理器
•ProgramFragment– 片段处理器
•ProgramFragmentStore– 和片段处理器相关的工作,如混合模式
•Allocation – Script中用到的变量
–设置script src,绑定处理器和变量
•Native
– 编译和执行
–编译脚本,fullfill main函数指针
–处理器 -> opengl操作(设置,创建实际处理器程序并连接)
–在线程中循环执行main函数
Invoke 的使用