SurfaceFlinger chấp nhận các vùng đệm, tạo thành các vùng đệm và gửi các 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ổ. SurfaceFlinger dùng các vùng đệm và siêu dữ liệu này để kết hợp các nền tảng 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 các vùng đệm là thông qua BufferQueue và SurfaceControl
. Khi một ứng dụng chuyển sang nền trước, ứng dụng đó sẽ yêu cầu các 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 surface (chứa BufferQueue) và một thực thể SurfaceControl
(chứa siêu dữ liệu lớp, chẳng hạn như khung hiển thị).
SurfaceFlinger tạo lớp và gửi lớp đó đến WindowManager
. WindowManager
, sau đó gửi thành phần này đến ứng dụng, nhưng vẫn giữ phiên bản SurfaceControl
để điều chỉnh giao diện của ứng dụng trên màn hình.
Android 10 bổ sung ASurfaceControl
, đây là một cách khác để SurfaceFlinger có thể chấp nhận các vùng đệm. ASurfaceControl
kết hợp một nền tảng và một thực thể 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 các thực thể ASurfaceTransaction
. Sau đó, các ứng dụng sẽ nhận được thông tin về các phiên bản ASurfaceTransaction
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 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 nó:
Thành phần | Mô tả |
---|---|
ASurfaceControl |
Bao bọc SurfaceControl và cho phép ứng dụng tạo các thực thể SurfaceControl tương ứng với các lớp trên màn hình.Có thể được tạo làm phần tử con của ANativeWindow hoặc làm phần tử con của một thực thể ASurfaceControl khác. |
ASurfaceTransaction |
Bao bọc Transaction để 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 chốt, 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 một 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ỉ hoạt động để 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 bạn cập nhật màn hình trong quá trình làm mới.
Khi màn hình đang trong quá trình 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ị xé hình. 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ẽ nạp bộ đệm đó; nếu không, SurfaceFlinger sẽ tiếp tục sử dụng bộ đệm đã nạp trước đó. SurfaceFlinger phải luôn hiển thị nội dung nào đó, vì vậy, nó 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ả các vùng đệm cho các lớp hiển thị, nó sẽ hỏi Hardware Composer (HWC) cách thực hiện việc 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ẽ chuyển vùng đệm đầu ra đến HWC.
WindowManager
WindowManager
kiểm soát các đối tượng Window
, là vùng chứa cho các đối tượng View
. Các đối tượng Window
luôn được hỗ trợ bởi các đối tượng Surface
.
WindowManager
giám sát vòng đời, 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í, biến đổi, thứ tự z và nhiều khía cạnh khác của một 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 thành phần trên màn hình.
Xoay trước
Nhiều lớp phủ phần cứng không hỗ trợ xoay (và ngay cả khi có hỗ trợ, thì việc này cũng tốn nhiều 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ợ một 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 được SurfaceFlinger áp dụng nhất 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, nhờ đó khi vùng đệm đến, vùng đệm sẽ được chuyển đổi chính xác.
Ví dụ: khi nhận được một 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 này trước khi xoay. Để 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
.