Android视图框架对于创建复杂布局非常方便。然而,这种便利是以性能为代价的。当性能至关重要的时候,Android提供了几种更强大的图形处理能力,当然难度也是随之上升了。在本节中,我将介绍:

(1)SurfaceView使用标准的Canvas对象并与单独的渲染进程结合,得到更好的性能;

(2)新得RenderScript框架可以被用于创建独立结构的图形渲染;

(3)OpenGL可用于一些严格的图形工作和游戏。

2、RenderScript创建独立结构的图形渲染

RenderScript是用来在Android上编写的高性能代码的一种语言,API。RenderScript由Android 3.0引进,它包括图形API和与CUDA或者OpenGL类似的运算API。它是独立与构架的,所以不需要为不同的CPU或者GPU处理器定制代码。RenderScript通过选择合适的处理器和内核数目来优化运行代码。如果没有合适的GPU,RenderScript会在CPU上运行所有的操作作为备用,是非常灵活的。

注意:RenderScript依赖于OpenGL,部android设备,模拟器是不可用的。

RenderScript使用的语法基于C编程语言的C99标准。学习过C语言开发的人可以很快的上手。

注意:renderscript 在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符,是因为路径中有中文。

注意:RSSurfaceView : The type RSSurfaceView is deprecated 在API 16之后,网上的例子大部分都是使用RSSurfaceView的。

2.1 介绍RenderScript实例之前,我必须说一下Allocation类。

这个类提供了通过数据传递和RenderScript内核的主要方法。为已经实例的类(RenderScript)提供存储空间和特定类型。

2.2 RenderScript实例编写mono.rs文件

#pragma version(1)
#pragma rs java_package_name(com.example.renderscript) const static float3 gMonoMult1 = {0.299f, 0.587f, 0.114f}; void root(const uchar4 *v_in, uchar4 *v_out, uint32_t i,uint32_t y) {
float4 f4 = rsUnpackColor8888(*v_in);//将输入的颜色值转化为r g b a
float3 mono = dot(f4.rgb, gMonoMult1);//计算向量的点积
*v_out = rsPackColorTo8888(mono); }

int root(viod):程序入口,根据返回值(ms)作刷新,当然也可以不带,这里我就没有用返回值。这里你能够通过由实例化的类(ScriptC_script_name)来创建一个Renderscript对象从Android框架代码中调用Renderscript(如下代码)。这个类包含了一个forEach_root()方法,它会调用rsForeach()方法。你能够传递给它与Renderscript运行时级别调用相同的参数。这种技术允许你的Android应用程序把高精度的数学计算转交给Renderscript(底下我只是传递了一张图片信息)。

当然,如果你修改了rs文件,那么这时候你需要做的就是删除gen目录下对应的ScriptC_mono.java文件,然后删除目录下的mono.d文件,此时系统会重新生成对应的文件,更新你修改的mono.rs文件。

在Android框架层次调用Renderscript的方法:

1.  在你的Android框架代码中分配Renderscript所需要的内存。对于Androi3.2(API Level 13)以前的版本,需要分配输入和输出内存。Android4.0(API Level 14)以后的平台版本只需要分配其中之一的内存或两个都分配。

2.  创建ScriptC_scritp_name类的一个实例。

3.  调用forEach_root()方法,并传入分配的内存、Renderscript和其他的可选的用户定义的数据。输出内存中将会包含Renderscript的输出结果。

2.3 Activity文件的编写

public class MainActivity extends Activity {
private Bitmap mBitmapIn; //图片资源
private Bitmap mBitmapOut1; //输出图片
private Bitmap mBitmapOut2; //输出图片
private Bitmap mBitmapOut3; //输出图片
private Bitmap mBitmapOut4; //输出图片 private RenderScript mRS;
private Allocation mInAllocation;
private Allocation mOutAllocation;
private ScriptC_mono mScript; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); mBitmapIn = loadBitmap(R.drawable.ic_launcher);
mBitmapOut1 = Bitmap.createBitmap(mBitmapIn.getWidth(), mBitmapIn.getHeight(),
mBitmapIn.getConfig());//创建了视图空间 ImageView in = (ImageView) findViewById(R.id.displayin);
in.setImageBitmap(mBitmapIn); ImageView out = (ImageView) findViewById(R.id.displayout);
out.setImageBitmap(mBitmapOut1); 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);//实例化RenderScript中的函数
mScript.forEach_root(mInAllocation, mOutAllocation); //调用RenderScript中的函数
mOutAllocation.copyTo(mBitmapOut1);
}
/***********************************************************************
* 装入图片资源
* @param resource
* @return
*/
private Bitmap loadBitmap(int resource) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
return BitmapFactory.decodeResource(getResources(), resource, options);
}
}

这里我们使用createScript()函数中的:

mScript = new ScriptC_mono(mRS, getResources(), R.raw.mono);//实例化RenderScript中的函数        mScript.forEach_root(mInAllocation, mOutAllocation); //调用RenderScript中的函数

就是我们使用mono.rs文件中的root函数的实现,然后我们把他显示在图片二上。

mOutAllocation.copyTo(mBitmapOut1);

2.4 XML文件的编写以及效果

<ImageView
android:id="@+id/displayin"
android:layout_width="320dip"
android:layout_height="266dip" /> <ImageView
android:id="@+id/displayout"
android:layout_width="320dip"
android:layout_height="266dip"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true" />

这里也是参考了源码中的例子,大家可以参考参考,这里只是一个简单的实例。

第3.3.4节 创建高级图形之RenderScript(二)的更多相关文章

  1. Python3 Selenium自动化web测试 ==> 第十一节 WebDriver高级应用 -- 显示等待 + 二次封装

    学习目的: 掌握显示等待 掌握二次封装 正式步骤: step1:显示等待的代码示例 # -*- coding:utf-8 -*- from selenium import webdriver from ...

  2. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  3. 第3节 hive高级用法:16、17、18

    第3节 hive高级用法:16.hive当中常用的几种数据存储格式对比:17.存储方式与压缩格式相结合:18.总结 hive当中的数据存储格式: 行式存储:textFile sequenceFile ...

  4. Momentics创建Photon图形程序

    Photon microGui是qnx原生的UI图形工具.Qnx下开发Photon 一般是使用phAB来创建,使用默认的Momentics IDE也可以创建Photon图形程序. 首先需要创建一个c/ ...

  5. 使用CSS 3创建不规则图形 文字围绕

    前言 CSS 创建复杂图形的技术即将会被广泛支持,并且应用到实际项目中.本篇文章的目的是为大家开启它的冰山一角.我希望这篇文章能让你对不规则图形有一个初步的了解. 现在,我们已经可以使用CSS 3 常 ...

  6. 使用CSS 3创建不规则图形

    前言 CSS 创建复杂图形的技术即将会被广泛支持,并且应用到实际项目中.本篇文章的目的是为大家开启它的冰山一角.我希望这篇文章能让你对不规则图形有一个初步的了解. 现在,我们已经可以使用CSS 3 常 ...

  7. 使用面向对象技术创建高级 Web 应用程序

    作者: 出处: 使用面向对象技术创建高级 Web 应用程序 来源:开源中国社区 作者:oschina 最近,我面试了一位具有5年Web应用开发经验的软件开发人员.她有4年半的JavaScript编程经 ...

  8. Zabbix-(三)监控主机CPU、磁盘、内存并创建监控图形

    Zabbix-(三)监控主机CPU.磁盘.内存并创建监控图形 一.前言 前文中已经讲述了两种方式对Zabbix的搭建,本文将讲述如何在zaibbx上添加需要监控的主机,以及使用Zabbix自带模板和自 ...

  9. Linux创建高级用户并删除

    Linux创建高级用户并删除 常见window系统可以创建许多用户,但是linux也可以创建许多用户. 方法比window方便简单. (1)添加一个普通用户 :nangong(名字自己取) usera ...

随机推荐

  1. php设置和获取变量类型

    1. 获取变量类型 gettype($a); 2. 设置变量类型 settype($a,'int'); 3. 测试函数 is_array();是否数组 is_string();是否字符串 is_obj ...

  2. 刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)

    游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式: ...

  3. js 环形链表

     function link($no){     this.no = $no;     this.next;}function addLink($num){  var $first=$cur = {} ...

  4. C语言的本质(31)——C语言与汇编之函数调用的本质

    我们一段代码来研究函数调用的过程.首先我们写一段简单的小程序: int sum(int c, int d) { inte = c + d; returne; } int func(int a, int ...

  5. 2014.8.3情人节欢乐赛【Benny的农场】

    Benny的农场 (farm.pas/.c/.cpp) 时间限制:1s.空间限制:128MB 题目描述: Benny有一片农田需要灌溉.农田的形状为矩形,并被分为许多小块.每一块中都有一些水管.共有1 ...

  6. jQuery UI 之 EasyUI 快速入门

    jQuery EasyUI 基础 转载自(http://www.shouce.ren/api/view/a/3350) jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面 ...

  7. EasyUI DataGrid编辑单元格时使用combogrid

    仅提供一段columns配置代码供参考: conditions对象是一个已赋值的数组对象集合.下拉框数据可直接使用conditions数据,也可以通过url获取. columns : [[ { fie ...

  8. Trie树|字典树(字符串排序)

    有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n). Trie树又名字典树,从字面意思即可理解,这种树的结构像英 ...

  9. Oracle官方版Entity Framework

    千呼萬喚始出來! Oracle官方版Entity Framework問市,邁入開發新時代 自從我得了一種"不用LINQ就不會寫資料庫程式"的病,為了滿足工作上要搭配Oracle(雖 ...

  10. eclipse美化,全黑eclipse 保护眼睛

    如标题,闲话不多说.有图说明一切.看看这是你想要的嘛? 教程及资源下载地址: http://download.csdn.net/detail/shoneworn/8326097