Giảm tình trạng vẽ nhiều lần

Trang này giải thích khái niệm vẽ nhiều lần, cách chẩn đoán vấn đề cũng như cách loại bỏ hoặc giảm thiểu tình trạng này.

Khi một ứng dụng vẽ cùng một pixel nhiều lần trong một khung, thao tác này được gọi là vẽ nhiều lần. Tình trạng vẽ nhiều lần thường không cần thiết và tốt nhất là bạn nên loại bỏ tình trạng này. Tình trạng vẽ nhiều lần sẽ trở thành vấn đề về hiệu suất vì làm lãng phí thời gian của bộ xử lý đồ hoạ (GPU) khi hiển thị các pixel không đóng góp vào hình ảnh mà người dùng nhìn thấy trên màn hình.

Giới thiệu về việc vẽ nhiều lần

Khái niệm vẽ nhiều lần đề cập đến việc hệ thống vẽ một pixel trên màn hình nhiều lần trong một khung kết xuất duy nhất. Chẳng hạn như nếu chúng ta có một loạt các thẻ Giao diện người dùng xếp chồng lên nhau, mỗi thẻ sẽ ẩn một phần của thẻ bên dưới.

Tuy nhiên, hệ thống vẫn cần phải vẽ ngay cả những phần ẩn của thẻ trong ngăn xếp. Điều này là do các thẻ xếp chồng được hiển thị theo thuật toán của Painter, nghĩa là vẽ các đối tượng theo thứ tự từ sau ra trước. Trình tự hiển thị này cho phép hệ thống áp dụng đúng cách phối màu alpha cho các đối tượng trong suốt, chẳng hạn như đổ bóng.

Tìm sự cố vẽ nhiều lần

Nền tảng này cung cấp các công cụ sau để giúp bạn xác định xem việc vẽ nhiều lần có ảnh hưởng đến hiệu suất của ứng dụng hay không.

Công cụ gỡ lỗi GPU vẽ nhiều lần

Công cụ Gỡ lỗi GPU vẽ nhiều lần sử dụng phương pháp mã hoá màu để cho biết số lần ứng dụng của bạn vẽ từng pixel trên màn hình. Chỉ số này càng cao thì càng nhiều khả năng tình trạng vẽ nhiều lần sẽ ảnh hưởng đến hiệu suất của ứng dụng.

Để biết thêm thông tin, hãy xem bài viết Trực quan hoá tình trạng GPU vẽ nhiều lần.

Công cụ kết xuất GPU cấu hình

Công cụ phân tích trực quan kết xuất GPU hiển thị thời gian mà mỗi giai đoạn của quy trình kết xuất cần để hiển thị một khung duy nhất dưới dạng biểu đồ cuộn. Phần Process (Tiến trình) của mỗi thanh, biểu thị bằng màu cam, cho biết thời điểm hệ thống đang hoán đổi các vùng đệm. Chỉ số này cung cấp các gợi ý quan trọng về việc vẽ nhiều lần.

Trên các GPU kém hiệu quả hơn, tỷ lệ lấp đầy có sẵn (tốc độ mà GPU có thể lấp đầy vùng đệm khung) có thể thấp. Khi số pixel cần thiết để vẽ một khung tăng lên, GPU có thể mất nhiều thời gian hơn để xử lý các lệnh mới và yêu cầu phần còn lại của hệ thống đợi cho đến khi có thể bắt kịp. Thanh Process (Tiến trình) cho thấy mốc tăng đột biến này xảy ra khi GPU bị quá tải trong lúc cố gắng vẽ các pixel nhanh nhất có thể. Các vấn đề khác ngoài cơ số các pixel thô cũng có thể khiến chỉ số này tăng đột biến. Ví dụ: nếu công cụ Gỡ lỗi GPU vẽ nhiều lần cho thấy có tình trạng vẽ nhiều lần ở mức độ thường xuyên và mốc tăng đột biến trong Process (Tiến trình), thì có thể đã xảy ra sự cố với việc vẽ nhiều lần.

Để biết thêm thông tin, hãy xem bài viết Phân tích trực quan tốc độ kết xuất GPU.

Khắc phục vấn đề vẽ nhiều lần

Bạn có thể làm như sau để giảm bớt hoặc loại bỏ tình trạng vẽ nhiều lần:

  • Xoá nền không cần thiết trong bố cục.
  • Làm phẳng hệ phân cấp khung hiển thị.
  • Giảm độ trong suốt.

Phần này cung cấp thông tin về từng phương pháp tiếp cận này.

Xoá nền không cần thiết trong bố cục

Theo mặc định, một bố cục không có nền được định nghĩa là không kết xuất trực tiếp bất kỳ giá trị nào. Tuy nhiên, khi có nền, các bố cục có thể góp phần gây ra tình trạng vẽ nhiều lần.

Bạn có thể cải thiện hiệu suất kết xuất bằng cách xoá nền không cần thiết. Nền không cần thiết có thể không hiển thị vì bị che phủ hoàn toàn bởi mọi thứ mà ứng dụng đang vẽ trên đó. Ví dụ: hệ thống có thể che phủ hoàn toàn nền của một thành phần cha mẹ khi vẽ các khung hiển thị con trên đó.

Để tìm hiểu lý do tại sao bạn gặp phải tình trạng vẽ nhiều lần, hãy xem hệ phân cấp trong công cụ Layout Inspector. Bạn có thể tìm nền mà người dùng không nhìn thấy để loại bỏ chúng. Bạn có thể loại bỏ các nền không cần thiết ở bất cứ nơi nào có nhiều vùng chứa có chung một màu nền. Bạn có thể đặt nền cửa sổ thành màu nền chính của ứng dụng và không xác định giá trị nền nào cho tất cả vùng chứa phía trên nó.

Làm phẳng hệ phân cấp khung hiển thị

Bố cục hiện đại giúp bạn xếp chồng và xếp lớp các khung hiển thị để tạo ra thiết kế đẹp mắt. Tuy nhiên, việc này có thể làm giảm hiệu suất do hậu quả của tình trạng vẽ nhiều lần, đặc biệt trong các tình huống mà mỗi đối tượng khung hiển thị xếp chồng đều bị mờ, đòi hỏi phải vẽ cả pixel đã nhìn thấy và pixel không nhìn thấy lên màn hình.

Nếu gặp vấn đề này, bạn có thể cải thiện hiệu suất bằng cách tối ưu hoá hệ phân cấp khung hiển thị để giảm số lượng đối tượng trùng lặp trên giao diện người dùng. Để biết thêm thông tin về cách thực hiện việc này, vui lòng xem bài viết Hiệu suất và hệ phân cấp khung hiển thị.

Giảm độ trong suốt

Hiển thị các pixel trong suốt trên màn hình (còn được gọi là kết xuất alpha) là yếu tố quan trọng nhất góp phần dẫn đến tình trạng vẽ nhiều lần. Không giống như kiểu vẽ nhiều lần tiêu chuẩn (hệ thống ẩn hoàn toàn pixel đã vẽ có sẵn bằng cách vẽ các pixel mờ lên trên chúng), các đối tượng trong suốt yêu cầu phải vẽ pixel hiện có trước tiên để phương trình kết hợp phù hợp có thể xảy ra.

Các hiệu ứng hình ảnh như hoạt ảnh trong suốt, hiệu ứng mờ dần và bóng đổ đều đòi hỏi phải có độ trong suốt nhất định và do đó, có thể góp phần đáng kể vào tình trạng vẽ nhiều lần. Bạn có thể cải thiện tình trạng vẽ nhiều lần trong các trường hợp này bằng cách giảm số lượng đối tượng trong suốt mà bạn hiển thị. Ví dụ như bạn có thể nhận được văn bản màu xám bằng cách vẽ văn bản màu đen trong TextView với một giá trị alpha trong suốt. Tuy nhiên, bạn vẫn có được hiệu ứng tương tự với hiệu suất tốt hơn bằng cách vẽ văn bản màu xám.

Để tìm hiểu thêm về chi phí hiệu suất cần bỏ ra cho độ trong suốt trong toàn bộ quy trình vẽ, vui lòng xem video Chi phí ẩn của đối tượng trong suốt.