Android:绘制背景,没有GPU OverDraw,如Whatsapp

时间:2015-04-22 12:45:53

标签: android performance android-layout gpu

为了提高应用性能,我遇到了GPU Overdraw问题。根据{{​​3}}文章,以下是基本颜色:

  • 没有颜色表示没有透支。像素只涂了一次。在此示例中,您可以看到背景完好无损。

  • 蓝色表示过度抽取1倍。像素被涂了两次。大蓝色区域是可以接受的(如果整个窗口是蓝色的,你可以摆脱一层。)

  • 绿色表示2倍的透支。像素被涂了三次。中等大小的绿色区域是可以接受的,但您应该尝试优化它们。
  • 浅红色表示3倍的透支。像素被涂了四次。小红灯区域是可以接受的。
  • 深红色表示4倍或更多的透支。像素被涂了5次或更多次。这是错的。修复它。

为了测试,我使用XML创建一个简单的项目,如下所示

XML代码

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity"

    android:layout_margin="50dp"
    android:background="#fff">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"/>

</RelativeLayout>

得到结果:
n00b Me

然后我尝试了Whatsapp的透支。令我惊讶的是:
Awesome Whatsapp

那么 Whatsapp 如何用没有透支(没有蓝色色调)绘制背景壁纸,但在我的简单xml 中,甚至着色提供一次透支?

PS:我故意添加背景颜色以显示添加颜色会过度绘制但添加壁纸不会

3 个答案:

答案 0 :(得分:27)

每个活动都有一个默认背景Drawable来自主题的android:windowBackground属性。

WhatsApp正在使用可以在两个方向上重复的背景图像,以便填满整个屏幕。通过这种方式,他们不需要针对不同的屏幕尺寸使用不同的图像进行麻烦 - 它具有超强的响应能力!

所以,让我们说你有这样的平铺图像(例如drawable-nodpi / background_tile.png)

只需创建一个新的xml Drawable(例如drawable / background.xml),如下所示:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/background_tile"
    android:tileMode="repeat" />

现在只需将此Drawable设置为Activity的主题背景:

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="android:windowBackground">@drawable/background</item>
</style>

您还可以在运行时设置Activity的背景Drawable getWindow().setBackgroundDrawable  或getWindow().setBackgroundDrawableResource

您还可以将背景Drawable设置为null,例如,如果整个Activity显示MapView或类似的东西。

另请注意,如果活动是您的主要启动器活动,Zygote将在应用启动阶段使用主题背景Drawable。

答案 1 :(得分:3)

应用Bill Gates的提示,结果是在应用中 styles.xml 中的设置背景实际上保存了一次透支。此代码保存了一个overDraw

1. In the Delphi IDE, open the Deployment Manager (Project -> Deployment), and locate the following entry:
  Local Name: libnative-activity.so 
  Remote Path: library\lib\armeabi\ 
2. Uncheck the entry to prevent deployment of this file.

现在添加背景不需要任何覆盖,因此<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="android:windowBackground">@color/highlighted_text_material_dark</item> </style> </resources> 仍然一次覆盖

BackGround with no OverDraw

<强>更新 如果你想要所有应用程序的相同的颜色背景,则上述方法可以正常工作。 但是如果您想要不同的颜色并且仍想保存OverDraw,请将上面的行替换为

Relative Layout

One Step Further
热潮......你很高兴..

提示:如果你的应用有黑色作为背景..去另外一次透支;)

答案 2 :(得分:1)

我认为你透支的是你RelativeLayout的背景。您可以删除android:background="#fff"根据应用主题绘制背景。