资料
简介
Android3.0 (API level11)始,Android的2D显示管道设计得更支持硬加速。硬加速用GPU承担所有View之canvas上执行的绘制操作。
minSdkVersion或targetSdkVersion大等14该属性默true,否默false。
启硬加速最简单法即对整应用启硬件速。应用仅用标准View和Drawable则全局启硬加速将不带来任何负面影响。然硬加速并非被所有2D绘制支持,故启或影响自定绘制。所出问题常不可见,或异常、错误地显示像素。
为避这些问题,Android提供以下各级别启或禁硬加速:
- Application
清单文件标签添属性<application android:hardwareAccelerated="true" ...>
启整应用硬加速。 - Activity
应用在全局启硬加速时行为不正确则可对个别Activity单启硬加速。欲Actvity级别启或禁硬加速,可对<activity>
元素用android:hardwareAccelerated
属性。下例于整应用启硬加速,但对一Activity禁硬加速:<application android:hardwareAccelerated="true"> <activity android:hardwareAccelerated="false" /> </application>
- Window
需高颗粒度控制可用如下代码对一window启硬加速:
注:现在还不能对window级别禁止硬加速。getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
- View
开硬件加速
关硬件加速setLayerType(View.LAYER_TYPE_HARDWARE, mPaint)
注:View层有除禁硬加速外其它功能。setLayerType(View.LAYER_TYPE_SOFTWARE, mPaint)
判View必硬加速否
了解一应用启硬件速否对自定View等尤其重要,应用做一些不被最新管线所支持自定绘制显更重要。两法检应用硬加速否:
View.isHardwareAccelerated()
仅受Application、Activity影响。Activity本身不支持硬件加速返false,否true。Canvas.isHardwareAccelerated()
受Application、Activity影响。设setLayerType时被setLayerType直接影响。没设setLayerType,Activity支持硬加速返ture,否false。设setLayerType时返值受setLayerType参数影响。
注意
需绘制代码中做这个,应使用Canvas.isHardwareAccelerated()
而非View.isHardwareAccelerated()
。因当一View附加到一硬加速window时,仍可用非硬加速Canvas绘制操作。如当为高速缓存而把一View画到一Bitmap中。
问题
日志
java.lang.OutOfMemoryError: Failed to allocate a 157286412 byte allocation with 16777216 free bytes and 111MB until OOM
分析
内存溢出
方案
清单文件application标签如下配
android:hardwareAccelerated="false",
android:largeHeap="true"