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ổ, SurfaceFlinger sử dụng bề mặt tổng hợp của màn hình.
SurfaceFlinger
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 xuất hiệ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. Lớp là sự kết hợp của một bề mặt , có chứa BufferQueue và SurfaceControl , chứa siêu dữ liệu của lớp như khung hiển thị. SurfaceFlinger tạo lớp và gửi nó đến WindowManager. Sau đó, WindowManager sẽ gửi bề mặt đến ứng dụng, nhưng vẫn giữ SurfaceControl để thao tác 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 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 cập nhật thông qua ASurfaceTransactions. Sau đó, các ứng dụng nhận 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 có được, v.v.
Bảng sau bao gồm các chi tiết khác về ASurfaceControl và các thành phần liên quan của nó.
Thành phần | Sự mô tả |
---|---|
ASurfaceControl | Kết thúc SurfaceControl và cho phép một ứ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 như một phần tử con của ANativeWindow hoặc như một phần tử con của một ASurfaceControl khác. |
ASurfaceTransaction | Giao dịch kết thúc để 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 các bộ đệ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 có được và hàng rào phát hành trước đó, tới 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 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 xé hình trên màn hình, có thể xảy ra khi cập nhật màn hình 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 rằng 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 kiếm bộ đệm mới. Nếu SurfaceFlinger tìm thấy một bộ đệm mới, SurfaceFlinger sẽ mua bộ đệm đó; nếu không, SurfaceFlinger tiếp tục sử dụng bộ đệm đã mua trước đó. SurfaceFlinger phải luôn hiển thị một cái gì đó, vì vậy nó được treo vào một bộ đệm. Nếu không có bộ đệm nào từng đượ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 bộ đệm cho các lớp có thể nhìn thấy, nó sẽ hỏi Trình soạn thảo phần cứng (HWC) cách 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 khách hàng, SurfaceFlinger sẽ tổng hợp các lớp đó. Sau đó, SurfaceFlinger chuyển bộ đệm đầu ra tới HWC .
WindowManager
WindowManager điều khiển các đối tượng cửa sổ , là vùng chứa cho các đối tượng dạ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 các 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 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 vòng trước
Nhiều lớp phủ phần cứng không hỗ trợ xoay (và ngay cả khi chúng làm vậy, nó vẫn tốn năng lượng xử lý); giải pháp là chuyển đổi bộ đệm trước khi nó đến SurfaceFlinger. Android hỗ trợ gợi ý truy vấn ( NATIVE_WINDOW_TRANSFORM_HINT
) trong ANativeWindow
để biểu thị biến đổi có nhiều khả năng đượ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ó đế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 nó chạy ra cuối trang. Để tiết kiệm điện năng, hãy thực hiện thao tác quay trước. Để biết chi tiết, hãy xem giao diện ANativeWindow
được định nghĩa trong system/core/include/system/window.h
.