尚学堂Androi培训GPU硬件加速控制及其在2D图形绘制上的局限.docVIP

  • 5
  • 0
  • 约3.27千字
  • 约 5页
  • 2016-08-31 发布于贵州
  • 举报

尚学堂Androi培训GPU硬件加速控制及其在2D图形绘制上的局限.doc

尚学堂Androi培训GPU硬件加速控制及其在2D图形绘制上的局限

北京尚学堂提供 图形的渲染可分为两种:软件渲染和硬件渲染。软件渲染是靠CPU计算各种坐标并绘制,主要是占用内存;硬件渲染是靠GPU,主要占用显存,一般的3D图形程序(OpenGL、DirectX)都是GPU加速的。 在Android3.0之前,2D绘图API只支持软件渲染模式,从Android3.0开始,2D绘图API开始支持GPU硬件渲染,即View中的Canvas的绘图操作会使用GPU,所以从Android 3.0(API Level 11)开始,View中就多了一些和硬件相关的方法。如果App的AndroidManifest.xml文件中定义的 targetSdkVersion大于或等于14(Android 4.0),那么Android会默认为App启用GPU渲染2D图形,我们也可以自己决定是否使用GPU,见下文。如果开启了GPU硬件加速,那么Android会用OpengGL绘图中常见的Display List技术对OpenGL ES中的绘图命令进行缓存,提高绘图效率与速度。关于Android中GPU硬件加速的Display List绘图机制会在以后专门写文章进行阐述,本文不做过多介绍。 控制是否使用GPU 我们也可以显式地启用或禁用GPU渲染,并且可以从多个Application、Activity、Window、View多个级别对其进行控制。 Application 在AndroidMenifest.xml的中添加如下的属性即可在整个App的所有Activity的View中启用GPU硬件加速渲染2D图形: application android:hardwareAccelerated=true ... Activity? 你既可以在Application级别上控制GPU是否启用,也可以在Activity级别对其就进行控制。比如你的App中有多个Activity,你想让大部分Activity启用GPU硬件加速,但有一个Activity你不想启用硬件加速,你可以通过以下的配置实现: application android:hardwareAccelerated=true activity ... / activity android:hardwareAccelerated=false / /application Window? 如果你想要更加细粒度地对GPU的使用进行控制,你可以通过代码对指定的Window启用GPU硬件加速,如下代码所示: getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 需要注意的是在运行时不能通过代码禁用掉某个Window的硬件加速。 View? 你也可以在运行时通过如下代码为某个指定的View禁用掉GPU硬件加速: if(Build.VERSION.SDK_INT = Build.VERSION_CODES.HONEYCOMB){ //View从API Level 11才加入setLayerType方法 myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } View从API Level 11才加入setLayerType方法,所以在使用前需要判断一下当前系统运行的版本。?需要注意的是,在运行时不能通过代码为某个View启用GPU硬件加速。 判断当前是否处于硬件加速中 从Android 3.0(API Level 11)开始,View和Canvas类都加入了isHardwareAccelerated()方法,可以用于判断当前View和Canvas是否处于硬件加速中。 View.isHardwareAccelerated()? 如果View的isHardwareAccelerated()方法返回true,仅仅表示该View被加入到一个处于硬件加速的Window中,其有可能仍然使用一个非硬件加速的Canvas进行实际的渲染。所以,通常来说View的isHardwareAccelerated()方法实际用处不太大。 Canvas.isHardwareAccelerated()? 我们在View的onDraw回调方法中可以得到Canvas对象,如果Canvas的isHardwareAccelerated()方法返回true,那么表示当前Canvas是用GPU硬件加速渲染的,如果返回false就表示是用软件渲染的。通常,判断当前Canvas是否处于GPU硬件加速中对于绘制自定义的View来说比较重要

文档评论(0)

1亿VIP精品文档

相关文档