VSYNC

Tín hiệu VSYNC đồng bộ hóa đường dẫn hiển thị. Quy trình hiển thị bao gồm kết xuất ứng dụng, bố cục SurfaceFlinger và Trình soạn thảo phần cứng (HWC) hiển thị hình ảnh trên màn hình. VSYNC đồng bộ hóa thời gian các ứng dụng thức dậy để bắt đầu hiển thị, thời gian SurfaceFlinger thức dậy để tổng hợp màn hình và chu kỳ làm mới màn hình. Sự đồng bộ hóa này giúp loại bỏ tình trạng giật hình và cải thiện hiệu suất hình ảnh của đồ họa.

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 xem HWC có tạo sự kiện VSYNC hay không bằng cách gọi tới setVsyncEnabled . SurfaceFlinger cho phép setVsyncEnabled tạo các sự kiện VSYNC để nó có thể đồng bộ hóa với chu kỳ làm mới màn hình. Khi SurfaceFlinger được đồng bộ hóa 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 SurfaceFlinger phát hiện sự khác biệt giữa VSYNC thực tế và VSYNC thì SurfaceFlinger đã thiết lập trước đó sẽ kích hoạt lại việc tạo sự kiện VSYNC.

Bù đắp VSYNC

Ứng dụng đồng bộ hóa và SurfaceFlinger hiển thị các vòng lặp với VSYNC phần cứng. Trong sự kiện VSYNC, màn hình bắt đầu hiển thị khung N trong khi SurfaceFlinger bắt đầu tổng 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 .

Đồng bộ hóa với VSYNC mang lại độ trễ nhất quán. Nó làm giảm lỗi trong ứng dụng và SurfaceFlinger, đồng thời giảm thiểu hiện tượng hiển thị lệch pha với nhau. Điều này giả định thời gian của ứng dụng và SurfaceFlinger trên mỗi khung hình không khác nhau nhiều. Độ trễ ít nhất là hai khung hình.

Để khắc phục điều này, bạn có thể sử dụng hiệu chỉnh 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ể thực hiện được vì ứng dụng cộng với thành phần thường mất ít hơn 33 mili giây.

Kết quả của phần bù VSYNC là ba tín hiệu có cùng chu kỳ và pha bù:

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

Với phần bù VSYNC, SurfaceFlinger nhận bộ đệm và tổng hợp khung trong khi ứng dụng xử lý đồng thời đầu vào và hiển thị khung.

Đồng bộ hóa hiển thị

DispSync duy trì mô hình 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 hiện 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à vòng lặp khóa pha (PLL) phần mềm tạo ra tín hiệu VSYNC và SF_VSYNC được Choreographer và SurfaceFlinger sử dụng, ngay cả khi không được bù đắp từ VSYNC phần cứng.

Luồng DispSync

Hình 1. Luồng DispSync

DispSync có những phẩm chất sau:

  • Tham khảo — HW_VSYNC_0.
  • Đầu ra - VSYNC và SF_VSYNC.
  • Phản hồi - Gỡ bỏ dấu thời gian tín hiệu hàng rào từ Trình soạn thảo phần cứng.

VSYNC/bù đắp 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ù. Ngược lại, lỗi có vẻ nghiêm trọng hơn thực tế. Các bảng thông minh thường có một vùng đồng bằng trong đó hàng rào nghỉ hưu là điểm cuối của quyền truy cập bộ nhớ trực tiếp (DMA) để hiển thị bộ nhớ, nhưng công tắc hiển thị thực tế và HW VSYNC sẽ xuất hiện muộn hơn một thời gian.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS được đặt trong tệp tạo tệp BoardConfig.mk của thiết bị. Nó dựa trên bộ điều khiển hiển thị và đặc điểm của bảng điều khiển. Thời gian từ dấu thời gian hàng rào nghỉ hưu đến tín hiệu CTNH VSYNC đượ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 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 trang web có chứa hoạt ảnh. Những sự bù đắp này cho phép thời gian kết xuất ứng dụng dài và thời gian tổng hợp GPU dài.

Độ trễ hơn một hoặc hai mili giây là đáng chú ý. Để 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 tính năng kiểm tra lỗi tự động kỹ lưỡng.