2017-05-29 43 views
9

Tôi có một ứng dụng được liệt kê dưới 25% dưới cùng trong Google Play Console mới - phần vitals Android để hiển thị chậm. Tôi lo ngại về điều này vì such articles dường như nói rằng Google Play có thể phạt ứng dụng của bạn trong thứ hạng Cửa hàng Play nếu bạn rơi vào 25% dưới cùng.Cách khắc phục sự cố hiển thị chậm (Android vitals)

Tuy nhiên, có vẻ như không thể cải thiện chỉ số này cho ứng dụng của tôi. Nó chơi nhạc và có một SeekBar và TextView được cập nhật mỗi 250ms như bất kỳ máy nghe nhạc nào. Tôi đã thực hiện chương trình cơ bản tối thiểu để chứng minh:

public class MainActivity extends AppCompatActivity { 

    int count; 
    SeekBar seekBar; 
    TextView textView; 

    Runnable runnable = 
      new Runnable() { 
       @Override 
       public void run() { 
        textView.setText(Integer.toString(count)); 
        seekBar.setProgress(count); 
        ++count; 
        seekBar.postDelayed(runnable, 250); 
       } 
      }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     seekBar = (SeekBar) findViewById(R.id.seek); 
     textView = (TextView) findViewById(R.id.text); 
     seekBar.post(runnable); 
    } 
} 

Full dự án ở đây: https://github.com/svenoaks/SlowRendering.git

Khi tôi chạy chương trình này trên phần cứng tương tự như các thiết bị Nexus, tôi nhận được những kết quả này cho một lệnh
adb shell dumpsys gfxinfo com.example.xyz.slowrendering:

Stats since: 19222191084749ns 
Total frames rendered: 308 
Janky frames: 290 (94.16%) 
90th percentile: 32ms 
95th percentile: 36ms 
99th percentile: 44ms 
Number Missed Vsync: 2 
Number High input latency: 0 
Number Slow UI thread: 139 
Number Slow bitmap uploads: 0 
Number Slow issue draw commands: 283 

Điều này có nghĩa là hầu như tất cả các khung hình của tôi chụp> 16ms để hiển thị, tôi đoán là do bản chất định kỳ của quá trình cập nhật. Tất cả các ứng dụng trình phát nhạc khác mà tôi đã thử nghiệm cũng có vấn đề về Làm chậm này theo như tôi thấy. Tôi sợ thuật toán của Google phá hỏng thứ hạng ứng dụng của tôi, có cách nào để tôi có thể cải thiện điểm số của mình không?

Trả lời

9

TextView trong bố cục của bạn đang gây ra sự cố. Vì nó có layout width của wrap_content, cho biết chiều rộng của nó phải bằng với chiều rộng của nội dung (văn bản trong ví dụ này). Do đó, mỗi khi bạn gọi TextView.setText, một biện pháp vượt qua/vượt qua bố cục đắt tiền phải xảy ra. Thiết lập đơn giản layout_width thành match_parent sẽ giải quyết vấn đề.

enter image description here

enter image description here

Dưới đây là hai hình ảnh những gì được lấy từ systrace, nó chứng minh thời gian làm việc trên thread UI trong 1 khung. Phần trên cùng được thực hiện với layout_width=wrap_content và phần dưới cùng là layout_width=match_parent.

Hai phương pháp sau đây mà tôi đã thử nghiệm sẽ cải thiện tốc độ khung hình:

  • Nếu bạn đăng Runnable trong khoảng thời gian ngắn như 16ms (seekBar.postDelayed(runnable, 16)), bạn sẽ có được 60fps mịn này: enter image description here

    P/s: Tôi không chắc chắn tại sao.

  • Sử dụng một số cách khác để cập nhật giá trị count thay vì bên trong Runnable. Sử dụng View.postOnAnimation(Runnable) để lên lịch lại cho Runnable. Kết quả là 60FPS cho dự án mẫu.

EDIT: hai Runnable sử dụng postOnAnimation(Runnable)

Runnable runnable = 
    new Runnable() { 
    @Override 
    public void run() { 
     textView.setText(Integer.toString(count)); 
     seekBar.setProgress(count); 
     seekBar.postOnAnimation(this); 
    } 
    }; 



Runnable updateCount = new Runnable() { 
    @Override public void run() { 
     ++count; 
     seekBar.postDelayed(this, 250); 
    } 
    }; 
+0

Tôi đặt layout_width thành match_parent và vẫn là khung hình janky, trên cả Moto X Pure và Galaxy S8 +. Mặc dù với X Pure, danh mục 'Chủ đề giao diện người dùng chậm' có vài khung hình và khung hình phần trăm thứ 90 đến 99 chỉ được giảm xuống còn hơn 20 mili giây. –

+0

Bạn đang nói về dự án mẫu hay ứng dụng sản xuất của mình? –

+0

Các khung Janky trong dự án mẫu ngay cả với match_parent –

2

Tôi đã kiểm tra mã của bạn. Không chắc chắn nếu đây là mã thực tế hoặc nếu bạn có nhiều hơn để điều này. Trong mọi trường hợp, tôi sẽ thu hút sự chú ý đến một số vấn đề Rendering trong android.

1. Vẽ quá mức

Vẽ quá mức là nơi bạn lãng phí thời gian xử lý GPU bằng cách tô bằng pixel mà chỉ nhận được màu trong một lần nữa bằng cái gì khác. Đây có thể là phổ biến nếu bạn đã thêm nền vào bố cục vùng chứa bố mẹ và sau đó trẻ cũng được thêm nền hoặc nếu bạn đã thêm nền chung vào tệp phong cách cho chủ đề ứng dụng và sau đó thêm hình nền vào phần còn lại của xml tệp bố cục bạn đã tạo.

Nguyên nhân cho việc rút tiền có thể là bất cứ điều gì, hãy thử kiểm tra mã của bạn để biết điều này. Có một công cụ phát triển được cài đặt trong tất cả các thiết bị di động để kiểm tra Overdraw trong các tùy chọn của nhà phát triển. Here là tài liệu chính thức cho việc rút tiền.

2. Xem hệ thống phân cấp

Để render từng xem, Android trải qua ba giai đoạn:

1.measure

2.layout

3.draw

Thời gian để Android hoàn thành các giai đoạn này tỷ lệ thuận với số lượt xem trong hệ thống phân cấp của bạn. Tôi thấy trong tệp bố cục của bạn mà bạn có bố cục ràng buộc bao gồm bố cục tuyến tính. Tôi không thấy việc sử dụng cái này. Chế độ hạn chế đã được giới thiệu để giúp các nhà phát triển giảm phân cấp chế độ xem. Giảm số lượng childs một layout cụ thể có thể có. Ngoài ra còn có một công cụ để giúp bạn với điều này. Here là hướng dẫn chính thức dành cho Android. Hãy thử các bước sau để tìm ra sự cố hiển thị GPU.

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