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à Trình tổng hợp phần cứng (HWC) hiển thị hình ảnh trên màn hình. VSYNC đồng bộ hoá thời gian các ứ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 và cải thiện hiệu suất hình ảnh 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 sự kiện VSYNC. Nếu SurfaceFlinger phát hiện sự khác biệt giữa VSYNC thực tế và VSYNC đã thiết lập trước đó, SurfaceFlinger sẽ bật lại tính năng tạo sự kiện VSYNC.
Độ lệch VSYNC
Ứng dụng đồng bộ hoá và SurfaceFlinger kết xuất các vòng lặp đến VSYNC phần cứng. Trong một sự kiện VSYNC, màn hình bắt đầu hiển thị khung N trong khi SurfaceFlinger bắt đầu kết hợp các cửa sổ cho khung N+1. Ứng dụng xử lý dữ liệu đầu vào đang chờ xử lý và tạo khung N+2.
Việc đồng bộ hoá với VSYNC sẽ mang lại độ trễ nhất quán. Điều 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 thời gian trên mỗi khung của ứng dụng và SurfaceFlinger không thay đổi nhiều. Độ trễ tối thiểu 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 kết hợp ứng dụng thường mất chưa đến 33 ms.
Kết quả của độ lệch VSYNC là ba tín hiệu có cùng chu kỳ 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 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à hiển thị khung.
DispSync
DispSync duy trì mô hình của các sự kiện VSYNC dựa trên phần cứng định kỳ của màn hình và sử dụng mô hình đó để thực thi lệnh gọi lại tạ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 lặp khoá pha (PLL) phần mềm tạo ra các tín hiệu VSYNC và SF_VSYNC mà Choreographer và SurfaceFlinger sử dụng, ngay cả khi không được bù từ VSYNC phần cứng.

Hình 1. Luồng DispSync
DispSync có các đặc điểm sau:
- Tài liệu tham khảo — HW_VSYNC_0.
- Đầu ra – VSYNC và SF_VSYNC.
- Phản hồi – Ngừng sử dụng dấu thời gian tín hiệu hàng rào từ Trình tổng hợp phần cứng.
VSYNC/bù trừ khi nghỉ hưu
Dấu thời gian tín hiệu của hàng rào nghỉ hưu phải khớp với HW VSYNC, ngay cả trên các thiết bị không sử dụng pha bù. Nếu không, lỗi sẽ có vẻ nghiêm trọng hơn thực tế. Bảng điều khiển thông minh thường có một delta, trong đó hàng rào nghỉ hưu là điểm kết thúc truy cập bộ nhớ trực tiếp (DMA) để hiển thị bộ nhớ, nhưng nút chuyển hiển thị thực tế và HW VSYNC là một thời gian sau đó.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
được đặt trong tệp makefile BoardConfig.mk
của thiết bị. Giá trị này dựa trên trình đ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 của hàng rào nghỉ hưu đế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_NS
và SF_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 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 chứa ảnh động. Các độ lệch này cho phép thời gian kết xuất ứng dụng lâu và thời gian kết hợp GPU lâu.
Bạn có thể nhận thấy độ trễ hơn một hoặc hai mili giây. Để giảm thiểu độ trễ mà không làm tăng đáng kể số lỗi, hãy tích hợp tính năng kiểm thử lỗi tự động kỹ lưỡng.