为了提高应用性能,我遇到了GPU Overdraw问题。根据{{3}}文章,以下是基本颜色:
没有颜色表示没有透支。像素只涂了一次。在此示例中,您可以看到背景完好无损。
蓝色表示过度抽取1倍。像素被涂了两次。大蓝色区域是可以接受的(如果整个窗口是蓝色的,你可以摆脱一层。)
为了测试,我使用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>
得到结果:
然后我尝试了Whatsapp的透支。令我惊讶的是:
那么 Whatsapp 如何用没有透支(没有蓝色色调)绘制背景壁纸,但在我的简单xml 中,甚至着色提供一次透支??
PS:我故意添加背景颜色以显示添加颜色会过度绘制但添加壁纸不会
答案 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>
仍然一次覆盖
<强>更新强> 如果你想要所有应用程序的相同的颜色背景,则上述方法可以正常工作。 但是如果您想要不同的颜色并且仍想保存OverDraw,请将上面的行替换为
Relative Layout
热潮......你很高兴..
提示:如果你的应用有黑色作为背景..去另外一次透支;)
答案 2 :(得分:1)
我认为你透支的是你RelativeLayout
的背景。您可以删除android:background="#fff"
根据应用主题绘制背景。