RenderScript 不仅可以用来画图,而且可以用来做密集的计算操作。目前的API可以使用到的是利用CPU的核心优势来帮我们做计算。在未来,可能会包括GPU和DSP处理器上做精密计算。

创建一个Compute  的RenderScript

下面有一张图详细的介绍了勾划了一个Compute 的 RenderScript:

图解:Andriod 有一个RenderScript Compute 的引擎来支持做精密计算,后期google 会不断扩展这个引擎让其支持更多的精密计算如上面提到的GPU、DSP等等,创建Compute RenderScript 同样的也必须写一个.rs 文件,做运行时生成对象读取调用。之后在Android 上层实现计算功能。另,(必须显示在应用上调用forEach_root或者在RenderScript 运行时运件中.rs,调用rsForEach(),Compute 才会自动调用硬件支持核心来计算) .

参照DEMO

  1. 在上层调用forEach_root 计算的DEMO
  2. 在RenderScript 运行时调用rsForEach计算的DEMO

其实,两个DEMO都实现了同一样的功能,就是将一张图片使用滤镜效果将其变颜色RGB值变成灰尘色,而另一张则原样显示,该DEMO参考了SDK中的HelloWorldCompute DEMO,而唯一与SDK中不一样的地方是在:SDK是在于上层调用forEach_root方法进行计算,而我使用的是在.rs 中调用rsForEach方法进行计算。两者功能相同,实现效果不一样而已。

在上层调用forEach_root 计算的DEMO

区别的代码在于:

SDK DEMO

.rs文件 :

#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.hellocompute)

const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};

void root(const uchar4 *v_in, uchar4 *v_out) {
    float4 f4 = rsUnpackColor8888(*v_in);

float3 mono = dot(f4.rgb, gMonoMult);
    //dot:[0]*[0]+[1]*[1]+[2]*[2]
    *v_out = rsPackColorTo8888(mono);
}

createScript方法:

private void createScript() {
        mRS = RenderScript.create(this);

mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
                                                    Allocation.MipmapControl.MIPMAP_NONE,
                                                    Allocation.USAGE_SCRIPT);
        mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());

mScript = new ScriptC_mono(mRS, getResources(), R.raw.mono);

mScript.forEach_root(mInAllocation, mOutAllocation);//通知RenderScript Compute Runtime 
        mOutAllocation.copyTo(mBitmapOut);
    }

在RenderScript 运行时调用rsForEach计算的DEMO

.rs文件:

#pragma version(1)
#pragma rs java_package_name(com.xuzhi.renderScriptCompute)

rs_allocation gIn;
rs_allocation gOut;

rs_script gScript;

const static float3 gMonoMult={0.299f,0.587f,0.114f};

void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y){

//将一个uchar4 的颜色解压为float4
    float4 f4=rsUnpackColor8888(*v_in);
    
    //dot:[0]*[0]+[1]*[1]+[2]*[2]
    float3 mono=dot(f4.rgb,gMonoMult);
    //打包uchar4,alpha 默认为1.0
    *v_out=rsPackColorTo8888(mono);
    
}

void filter(){
//调用RenderScript 进行处理(操作输入的图片然后把处理的结果放到输出结果中),最后把处理完的数据存回bitmap ,在ImageView显示出来
     rsForEach(gScript, gIn, gOut);
}

createScript方法:

private void createScript() {
        mRS = RenderScript.create(this);
        //从一个bitmap 创建一个allocation
        mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
                Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
        
        mOutAllocation=Allocation.createTyped(mRS, mInAllocation.getType());
        
        mScript=new ScriptC_mono(mRS, getResources(), R.raw.mono);
        mScript.set_gIn(mInAllocation);
        
        mScript.set_gOut(mOutAllocation);
        
        mScript.set_gScript(mScript);
        
        mScript.invoke_filter();//通知RenderScript Compute Runtime 
         
        mOutAllocation.copyTo(mBitmapOut);
        
        
    } 

总结

两种方法无论怎么变化,最终的上的都是要通知RenderScript Compute 运行时做计算功能。 运行效果:

代码下载:

RenderScript->Compute

Android RenderScript 关于Compute 的使用相关推荐

  1. 关于Android RenderScript 的详细说明和一些实用文档

    RenderScript 是一种低级的高性能编程语言,用于3D渲染和处理密集型计算(3D播放等和关于CPU密集型的计算).一直以来Android 在绘图性能的表现一直差强人意,引入NDK之后才有所改善 ...

  2. Android高级模糊技术RenderScript和FastBlur

    原帖地址:http://segmentfault.com/a/1190000000448785 为什么学习这个模糊技术? 现在越来越多的开发者喜欢在自定义控件的时候加上各种模糊背景,看看RomanNu ...

  3. Android eclipse RenderScript 初探(快速处理图片)

    请参考:"Android preview YUV转换 RenderScript 优化" https://blog.csdn.net/zhjali123/article/detail ...

  4. Android:CheckBox控件

    1)ChexkBox继承自CompoundButton组件: 2)isChecked()--确定是否选中:setChecked(bool checked)--设置选中或取消选中: 3)监听事件:Com ...

  5. 【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位网友补充完善...

    链接地址:http://www.tuicool.com/articles/jyA3MrU 时间 2015-01-05 10:08:18  我是程序猿,我为自己代言 原文  http://blog.cs ...

  6. Android API Guides---RenderScript

    RenderScript RenderScript是在Android上的高性能执行计算密集型任务的框架. RenderScript主要面向与数据并行计算的使用.尽管串行计算密集型工作负载能够受益.该R ...

  7. 【安卓开发】Android初级开发(okhttp3发送带header与带参数的GET请求)

    1.首先需要先加入相应依赖 dependencies{implementation 'com.squareup.okhttp3:okhttp:3.13.1' implementation 'com.s ...

  8. android studio开源代码,Android Studio Set of source 代码源集

    一.源集 1.定义:Android Studio 按逻辑关系将每个模块的源代码和资源进行分组,这个分组叫做源集. 2.main Module 源集包括其所有构建变体共用的代码和资源.这句话很关键,意思 ...

  9. Android开源库集锦

    2019独角兽企业重金招聘Python工程师标准>>> 一.兼容类库 ActionBarSherlock : Action Bar是Android 3.0后才开始支持的,Action ...

最新文章

  1. WSS 3.0 Object Model
  2. PDF阅读器Foxit Reader 2.2简体中文版
  3. osg图元绑定方式总结
  4. 数据结构与算法--位运算
  5. Python模块及其导入
  6. linux 指令引用变量,Linux之变量引用与命令替换
  7. 微软高性能计算服务器pdf,微软高性能计算HPCserver2008技术概览.pdf
  8. 【七】jmeter 连接 mysql 数据库(Jmeter 连接数据池)配置:JDBC Connection Configuration
  9. LeetCode—1.快速排序算法
  10. 【渝粤教育】电大中专药剂学基础知识作业 题库
  11. Docker教程小白实操入门(4)--如何停止一个容器
  12. mysql 中文手册 pdf_Mysql8.0中文参考手册 中英文chm+pdf版
  13. 村村响农村广播-盐池县农村IP广播案例
  14. word自定义目录格式时设置的标题格式不生效
  15. c语言 输出方阵。输入一个正整数 n(1≤n≤10),打印一个n行n列的方阵,输出如下方阵
  16. 实现顺序串各种基本运算的算法
  17. 工行二维码支付接口及回调接口
  18. 深度学习中的depthwise convolution,pointwise convolution,SeparableConv2D深度可分离卷积
  19. 歌礼与康宁杰瑞达成病毒性疾病领域抗体药物战略合作
  20. Meteorographica:一个用Python绘制天气图的气象代码库

热门文章

  1. python自动化控制设备有限公司_华为 Python网络自动化
  2. css 实现一个尖角_一个讲述了 CSS 相关的技巧、动画实现 的开源项目(60篇相关文章)...
  3. mysql优化插入速度的方法_优化MySQL插入方法的五个妙招
  4. linux ruby 安装路径,Linux(CentOS 7)安装ruby
  5. eclispe Springboot项目修改html,jsp 页面不能及时刷新
  6. 华睿相机sdk 开发_索尼发布相机远程操作SDK(软件开发工具包)
  7. 为什么商家数字化离不开交易平台
  8. 新商业蓝皮书2021
  9. 2020-2021家居行业年度盘点与趋势洞察
  10. package和import