【问题标题】:Why does the documentation recommend that you reduce overdraw on Android devices?为什么文档建议您减少 Android 设备上的透支?
【发布时间】:2017-01-19 13:55:30
【问题描述】:

建议 Android 开发者减少其应用中的过度绘制。

https://developer.android.com/topic/performance/rendering/overdraw.html

iOS 开发人员被警告过过度绘制,但并未强调。相反,他们可以选择为混合图层着色。

https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/MeasuringGraphicsPerformance.html

据我了解,iOS CoreGraphics 将图层放入 GPU,GPU 在渲染时将它们组合起来。当像素未混合(alpha 通道)时,计算要显示的像素会更容易。

导致 Android 专注于过度绘制的技术差异是什么?能否提供技术参考?

【问题讨论】:

标签: android ios performance


【解决方案1】:

我想这主要是由于Painter's AlgorithmZ-Buffering 之间的差异。

使用前者,您可以根据布局从后到前绘制每个视图,并根据需要过度绘制像素。这可能会导致相当多的浪费,因为无论是否被遮挡,都需要渲染像素。

Z-Buffering 可以通过使用 Z-Culling 来改善这一点,如果您的图层正确排序,可以提前消除一些像素。

最初,Android 使用完全基于软件的渲染堆栈,因此 Z-Buffering 不可用,据我所知,使用了简单的 Painter 算法。 iOS 始终基于硬件加速渲染,因此可以利用(部分)Z-Buffering。但从 Android 3.0 开始,Android 也开始实现基于硬件的渲染。

但在实践中事​​情并不是那么简单。一方面,使用硬件层和进行深度排序也会产生一些成本,如果像移动应用程序那样处理非常简单的绘图操作(比如简单地绘制位图,而不是使用 3D 图形进行的复杂的基于像素的闪电操作),过度绘制像素实际上可能比试图避免它便宜。在处理透明胶片时,事情显然也会变得更加复杂。

我假设 Android 和 iOS 都使用多种技术组合,因此 Overdraw 很可能会在两个平台上发生。在任何情况下,通过避免不必要的重叠来完全避免问题是一个好主意。

【讨论】:

  • “我假设 Android 和 iOS 都使用多种技术,因此 Overdraw 很可能会在两个平台上发生。”得到一个比这更具体的答案会很好,但这可能会很困难,因为软件/硬件实现可能会随着新版本而改变。
【解决方案2】:

iOS 开发者确实被告知要避免过度绘制:

当您的应用或其内容不可见时消除绘图;例如,当您的应用在后台时,或者当其内容被其他视图遮挡、剪辑或离屏时。

来自您提到的链接。

【讨论】:

  • 但是侧重点还是不一样的。据我了解,CoreGraphics 在定义图层后非常有效地组合图层,而 Android 文档 似乎 对逐像素绘图效率更感兴趣。我希望能获得更多关于导致这种情况的底层差异的详细信息。
  • 似乎苹果正在实施他们自己的“解决方案”来解决这个问题,而在 android 中他们什么都不做,让你控制如何克服这个问题。您是否正在寻找有关 CoreGraphics 操作的详细信息?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 2020-03-03
  • 1970-01-01
  • 2014-07-03
  • 2016-04-09
  • 1970-01-01
相关资源
最近更新 更多