SurfaceFlinger và WindowManager

SurfaceFlinger chấp nhận vùng đệm, kết hợp 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à siêu dữ liệu cửa sổ mà SurfaceFlinger sử dụng để kết hợp các bề mặt với màn hình.

SurfaceFlinger

SurfaceFlinger có thể chấp nhận các 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 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 sẽ 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 có chuyển thông tin về ASurfaceTransactionStats có chứa thông tin, chẳng hạn như thời gian chốt, thời gian thu nạp, v.v.

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

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 Giao dịch kết thúc để 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 và gửi vùng đệm cập nhật đến SurfaceFlinger.
ASurfaceTransactionStats Gửi thông tin về các giao dịch đã trình bày (chẳng hạn như thời gian chốt, thời gian nhận hàng và hàng rào phát hành trước đó) cho một ứng dụng thông qua lệnh gọi lại được đă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ị. Điều 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 màn hình. Hiện tượng này có thể xảy ra khi cập nhật màn hình trong khi làm mới.

Khi màn hình đang ở giữa các lần làm mới, màn hình sẽ gửi tín hiệu VSYNC đến SurfaceFlinger. Tín hiệu VSYNC cho biết màn hình có thể được làm mới mà không bị rách. Khi nhận được tín hiệu VSYNC, SurfaceFlinger sẽ duyệt qua danh sách các lớp để tìm vùng đệm mới. Nếu SurfaceFlinger tìm thấy vùng đệm mới, SurfaceFlinger sẽ mua lại vùng đệm đó; nếu không, SurfaceFlinger sẽ tiếp tục sử dụng vùng đệm đã thu nạp 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 có vùng đệm nào được gửi trên một lớp, thì lớp đó sẽ bị bỏ qua.

Sau khi SurfaceFlinger thu thập tất cả vùng đệm cho các lớp hiển thị, lớp này sẽ hỏi Trình kết hợp phần cứng (HWC) cách thực hiện quá trình kết hợp. 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 cửa sổ, là vùng chứa cho các đối tượng thành phần hiển thị. Các đối tượng cửa sổ luôn được các đối tượng nền tảng hỗ trợ. WindowManager giám sát vòng đời, sự kiện nhập và lấy tiêu điểm, hướng màn hình, hiệu ứng chuyển đổi, ảnh động, vị trí, 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 đó để kết hợp các nền tảng 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 để đại diện cho biến đổi có nhiều khả năng được SurfaceFlinger áp dụng cho vùng đệm nhất. Trình điều khiển GL có thể sử 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 được biến đổi chính xác.

Ví dụ: khi nhận được gợi ý xoay 90 độ, hãy tạo và áp dụng một ma trận vào vùng đệm để ngăn vùng đệm 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 giao diện ANativeWindow được xác định trong system/core/include/system/window.h.