Android:绘制背景,没有像Whatsapp那样的GPU OverDraw

Aex*_*xyn 11 performance android gpu android-layout

为了提高应用程序性能,我遇到了GPU Overdraw问题.根据Romain Guy的文章,这里是基本的颜色:


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

  • 蓝色表示透支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>
Run Code Online (Sandbox Code Playgroud)

得到结果:
我的

然后我尝试了Whatsapp的透支.令我惊讶的是:
真棒Whatsapp

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

PS:我有意添加了背景颜色,表明添加颜色会过度绘制但添加壁纸则不会

ast*_*etz 27

每个Activity都有一个默认背景Drawable来自Theme的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" />
Run Code Online (Sandbox Code Playgroud)

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

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="android:windowBackground">@drawable/background</item>
</style>
Run Code Online (Sandbox Code Playgroud)

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

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

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