【问题标题】:Android: odd issue involving hardware acceleration?Android:涉及硬件加速的奇怪问题?
【发布时间】:2012-03-25 06:32:49
【问题描述】:

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

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

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

所以,我认为 View 的 LayerType 中有一些东西在帮助我绘图,而当我调用 View.setLayerType(...) 时,它就丢失了。在我致电 View.setLayerType(...) 之前,View.getLayerType() 的计算结果为 LAYER_TYPE_NONE。

关于如何显式阻止硬件加速同时保留帮助我的触摸输入的任何建议?

【问题讨论】:

  • 我没有这样的建议,但你可能会report this as a bug,记录的避免硬件加速的方法有这个副作用。

标签: android


【解决方案1】:

通过将图层类型设置为软件,您可以强制系统基本上将您的视图绘制为位图。从而在绘图时引起一些额外的开销。这可能是性能不佳的原因。 我假设您的崩溃是由于使用了您正在执行的一些画布 api 调用,这些调用不受硬件加速的支持。目前不支持以下调用:

  • 剪辑路径
  • 剪辑区域
  • 画图
  • 绘制点
  • drawPosText
  • drawTextOnPath
  • 绘制顶点

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

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

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

    getWindow().setFormat(PixelFormat.RGB_565);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多