45

我正在开发一个应用程序,它的功能与 Facebook Android 原生应用程序非常相似:社交网络,用户大部分时间都会花在无休止地ListView显示大量图像、进入图像库等等。

假设我正在做所有正确的事情和最佳 android 实践以实现平滑滚动(按应有的方式回收视图,在需要时使用不同的视图类型,仅将所需大小的缩放位图加载到内存中,缓存位图,使用 ViewHolder 设计模式,尽可能不阻塞 UI 线程等等......)

还可以说,我的应用程序中的所有其他内容都以最佳方式编写并遵循最佳实践(用于讨论... :->)

我的应用程序在那个阶段运行得还不错,但是当打开硬件加速时,正如Android 开发者文档中描述和承诺的那样, 它使我的应用程序更加流畅和快速。

假设它不会像可能发生的那样对 UI 产生任何负面影响,而且我没有执行任何不受支持的操作

根据谷歌关于该主题的文档,我认为不使用此功能的唯一原因(除了我上面已经提到的所有其他原因)是它可能导致我的应用程序使用更多 RAM。但是有多少内存?多很多?我知道,当我的应用程序消耗大量 RAM 时 - 当它需要释放一些内存时,它会成为被操作系统销毁的好选择。

我的问题基本上是-

  • 在我的情况下使用此功能是否“可以”?
  • 使用它还会引发什么其他问题?

TIA

4

2 回答 2

40

使用或不使用

仅当您对图像的缩放、旋转和平移有复杂的自定义计算时才建议使用硬件加速,但不要将其用于绘制直线或曲线(以及其他琐碎的操作)(来源)。

如果您计划进行通用转换,并且考虑到您已经考虑过缩放、回收、缓存等,那么再给您的项目增加负担可能没有意义。此外,任何重新编写代码以支持硬件加速的努力都不会影响 3.0 以下版本的用户,截至 2013 年 5 月 8 日,该版本约占市场的 36%。

记忆

关于内存使用(根据这篇文章),通过包含 Android 硬件,应用程序会为每个进程加载 OpenGL 驱动程序,占用大约 2MB 的内存使用,并将其提升到 8MB。

其他问题

除了 API 版本,我认为它也会影响电池寿命。不幸的是,在线上没有针对不同用例的任何基准测试,以便在此基础上划清界限。一些人认为,在特定情况下,由于有多个 gpu 内核,使用加速可以节省电池寿命。总的来说,我认为效果不会太显着(否则谷歌会将此作为重点)是安全的。

于 2013-05-08T05:01:09.373 回答
13

更新

如果您的 Target API 级别 >=14,则默认启用硬件加速


在您的情况下,我会说是的,请使用硬件加速。

看到您没有在应用程序中使用任何资源密集型控件,启用硬件加速应该不是问题。正如您所说,您的应用在没有硬件加速的情况下运行良好。

当您启用硬件加速时,Android 将开始使用您的 GPU,并且由于启用硬件加速所需的资源增加,您的应用程序将消耗更多 RAM。


一个常见的问题是ram 的数量会增加很多吗?

答案将由以下因素决定:

1 . 你的编程能力,即。回收清单的管理,图像的缩放等。

2 . 装置

前段时间我写了一个应用程序,用于编辑非常高分辨率的位图。我遇到了同样的问题。我发现在不同的设备上,启用硬件加速时操作系统分配的最大内存量因设备而异。如果你的设备有更多的内存,操作系统会为你的应用分配更多的内存,所以你永远不会发现你的应用使用的内存数量是一致的。更大更昂贵的设备将始终在更大数量的内存上运行您的应用程序。


使用硬件加速还会引发哪些其他问题?

硬件加速可能会导致某些 2D 绘图操作出现问题。如果您遇到这种情况,您可以仅为应用程序中的特定活动启用硬件加速,如android 开发人员文档中的硬件加速帖子中所述

启用硬件加速的最简单方法是为您的整个应用程序全局启用它。如果您的应用程序仅使用标准视图和 Drawable,则全局启用它不会导致任何不利的绘图效果。但是,由于并非所有 2D 绘图操作都支持硬件加速,因此打开它可能会影响某些使用自定义视图或绘图调用的应用程序。问题通常表现为不可见的元素、异常或错误渲染的像素。为了解决这个问题,Android 为您提供了在以下级别启用或禁用硬件加速的选项: 应用程序、活动、窗口、视图

通过这种方式,您还可以限制应用程序中的硬件加速,但从它的声音来看,您的大多数应用程序功能都需要它。

希望这可以帮助

于 2013-05-08T05:11:08.607 回答