VSYNC

Tín hiệu VSYNC sẽ đồng bộ hoá quy trình hiển thị. Màn hình quy trình bao gồm kết xuất ứng dụng, cấu trúc SurfaceFlinger và phần cứng Trình soạn thảo (HWC) trình bày hình ảnh trên màn hình. VSYNC đồng bộ hoá thời điểm ứng dụng đánh thức để bắt đầu kết xuất, thời điểm SurfaceFlinger đánh thức 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ỏ tình trạng gián đoạn 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ày đế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 các sự kiện VSYNC hay không bằng cách đang gọi đến setVsyncEnabled. SurfaceFlinger bật setVsyncEnabled để tạo các sự kiện VSYNC để có thể đồng bộ hoá với chu kỳ làm mới màn hình. Khi SurfaceFlinger được đồng bộ hoá với chu kỳ làm mới màn hình, SurfaceFlinger tắt setVsyncEnabled thành ngăn HWC tạo các sự kiện VSYNC. Nếu SurfaceFlinger phát hiện thấy một sự khác biệt giữa VSYNC thực tế và VSYNC mà nó đã thiết lập trước đó SurfaceFlinger bật lại tính năng tạo sự kiện VSYNC.

Độ lệch VSYNC

Ứng dụng đồng bộ hoá và vòng lặp kết xuất SurfaceFlinger vào VSYNC phần cứng. Khi 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 này xử lý đầu vào đang chờ xử lý và tạo khung N+2.

Việc đồng bộ hoá với VSYNC mang lại độ trễ nhất quán. Điều này giúp giảm lỗi về ứng dụng và SurfaceFlinger, đồng thời giảm thiểu tình trạng màn hình bị trôi dạt và lệch pha nhờ với nhau. Giả sử ứng dụng và SurfaceFlinger trên mỗi khung hình thời gian có thể khác nhau. Độ 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 giá trị nhập từ đầu vào đến hiển thị độ trễ bằng cách tạo tín hiệu ứng dụng và cấu trúc tương ứng với phần cứng VSYNC. Điều này có thể xảy ra vì ứng dụng và thành phần thường mất ít thời gian hơn hơn 33 mili giây.

Kết quả của độ lệch VSYNC là 3 tín hiệu có cùng kỳ và độ lệch giai đoạn:

  • 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 nhận vùng đệm và kết hợp khung hình trong khi ứng dụng đồng thời xử lý đầu vào và kết xuất khung.

Ngừng đồng bộ hoá

DispSync duy trì một mô hình của các sự kiện VSYNC định kỳ dựa trên phần cứng của một hiển thị và sử dụng mô hình đó để thực thi lệnh gọi lại ở giai đoạn cụ thể chênh lệch 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 Tín hiệu VSYNC và SF_VSYNC được Choreographer và SurfaceFlinger sử dụng, ngay cả khi không được bù trừ từ phần cứng VSYNC.

Quy trình DispSync

Hình 1. Quy trình 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 — Gỡ bỏ dấu thời gian tín hiệu hàng rào từ Hardware Composer (Trình tổng hợp phần cứng).

Mức chênh lệch của VSYNC/liên kết gỡ bỏ

Dấu thời gian tín hiệu của hàng rào gỡ bỏ phải khớp với HW VSYNC, ngay cả trên thiết bị không sử dụng giai đoạn bù trừ. Nếu không, lỗi có vẻ nghiêm trọng hơn chúng. Các bảng điều khiển thông minh thường có một delta, trong đó hàng rào nghỉ hưu là 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 sẽ sớm xuất hiện.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS được đặt trong phần Tệp makefile BoardConfig.mk. Giá trị này dựa trên bộ điều khiển màn hình và bảng điều khiển đặc điểm. Thời gian từ dấu thời gian của hàng rào gỡ bỏ đến khi HW VSYNC tín hiệu đượ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 một trang web có chứa hoạt ảnh. Các mức chênh 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ễ lớn hơn một hoặc hai mili giây là điều dễ nhận thấy. Để giảm thiểu độ trễ mà không cần tăng đáng kể số lỗi, hãy tích hợp lỗi tự động triệt để kiểm thử.