rendercript入门

rs的root函数需要至少一个输入和一个输出。

在java中进行编程时需要的有:一个RenderScript对象,一个Allocation的输入in和输出out对象,in是通过将需要处理的数据利用createFrom××来进行初始化的,而out则需要将其进行createTyped操作,参数是in的类型。然后在new一个环境利用RS文件进行自动生成的java类对象(参数涉及到之前的RenderScript对象)。调用生成的java类对象的forEach_root方法,将in和out作为参数传递给rs脚本,执行脚本完毕之后,将out对象利用copyTo方法拷贝给需要的对象(类型需要注意)。


1. 准备输入数据和输出数据 ,如mIn,mOut。并将mIn进行数据初始化。创建mOut对象等待最后拷贝结果。比如将图片作为处理对象,可以利用loadBitMap进行创建。而mOut则需要创建一个没有数据的对象等待拷贝工作。

2. 创建RenderScript对象,作为rs的java类初始化的参数使用。使用create来进行创建。

3. 创建Allocation对象in和out,利用mIn将in初始化(createFromBitMap方法,也可以使用CreateSize方法),out初始化时无数据,使用CreateTyped创建一个与in.getTyped()相同类型的对象。

4. 利用RenderScript对象来创建RS的java类对象。gen文件夹下以ScriptC开头的自动生成的类。参数是RenderScript类型(相当于RS的上下文)/getResource/R.raw.××,

5. 调用forEach_root方法,参数为in和out

6. 将out拷贝到mOut对象中。


-----------------------------------------------------------------------------------------------

一种RenderScript的写法是void root(const uchar4 * in, uchar4 * out, const int * params, unit32_t x, unit32_t y){}这种类型的方法。文件头部需要写pragma version和pragma rs java_package_name(包名)进行声明。

几个参数中,第一个参数一定要是cosnt类型,如果不是,则编译不通过。如果没有in,只有一个非const的参数,则编译系统认为第一个参数是out,而没有in。


在RenderScript中循环执行root函数的时候,如果需要得到输入或者输出的指针偏移量,有两种方法,一种是将参数作为指针按照C语法进行偏移,这种做法容易越界,并且非谷歌推荐。还有一种方法就是声明一个rs_allocation类型全局变量mIn(在rs文件中定义这个变量之后,对应的java类则会有一个set方法来进行全局变量的传递),然后rs文件中通过rs_GetElementAt_uchar4(mIn, row, col)来获得数据。还有方法rs_SetElementAt_uchar4(mOut, row, col)。

在全局定义简单类型变量的时候,也会在java类中生成一个bind函数,将java代码中的变量绑定在rs变量上。

在rs文件中进行自定义函数的使用的时候,返回值非void自定义函数需要声明为static,告诉编译器只有本文件内自己使用。返回值为void的函数则会在java类中自动生成相应接口invoke_funcName供java代码调用,但是参数不能带指针,因为java没办法调用带指针函数,会报错。基本上就是两条原则,rs自己使用的函数需要定义为static,给java提供的函数则不能带指针参数和返回值。

rs代码的调试则使用rsDebug(“ tag”,“ ×××”)函数。或者rsDebug(" ", in->xyzw)或者rsDebug(“ ”,in->x, in-.y, in->z)

另外一种则是将out写到返回值的地方参数形式不同,但是基本用法是相同的

具体格式为 int  _ _attribute_ _((kernel)) funcName(int  in, unit32_t col, init32_t indexY) { }。要求就是参数不能使用指针,也就避免了偏移的越界问题,返回类型可以是void或者其他类型,返回值就是第一种写法的out参数。第一种写法的第三个参数为params,但是跌入中写法中将不使用params,而是改成上面说过的全局变量,并且不能是指针类型。


你可能感兴趣的:(rendercript入门)