SurfaceFlinger và WindowManager

SurfaceFlinger chấp nhận vùng đệm, soạn vùng đệm và gửi vùng đệm đến màn hình. WindowManager cung cấp cho SurfaceFlinger các vùng đệm và cửa sổ siêu dữ liệu mà SurfaceFlinger sử dụng để kết hợp các bề mặt vào màn hình.

SurfaceFlinger

SurfaceFlinger có thể chấp nhận vùng đệm theo hai cách: thông qua BufferQueue và SurfaceControl hoặc thông qua ASurfaceControl.

Một cách SurfaceFlinger chấp nhận vùng đệm là thông qua BufferQueue và SurfaceControl. Khi chạy ở nền trước, ứng dụng sẽ yêu cầu vùng đệm từ WindowManager. Sau đó, WindowManager yêu cầu một lớp từ SurfaceFlinger. Lớp là sự kết hợp của một bề mặt chứa BufferQueue và một SurfaceControl chứa siêu dữ liệu lớp như khung hiển thị. SurfaceFlinger tạo lớp và gửi lớp này đến WindowManager. Sau đó, WindowManager sẽ gửi giao diện đến ứng dụng, nhưng vẫn giữ SurfaceControl để thao tác với giao diện của ứng dụng trên màn hình.

Android 10 thêm ASurfaceControl, đây là một cách khác mà SurfaceFlinger có thể chấp nhận vùng đệm. ASurfaceControl kết hợp một nền tảng và một SurfaceControl thành một gói giao dịch được gửi đến SurfaceFlinger. ASurfaceControl được liên kết với một lớp mà các ứng dụng hãy cập nhật thông qua ASurfaceTransactions. Sau đó, ứng dụng sẽ nhận thông tin về ASurfaceTransactions thông qua các lệnh gọi lại vượt qua ASurfaceTransactionStats chứa thông tin, chẳng hạn như thời gian chốt, thời gian thu được, v.v.

Bảng sau đây cung cấp thêm thông tin chi tiết về ASurfaceControl và thành phần liên kết.

Thành phần Mô tả
ASurfaceControl Bao bọc SurfaceControl và cho phép ứng dụng tạo SurfaceControls tương ứng với các lớp trên màn hình.

Có thể được tạo dưới dạng thành phần con của ANativeWindow hoặc dưới dạng thành phần con của một ASurfaceControl khác.
ASurfaceTransaction Gói Giao dịch để cho phép ứng dụng chỉnh sửa các thuộc tính mô tả của lớp, chẳng hạn như hình học, đồng thời gửi các vùng đệm đã cập nhật đến SurfaceFlinger.
ASurfaceTransactionStats Gửi thông tin về các giao dịch đã được trình bày, chẳng hạn như thời gian khoá, thời gian thu nạp và hàng rào phát hành trước đó, đến một ứng dụng thông qua lệnh gọi lại đã đăng ký trước.

Mặc dù các ứng dụng có thể gửi vùng đệm bất cứ lúc nào, nhưng SurfaceFlinger chỉ thức dậy để chấp nhận vùng đệm giữa các lần làm mới màn hình. Điều này có thể khác nhau tuỳ thuộc vào thiết bị. Việc này giúp giảm thiểu mức sử dụng bộ nhớ và tránh hiện tượng xé hình trên có thể xảy ra khi cập nhật màn hình giữa làm mới.

Khi màn hình giữa các lần làm mới, màn hình sẽ gửi VSYNC đến SurfaceFlinger. Tín hiệu VSYNC cho biết màn hình có thể làm mới mà không bị xé hình. Khi SurfaceFlinger nhận được tín hiệu VSYNC, SurfaceFlinger duyệt qua danh sách các lớp để tìm vùng đệm mới. Nếu SurfaceFlinger tìm thấy một bộ đệm mới, SurfaceFlinger sẽ mua lại bộ đệm; nếu không, SurfaceFlinger sẽ tiếp tục để sử dụng vùng đệm thu được trước đó. SurfaceFlinger phải luôn hiển thị nội dung nào đó, vì vậy, lớp này sẽ treo trên một vùng đệm. Nếu chưa từng gửi vùng đệm trên thì lớp này sẽ bị bỏ qua.

Sau khi SurfaceFlinger thu thập tất cả vùng đệm cho các lớp hiển thị, SurfaceFlinger yêu cầu phần cứng Composer (HWC) sẽ được thực hiện như thế nào. Nếu HWC đánh dấu loại thành phần lớp là thành phần ứng dụng, thì SurfaceFlinger sẽ kết hợp các lớp đó. Sau đó, SurfaceFlinger truyền vùng đệm đầu ra đến HWC.

WindowManager

WindowManager kiểm soát các đối tượng window (cửa sổ), là vùng chứa dành cho các đối tượng view (chế độ xem). Các đối tượng cửa sổ luôn được hỗ trợ bởi bề mặt. WindowManager giám sát vòng đời, các sự kiện đầu vào và tiêu điểm, hướng màn hình, hiệu ứng chuyển đổi, ảnh động, vị trí, phép biến đổi, thứ tự z và nhiều khía cạnh khác của cửa sổ. WindowManager gửi tất cả siêu dữ liệu cửa sổ đến SurfaceFlinger để SurfaceFlinger có thể sử dụng dữ liệu đó để các bề mặt tổng hợp trên màn hình.

Xoay trước

Nhiều lớp phủ phần cứng không hỗ trợ tính năng xoay (và ngay cả khi có, lớp phủ này cũng sẽ tiêu tốn sức mạnh xử lý); giải pháp là chuyển đổi vùng đệm trước khi vùng đệm này đến SurfaceFlinger. Android hỗ trợ gợi ý truy vấn (NATIVE_WINDOW_TRANSFORM_HINT) trong ANativeWindow đến biểu thị phép biến đổi có nhiều khả năng nhất sẽ được áp dụng cho vùng đệm bằng cách SurfaceFlinger. Trình điều khiển GL có thể dùng gợi ý này để biến đổi trước vùng đệm trước khi đến SurfaceFlinger để khi vùng đệm đến, vùng đệm đã biến đổi.

Ví dụ: khi nhận được gợi ý xoay 90 độ, hãy tạo và áp dụng vào vùng đệm để ngăn mã này chạy ra khỏi cuối trang. Để tiết kiệm pin, hãy thực hiện việc xoay trước này. Để biết thông tin chi tiết, hãy xem ANativeWindow giao diện được xác định trong system/core/include/system/window.h.