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 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 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 truyền ASurfaceTransactionStats chứa thông tin, chẳng hạn như thời gian khoá, 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 | 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ị. Đ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 một bộ đệm mới, SurfaceFlinger sẽ thu nạp bộ đệm đó; nếu không, SurfaceFlinger sẽ tiếp tục sử dụng bộ đệ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 sẽ 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, 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 đó để 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
để biểu thị phép biến đổi có nhiều khả năng nhất sẽ được SurfaceFlinger áp dụng cho vùng đệm. Trình điều khiển GL có thể sử dụng gợi ý này để chuyển đổi trước vùng đệm trước khi vùng đệm đó đến SurfaceFlinger để khi vùng đệm đến, vùng đệm đó được chuyể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 cho 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
.