VSync

Tín hiệu VSync đồng bộ hoá quy trình hiển thị. Quy trình hiển thị bao gồm quá trình kết xuất ứng dụng, thành phần SurfaceFlinger và Hardware Composer (HWC) trình bày hình ảnh trên màn hình. VSync đồng bộ hoá thời gian ứng dụng thức dậy để bắt đầu kết xuất, thời gian SurfaceFlinger thức dậy để kết hợp màn hình và chu kỳ làm mới màn hình. Quá trình đồng bộ hoá này giúp loại bỏ hiện tượng giật hình và cải thiện hiệu suất hiển thị của đồ hoạ.

HWC tạo các sự kiện VSync và gửi các sự kiện đó đến SurfaceFlinger thông qua lệnh gọi lại:

typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData,
        hwc2_display_t display, int64_t timestamp);

SurfaceFlinger kiểm soát việc HWC có tạo sự kiện VSync hay không bằng cách gọi đến setVsyncEnabled. SurfaceFlinger cho phép setVsyncEnabled tạo các sự kiện VSync để có thể đồng bộ hoá với chu kỳ làm mới của màn hình. Khi SurfaceFlinger được đồng bộ hoá với chu kỳ làm mới màn hình, SurfaceFlinger sẽ tắt setVsyncEnabled để ngăn HWC tạo các sự kiện VSync. Nếu phát hiện thấy sự khác biệt giữa VSync thực tế và VSync mà SurfaceFlinger đã thiết lập trước đó, SurfaceFlinger sẽ bật lại quá trình tạo sự kiện VSync.

Độ lệch VSync

Ứng dụng đồng bộ hoá và các vòng lặp kết xuất SurfaceFlinger với VSync phần cứng. Trong một sự kiện VSync, màn hình bắt đầu hiển thị khung hình N trong khi SurfaceFlinger bắt đầu kết hợp các cửa sổ cho khung hình N+1. Ứng dụng xử lý dữ liệu đầu vào đang chờ xử lý và tạo khung hình N+2.

Việc đồng bộ hoá với VSync giúp mang lại độ trễ nhất quán. Việc này giúp giảm lỗi trong các ứng dụng và SurfaceFlinger, đồng thời giảm thiểu tình trạng màn hình bị lệch pha với nhau. Điều này giả định rằng thời gian mỗi khung hình của ứng dụng và SurfaceFlinger không có nhiều khác biệt. Độ trễ ít nhất là 2 khung hình.

Để khắc phục vấn đề này, bạn có thể sử dụng độ lệch VSync để giảm độ trễ từ đầu vào đến màn hình bằng cách tạo tín hiệu ứng dụng và thành phần tương ứng với VSync phần cứng. Điều này có thể xảy ra vì thành phần cộng với ứng dụng thường mất ít hơn 33 mili giây.

Kết quả của độ lệch VSync là 3 tín hiệu có cùng khoảng thời gian và pha độ lệch:

  • HW_VSYNC_0 – Màn hình bắt đầu hiển thị khung hình tiếp theo.
  • VSYNC – Ứng dụng đọc dữ liệu đầu vào và tạo khung hình tiếp theo.
  • SF_VSYNC – SurfaceFlinger bắt đầu kết hợp cho khung hình tiếp theo.

Với độ lệch VSync, SurfaceFlinger sẽ nhận vùng đệm và kết hợp khung trong khi ứng dụng đồng thời xử lý dữ liệu đầu vào và kết xuất khung.

DispSync

DispSync duy trì một mô hình các sự kiện VSync định kỳ dựa trên phần cứng của một màn hình và sử dụng mô hình đó để thực thi các lệnh gọi lại ở các độ lệch pha cụ thể từ các sự kiện VSync phần cứng.

DispSync là một vòng khoá pha (PLL) phần mềm tạo ra các tín hiệu VSYNCSF_VSYNC mà Choreographer và SurfaceFlinger sử dụng, ngay cả khi không bù phần cứng VSync.

Luồng DispSync được minh hoạ trong hình sau:

Quy trình DispSync

Hình 1. Luồng DispSync.

DispSync có những đặc điểm sau:

  • Tài liệu tham khảoHW_VSYNC_0.
  • Đầu raVSYNCSF_VSYNC.
  • Phản hồi – Xoá dấu thời gian tín hiệu hàng rào khỏi HWC.

Độ lệch khi VSync ngừng hoạt động

Dấu thời gian tín hiệu của hàng rào rút lui phải khớp với VSync phần cứng, ngay cả trên những thiết bị không sử dụng pha bù. Nếu không, các lỗi có vẻ nghiêm trọng hơn thực tế. Các bảng điều khiển thông minh thường có một delta, trong đó hàng rào ngừng hoạt động là cuối cùng của quyền truy cập trực tiếp vào bộ nhớ (DMA) để hiển thị bộ nhớ, nhưng việc chuyển đổi màn hình thực tế và VSync phần cứng sẽ diễn ra sau đó.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS được đặt trong tệp makefile BoardConfig.mk của thiết bị. Thông tin này dựa trên bộ điều khiển màn hình và các đặc điểm của bảng điều khiển. Thời gian từ dấu thời gian hàng rào ngừng hoạt động đến tín hiệu VSync của phần cứng được đo bằng nano giây.

Độ lệch VSYNC và SF_VSYNC

VSYNC_EVENT_PHASE_OFFSET_NSSF_VSYNC_EVENT_PHASE_OFFSET_NS được đặt một cách thận trọng dựa trên các trường hợp sử dụng có tải cao, chẳng hạn như thành phần GPU một phần trong quá trình chuyển đổi cửa sổ hoặc Chrome cuộn qua một trang web có chứa ảnh động. Các độ lệch này cho phép thời gian kết xuất ứng dụng dài và thời gian kết hợp GPU dài.

Độ trễ từ 1 đến 2 mili giây là có thể nhận thấy. Để giảm thiểu độ trễ mà không làm tăng đáng kể số lượng lỗi, hãy tích hợp quy trình kiểm thử lỗi tự động kỹ lưỡng.