SurfaceFlinger và WindowManager

SurfaceFlinger chấp nhận bộ đệm, soạn bộ đệm và gửi bộ đệm đến màn hình. WindowManager cung cấp cho SurfaceFlinger bộ đệ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.

bề mặtFlinger

SurfaceFlinger có thể chấp nhận bộ đệ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 bộ đệm là thông qua BufferQueue và SurfaceControl. Khi một ứng dụng chạy lên nền trước, nó sẽ yêu cầu bộ đệm từ WindowManager . WindowManager sau đó yêu cầu một lớp từ SurfaceFlinger. Một 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 của lớp giống như khung hiển thị. SurfaceFlinger tạo lớp và gửi nó đến WindowManager. Sau đó, WindowManager gửi bề mặt tới ứng dụng nhưng giữ lại SurfaceControl để điều khiển 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 bộ đệm. ASurfaceControl kết hợp một bề mặt 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 đó, các ứng dụng sẽ nhận được thông tin về ASurfaceTransactions thông qua các lệnh gọi lại chuyển ASurfaceTransactionStats chứa thông tin, chẳng hạn như thời gian chốt, thời gian thu thập, v.v.

Bảng sau bao gồm nhiều chi tiết hơn về ASurfaceControl và các thành phần liên quan của nó.

Thành phần Sự miêu 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 con của ANativeWindow hoặc là con của ASurfaceControl khác.
Giao dịch bề mặt Kết thúc giao dịch để cho phép khách hà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 bộ đệm được cập nhật tới SurfaceFlinger.
Thống kê giao dịch bề mặt Gửi thông tin về các giao dịch đã được thực hiện, chẳng hạn như thời gian chốt, thời gian nhận và giới hạn phát hành trước đó, tới ứ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 bộ đệm bất cứ lúc nào, SurfaceFlinger chỉ thức dậy để chấp nhận bộ đệm giữa các lần làm mới màn hình, điều này có thể khác nhau tùy thuộc vào thiết bị. Điều này giảm thiểu việc sử dụng bộ nhớ và tránh hiện tượng rách hình trên màn hình, điều này có thể xảy ra khi cập nhật màn hình khi làm mới giữa chừng.

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

Sau khi SurfaceFlinger đã thu thập tất cả các bộ đệm cho các lớp hiển thị, nó sẽ hỏi Trình soạn thảo phần cứng (HWC) cách thức thực hiện thành phần. Nếu HWC đánh dấu loại thành phần lớp là thành phần máy khách, SurfaceFlinger sẽ tổng hợp các lớp đó. Sau đó, SurfaceFlinger chuyển bộ đệm đầu ra tới HWC .

Trình quản lý cửa sổ

WindowManager điều khiển các đối tượng cửa sổ , là các thùng chứa các đối tượng xem . Các đối tượng cửa sổ luôn được hỗ trợ bởi các đối tượng bề mặt. 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, chuyển tiếp, hoạt ảnh, 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 cửa sổ tới SurfaceFlinger để SurfaceFlinger có thể sử dụng dữ liệu đó cho 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ợ xoay vòng (và ngay cả khi có hỗ trợ, nó vẫn tiêu tốn năng lượng xử lý); giải pháp là chuyển đổi bộ đệm trước khi nó tới SurfaceFlinger. Android hỗ trợ gợi ý truy vấn ( NATIVE_WINDOW_TRANSFORM_HINT ) trong ANativeWindow để biểu thị biến đổi có khả năng nhất sẽ được SurfaceFlinger áp dụng cho bộ đệm. Trình điều khiển GL có thể sử dụng gợi ý này để chuyển đổi trước bộ đệm trước khi đến SurfaceFlinger để khi bộ đệm đến, nó đượ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 ma trận vào bộ đệm để ngăn ma trận chạy ra cuối trang. Để tiết kiệm điện, hãy thực hiện việc xoay trước này. Để biết chi tiết, hãy xem giao diện ANativeWindow được xác định trong system/core/include/system/window.h .