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

RenderScript 是一种低级的高性能编程语言,用于3D渲染和处理密集型计算(3D播放等和关于CPU密集型的计算)。一直以来Android 在绘图性能的表现一直差强人意,引入NDK之后才有所改善,而在Honeycomb 中发布了RenderScript 这一杀手级在Framework 后,大大的增加了Android 本地语言的执行能力和计算能力。以下是参考一些网上总结的几点:

编程语言和可移植性

RenderScript 采用了c99语法(标准C来自1999年,最新标准是C11,来自2011年),新的应用编程接口(API)最终编译成原生代码。这意味着做为Android 图形开发者就不得不再系统的学习一套API,因为它的API并非人人都清楚,而Google 对于RenderScript  这方面的文档又少之又少。

RenderScript 无法从其他C应用程序移植过来,不过它在Android 设备上比NDK 更常见。相比于NDK的可移植性要弱一些,记得以前移植过一个C程序叫Cadaver的webdav客户端 就是使用的NDK,所以这点来说RenderScript 的移植性可以说有待改善。

 

 

 编译和调试

RenderScript 在机器上进行第一遍编译,然后在目标设备上进行最后一遍编译(Just-In-Time Compiling),因而带来更高效的原生二进制代码。这也就是意味着,凡是支持RenderScript 的设备都可以运行你的代码。不用管什么架构。

目前 ,RenderScript 带来的代码只能在主处理器上运行,它会自动生成可利用多个核心的代码(如果设备上有多个核心)。就因此,编译出来的程序是针对该机器的最佳优化,这解决了Device Fragmentation,也就是说开发者再也不必担心使用者的手机、平板够不够好、有没有GPU...等等问题,全都交给RenderScript 去担心就好。没有GPU,RenderScript 写好的程序就交由CPU来处理(背后的编译技术其实是使用的LLVM)。

 

 性能

RenderScript 有类似于CUDA的Compute API用于计算,配置和设置相对比较容易。最终的运行速度实际上要比胜过于NDK 的实现方式, 需要编写的代码比较少。而RenderScript 最适合用于做3D的用户界面或高性能计算任务。而上面的编译和调试所说的一样,随着最后一遍的编译可以通过硬件直接或得性能的提升。

 

最后

引入RenderScript 并不是来代替NDK的,而是给开发者多一种选择。 

 

如何学习?

关于官方的文档 

http://developer.android.com/guide/topics/renderscript/index.html  这是官方RenderScript 的首页

http://developer.android.com/guide/topics/renderscript/graphics.html   关于图形方面的知识

http://developer.android.com/guide/topics/renderscript/compute.html  关于计算方面的知识

国外一个比较不错的开发者的博客,目前只有两篇: 

http://blog.iangclifton.com/2011/08/24/renderscript-101-part-1-renderscript-basics-tutorial/

http://blog.iangclifton.com/2011/08/24/renderscript-101-part-2-renderscript-interaction/

 

另外那些rs文件里面的函数如何寻找?

4.0的请到框架这里查找相应的头文件:

frameworks/base/libs/rs/scriptc,这里包含以下的头文件

 rs_allocation.rsh  rs_atomic.rsh  rs_cl.rsh  rs_core.rsh  rs_debug.rsh  rs_graphics.rsh  rs_math.rsh  rs_matrix.rsh  rs_object.rsh  rs_quaternion.rsh  rs_time.rsh  rs_types.rsh

或者在SDK的platform 下也可以找到。

对应的文档在下面:


另外:

想学好RenderScript 必须先看一下关于图形学方面的知识和熟悉OpenGL方面的知识,路遥遥呀。。。。 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 AlertDialog 高斯模糊的方法与一般的 View 高斯模糊基本相同,只需要在 AlertDialog 的背景中添加高斯模糊效果即可。下面是使用 RenderScript 实现 AlertDialog 高斯模糊的示例代码: 1. 在 res/values/styles.xml 文件中定义一个 MyAlertDialogTheme 主题,用于设置 AlertDialog 的样式: ``` <style name="MyAlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="android:windowBackground">@drawable/dialog_bg_blur</item> </style> ``` 2. 在 res/drawable 文件夹中创建一个 dialog_bg_blur.xml 文件,用于设置 AlertDialog 背景: ``` <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 设置底层背景 --> <item android:id="@android:id/background"> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent" /> </shape> </item> <!-- 设置高斯模糊层 --> <item android:id="@+id/dialog_blur_layer"> <bitmap android:src="@drawable/dialog_bg" /> </item> </layer-list> ``` 其中,dialog_bg.xml 是一个不带高斯模糊效果的背景图片。 3. 在 res/drawable-v21 文件夹中创建一个 dialog_bg_blur.xml 文件,用于设置 AlertDialog 背景(仅适用于 Android 5.0 及以上版本): ``` <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 设置底层背景 --> <item android:id="@android:id/background"> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent" /> </shape> </item> <!-- 设置高斯模糊层 --> <item android:id="@+id/dialog_blur_layer"> <bitmap android:src="@drawable/dialog_bg" /> <blur android:radius="25dp" android:scale="1" /> </item> </layer-list> ``` 其中,blur 标签用于设置高斯模糊效果,radius 属性表示模糊半径,scale 属性表示模糊程度。 4. 在 Java 代码中创建一个 Bitmap 对象,用于存储高斯模糊后的图片: ``` private Bitmap getBlurBitmap(Context context, Bitmap bitmap) { // 创建一个空的 Bitmap 对象 Bitmap blurBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); // 创建一个 RenderScript 对象 RenderScript rs = RenderScript.create(context); // 创建一个 Allocation 对象,用于存储原始图片数据 Allocation input = Allocation.createFromBitmap(rs, bitmap); // 创建一个 Allocation 对象,用于存储高斯模糊后的图片数据 Allocation output = Allocation.createFromBitmap(rs, blurBitmap); // 创建一个 ScriptIntrinsicBlur 对象,用于实现高斯模糊效果 ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); // 设置高斯模糊半径 script.setRadius(25); // 执行高斯模糊 script.setInput(input); script.forEach(output); // 将高斯模糊后的图片数据保存到 Bitmap 对象中 output.copyTo(blurBitmap); // 销毁 RenderScript 对象 rs.destroy(); return blurBitmap; } ``` 5. 在 Java 代码中创建一个 AlertDialog 对象,并为其设置 MyAlertDialogTheme 主题: ``` AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyAlertDialogTheme); builder.setTitle("AlertDialog"); builder.setMessage("This is an AlertDialog with blur background."); builder.setPositiveButton("OK", null); builder.setNegativeButton("Cancel", null); AlertDialog dialog = builder.create(); ``` 6. 在 Java 代码中获取 dialog_blur_layer 图层,并为其设置高斯模糊后的 Bitmap 对象: ``` // 获取 dialog_blur_layer 图层 ViewGroup decorView = (ViewGroup) dialog.getWindow().getDecorView(); ViewGroup contentContainer = (ViewGroup) decorView.findViewById(android.R.id.content); FrameLayout container = (FrameLayout) contentContainer.getChildAt(0); ImageView blurLayer = (ImageView) container.findViewById(R.id.dialog_blur_layer); // 获取原始图片 Drawable drawable = blurLayer.getDrawable(); Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); // 获取高斯模糊后的图片 Bitmap blurBitmap = getBlurBitmap(this, bitmap); // 将高斯模糊后的图片设置给 dialog_blur_layer 图层 blurLayer.setImageBitmap(blurBitmap); ``` 需要注意的是,Android 中的 RenderScript 只能在 Android 4.2(API 17)及以上版本中使用。在使用 RenderScript 时,需要注意内存的使用和回收,以避免内存泄漏和程序崩溃。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值