2015-04-22 16 views
9

Để cải thiện hiệu suất ứng dụng, tôi gặp phải vấn đề về Thu hồi GPU. Theo Romain Guy's Điều, đây là những màu sắc cơ bản:Android: Vẽ nền không có GPU OverDraw như Whatsapp


  • Không màu nghĩa là không có mức vẽ quá. Pixel chỉ được vẽ một lần. Trong ví dụ này, bạn có thể thấy rằng nền là nguyên vẹn.

  • Màu xanh biểu thị quá mức 1x. Pixel được vẽ hai lần. Các khu vực màu xanh dương lớn có thể chấp nhận được (nếu toàn bộ cửa sổ có màu xanh dương, bạn có thể loại bỏ một lớp.)

  • Màu xanh lá cây chỉ ra mức thấu chi gấp đôi. Pixel được vẽ ba lần. Các khu vực màu xanh lá cây có kích thước trung bình là chấp nhận được nhưng bạn nên cố gắng tối ưu hóa chúng đi.
  • Màu đỏ nhạt cho biết số tiền vượt quá 3x. Pixel được sơn bốn lần. Các khu vực nhỏ màu đỏ nhạt có thể chấp nhận được.
  • Màu đỏ sẫm biểu thị quá mức thu nhỏ từ 4x trở lên. Pixel được sơn 5 lần hoặc hơn. Cái này sai. Fix it.`

Để thử nghiệm đó, tôi tạo một dự án đơn giản với XML như sau

XML Mã

<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> 

và nhận được kết quả:
n00b Me

Sau đó, tôi đã thử dùng quá liều của Whatsapp w. Để ngạc nhiên của tôi:
Awesome Whatsapp

Vì vậy, như thế nào Whatsapp được vẽ hình nền với không vẽ quá (không màu xanh) nhưng trong của tôi đơn giản xml, thậm chí màu cho một mức vẽ quá??

PS: Tôi đã cố ý thêm màu nền để chứng minh rằng thêm màu sắc cho viết chi phiếu quá nhưng thêm hình nền không làm

Trả lời

24

Mỗi hoạt động có nền mặc định Có thể đến từ thuộc tính android:windowBackground của Chủ đề.

WhatsApp đang sử dụng hình nền có thể được lặp lại theo cả hai hướng để lấp đầy toàn bộ màn hình. Bằng cách này, họ không cần phải gặp rắc rối xung quanh với các hình ảnh khác nhau cho các kích thước màn hình khác nhau - đó là siêu đáp ứng!

Vì vậy, giả sử bạn có một hình ảnh lát gạch như vậy (ví dụ drawable-nodpi/background_tile.png)

Chỉ cần tạo một drawable xml mới (ví dụ drawable/background.xml) mà trông như thế này:

<?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" /> 

Bây giờ chỉ cần đặt drawable này như một nền tảng cho hoạt động của bạn của Theme:

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

bạn cũng có thể thiết lập các drawable nền của một Hoạt động khi chạy với getWindow().setBackgroundDrawable hoặc getWindow().setBackgroundDrawableResource

Bạn cũng có thể thiết lập các drawable nền để null, ví dụ nếu Hoạt động toàn bộ cho thấy một MapView hoặc một cái gì đó tương tự.

Cũng lưu ý rằng Zygote sẽ sử dụng nền của Chủ đề Có thể vẽ trong giai đoạn khởi động ứng dụng nếu Hoạt động là hoạt động trình khởi chạy chính của bạn.

1

Tôi nghĩ rằng một trong những chi phiếu quá số bạn có là nền tảng của RelativeLayout của bạn. Bạn có thể xóa rằng android:background="#fff" nền sẽ được vẽ một lần tùy thuộc vào chủ đề ứng dụng.

+0

Tôi đã cố ý thêm màu nền để cho thấy rằng việc thêm màu cho phép rút tiền nhưng thêm hình nền không – Aexyn

+0

chỉ là một suy đoán hoang dã của tôi có thể làm nền hoạt động minh bạch trong chủ đề. –

2

Áp dụng gợi ý Bill Gates, hóa ra thiết lập nền trong styles.xml trong ứng dụng thực sự tiết kiệm được một lần rút tiền.Mã này tiết kiệm một Vẽ quá mức

<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> 

Bây giờ Thêm nền không mất bất kỳ Vẽ quá mức nên Relative Layout là Tuy Một Vẽ quá mức

BackGround with no OverDraw

CẬP NHẬT Phương pháp trên hoạt động, và là tốt nếu bạn muốn cùng một nền màu cho tất cả ứng dụng của bạn. Nhưng trong trường hợp bạn muốn màu sắc khác nhau và vẫn muốn lưu Vẽ quá mức, thay thế ở trên phù hợp với

One Step Further
Boom .. Bạn đang tốt để đi ..

TIP: Nếu ứng dụng của bạn có màu đen làm nền .. đi cho nó tiết kiệm thêm một khoản thấu chi;)

+2

Tôi sẽ không khuyên bạn nên đặt windowBackground thành @null nếu chế độ xem gốc của bố cục không có nền chắc chắn vì nó không đặt nền của Hoạt động thành màu đen. Thay vào đó, nó sẽ là "không có gì" sau đó, có thể gây ra rất nhiều hiện vật kỳ lạ ngay sau khi bạn tạo hiệu ứng động hoặc di chuyển xung quanh Chế độ xem. – astuetz

+0

"Thay vào đó, hãy đặt nó thành màu/hình ảnh bạn muốn hoặc loại bỏ từ onCreate() bằng cách gọi getWindow(). SetBackgroundDrawable (null)", không phải trong chủ đề cho hoạt động gốc – superuser

+0

Giải pháp tuyệt vời @Aexyn cảm ơn rất nhiều. .. – Kushal

Các vấn đề liên quan