Android:奇怪的问题涉及硬件加速?

时间:2012-03-01 20:45:00

标签: android

我的应用程序允许用户通过捕获和处理触摸事件在屏幕上绘图。此外,我的应用程序使用Canvas.drawPicture和硬件加速不支持的一些其他方法。

在某些ICS设备上,可以选择在设置中强制硬件加速:“强制gpu渲染,在applciations中使用2d harware加速”。启用此选项后,我的应用程序崩溃并显示错误:android.view.GLES20Canvas.drawPicture(GLES20Canvas.java:895)。因此,我明确禁用使用此方法的View上的硬件加速:View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

但是,以这种方式禁用硬件加速会影响绘图的性能,绘图会变得“波动”,就像生成较少的MotionEvent.ACTION_MOVE一样。这种情况发生在所有3.0+设备上,无论“强制加速”设置是否打开。

所以,我认为View的LayerType中有一些东西正在协助我的绘图,而当我调用View.setLayerType(...)时,这会丢失。在我调用View.setLayerType(...)之前,View.getLayerType()的计算结果为LAYER_TYPE_NONE。

有关如何明确阻止硬件加速同时保留有助于我的触摸输入的任何建议吗?

1 个答案:

答案 0 :(得分:0)

通过将图层类型设置为软件,可以强制系统基本将视图绘制到位图中。因此在绘制时会产生一些额外的开销。这可能是表现不佳的原因。 我假设您的崩溃是由于您正在使用的一些画布api调用,硬件加速不支持。目前不支持以下呼叫:

  • clipPath
  • clipRegion
  • drawPicture
  • drawPoints
  • drawPosText
  • drawTextOnPath
  • drawVertices

另请注意,当硬件加速处于活动状态时,您绘制的任何线条都会看起来呈锯齿状,因为不支持抗锯齿。

因此,您可以尝试删除任何不受支持的调用并使用硬件加速或尝试进一步优化您的软件渲染:

  • 在绘制调用期间不创建路径或位图等对象
  • 将图片缓存到位图
  • 将窗口的像素格式设置为RGB565(仅当您不需要alpha时)

    getWindow()setFormat(PixelFormat.RGB_565);