Lớp và màn hình là hai thành phần cơ bản đại diện cho công việc kết hợp và tương tác với phần cứng màn hình.
Lớp
Lớp là thành phần kết hợp quan trọng nhất. Lớp là sự
kết hợp của một bề mặt và một thực thể của
SurfaceControl.
Mỗi lớp có một tập hợp các thuộc tính xác định cách lớp đó tương tác với các lớp khác. Các thuộc tính của lớp được mô tả trong bảng sau:
| Thuộc tính | Mô tả |
|---|---|
| Vị trí | Xác định vị trí lớp xuất hiện trên màn hình. Bao gồm thông tin như vị trí của các cạnh của lớp và thứ tự Z của lớp đó so với các lớp khác (lớp đó phải ở phía trước hay phía sau các lớp khác). |
| Nội dung | Chỉ định cách nội dung trên lớp xuất hiện trong phạm vi do các thuộc tính vị trí đặt ra. Bao gồm cả thao tác cắt (để mở rộng nội dung cho vừa với phạm vi của lớp ) và biến đổi (để hiển thị nội dung đã xoay hoặc lật). |
| Bản sáng tác | Xác định cách lớp phải được kết hợp với các lớp khác. Bao gồm thông tin như chế độ hoà trộn và giá trị alpha trên toàn lớp để kết hợp alpha . |
| Tối ưu hoá | Cung cấp thông tin không bắt buộc phải có để kết hợp lớp chính xác, nhưng thiết bị Trình kết hợp phần cứng (HWC) có thể sử dụng để tối ưu hoá hiệu suất kết hợp. Bao gồm cả vùng hiển thị của lớp và phần được cập nhật kể từ khung hình trước. |
Màn hình
Màn hình là một thành phần kết hợp quan trọng khác. Một hệ thống có thể có nhiều màn hình và có thể thêm hoặc xoá màn hình trong các hoạt động bình thường của hệ thống. Màn hình được thêm hoặc xoá theo yêu cầu của HWC hoặc theo yêu cầu của khung.
Thiết bị HWC yêu cầu thêm hoặc xoá màn hình khi một màn hình bên ngoài được kết nối hoặc ngắt kết nối với thiết bị. Đây được gọi là hotplugging. Ứng dụng yêu cầu màn hình ảo, có nội dung được kết xuất vào vùng đệm ngoài màn hình thay vì vào màn hình vật lý.
Màn hình ảo
SurfaceFlinger hỗ trợ màn hình bên trong (tích hợp vào điện thoại hoặc máy tính bảng), màn hình bên ngoài (chẳng hạn như TV được kết nối qua HDMI) và một hoặc nhiều màn hình ảo giúp cung cấp đầu ra kết hợp trong hệ thống. Bạn có thể dùng màn hình ảo để ghi lại màn hình hoặc gửi màn hình qua mạng. Khung hình được tạo cho màn hình ảo sẽ được ghi vào BufferQueue.
Màn hình ảo có thể dùng chung cùng một tập hợp lớp với màn hình chính (ngăn xếp lớp) hoặc có tập hợp lớp riêng. Không có VSync cho màn hình ảo, vì vậy, VSync cho màn hình bên trong sẽ kích hoạt quá trình kết hợp cho tất cả màn hình.
Trên các cách triển khai HWC hỗ trợ màn hình ảo, bạn có thể kết hợp màn hình ảo với OpenGL ES (GLES), HWC hoặc cả GLES và HWC. Trên các cách triển khai không hỗ trợ, màn hình ảo luôn được kết hợp bằng GLES.
Nghiên cứu điển hình: screenrecord
Lệnh screenrecord cho phép người dùng
ghi lại mọi nội dung xuất hiện trên màn hình dưới dạng tệp MP4 trên
đĩa. Để triển khai lệnh này, hệ thống sẽ nhận các khung hình kết hợp từ SurfaceFlinger, ghi các khung hình đó vào bộ mã hoá video, sau đó ghi dữ liệu video đã mã hoá vào một tệp. Bộ codec video được quản lý bằng một quy trình riêng (mediaserver), vì vậy, các vùng đệm đồ hoạ lớn phải di chuyển xung quanh hệ thống. Để làm cho việc này trở nên khó khăn hơn, mục tiêu là ghi video 60 khung hình/giây ở độ phân giải đầy đủ. Yếu tố quan trọng để thực hiện việc này một cách hiệu quả là BufferQueue.
Lớp MediaCodec cho phép ứng dụng cung cấp dữ liệu dưới dạng byte thô trong vùng đệm hoặc thông qua một bề mặt. Khi screenrecord yêu cầu quyền truy cập vào bộ mã hoá video, quy trình mediaserver sẽ tạo một BufferQueue, tự kết nối với phía người dùng, sau đó chuyển phía nhà sản xuất trở lại screenrecord dưới dạng một bề mặt.
Tiện ích screenrecord sẽ yêu cầu SurfaceFlinger tạo một màn hình ảo phản chiếu màn hình chính (tức là có tất cả các lớp giống nhau) và hướng dẫn tiện ích này gửi đầu ra đến bề mặt xuất phát từ quy trình mediaserver. Trong trường hợp này, SurfaceFlinger là nhà sản xuất vùng đệm chứ không phải người dùng.
Sau khi hoàn tất quá trình định cấu hình, screenrecord sẽ kích hoạt khi dữ liệu đã mã hoá xuất hiện. Khi các ứng dụng vẽ, vùng đệm của chúng sẽ di chuyển đến SurfaceFlinger. SurfaceFlinger sẽ kết hợp các vùng đệm đó thành một vùng đệm duy nhất được gửi trực tiếp đến bộ mã hoá video trong quy trình mediaserver. Quy trình screenrecord không bao giờ nhìn thấy toàn bộ khung hình. Về nội bộ, quy trình mediaserver có cách riêng để di chuyển các vùng đệm xung quanh, đồng thời chuyển dữ liệu theo cách xử lý, giúp giảm thiểu chi phí chung.
Nghiên cứu điển hình: mô phỏng màn hình phụ
WindowManager có thể yêu cầu SurfaceFlinger tạo một lớp hiển thị mà SurfaceFlinger đóng vai trò là người dùng BufferQueue. Bạn cũng có thể yêu cầu SurfaceFlinger tạo một màn hình ảo mà SurfaceFlinger đóng vai trò là nhà sản xuất BufferQueue.
Nếu bạn kết nối màn hình ảo với một lớp hiển thị, một vòng lặp khép kín sẽ được tạo ra, trong đó màn hình kết hợp xuất hiện trong một cửa sổ. Cửa sổ đó hiện là một phần của đầu ra kết hợp, vì vậy, trong lần làm mới tiếp theo, hình ảnh kết hợp bên trong cửa sổ cũng sẽ hiển thị nội dung của cửa sổ. Để xem tính năng này hoạt động, hãy bật
Tuỳ chọn cho nhà phát triển trong Cài đặt, chọn
Mô phỏng màn hình phụ rồi bật một cửa sổ. Để xem màn hình phụ hoạt động, hãy dùng screenrecord để ghi lại thao tác bật màn hình, sau đó phát lại từng khung hình.