Lớp và màn hình là hai thành phần gốc đại diện cho công việc kết hợp và tương tác với phần cứng hiển thị.
Lớp
Lớp (layer) là thành phần kết hợp quan trọng nhất. Lớp là một
tổ hợp surface và 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 này 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 dưới đây.
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 của nó. Bao gồm thông tin như vị trí các cạnh của một lớp và thứ tự Z của nó so với các lớp khác (nên đặt ở phía trước hay phía sau các lớp khác). |
Nội dung | Xác định cách hiển thị nội dung trên lớp trong giới hạn do các thuộc tính vị trí xác định. Bao gồm các thông tin như cắt (để mở rộng một phần nội dung nhằm lấp đầy ranh giới 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 kết hợp lớp này với các lớp khác. Bao gồm thông tin như chế độ pha trộn và giá trị alpha trên toàn lớp cho alpha kết hợp. |
Tối ưu hoá | Cung cấp thông tin không thực sự cần thiết để kết hợp chính xác lớp này mà có thể được sử dụng bởi thiết bị Hardware Composer (HWC) để tối ưu hoá cách hoạt động của bản sáng tác. Bao gồm các thông tin như vùng nhìn thấy của lớp và phần nào của lớp đã bị được cập nhật kể từ khung 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à Bạn có thể thêm hoặc gỡ bỏ màn hình trong quá trình hệ thống hoạt động bình thường. Các màn hình thêm/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àn hình ngoài được kết nối hoặc ngắt kết nối với thiết bị, được gọi là cắm nóng. Ứ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ì màn hình thực.
Màn hình ảo
SurfaceFlinger hỗ trợ màn hình trong (được tích hợp vào điện thoại hoặc máy tính bảng), màn hình 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 cung cấp đầu ra tổng 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. Các khung hình được tạo cho màn hình ảo được ghi vào BufferQueue.
Màn hình ảo có thể chia sẻ 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 của riêng chúng. Không có VSYNC cho màn hình ảo, vì vậy, VSYNC cho màn hình nội bộ sẽ kích hoạt thành phần cho tất cả màn hình.
Trên các phương thức triển khai HWC hỗ trợ các màn hình này, màn hình ảo có thể được kết hợp với OpenGL ES (GLES), HWC hoặc cả GLES và HWC. Trên các phương thức 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: ghi lại màn hình
Lệnh screenrecord
cho phép người dùng
ghi lại mọi thứ xuất hiện trên màn hình dưới dạng tệp .mp4
trên
. Để triển khai tính năng này, hệ thống sẽ nhận các khung hình tổng 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ộ mã hoá và giải mã 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. Để thử thách hơn, mục tiêu là quay video ở tốc độ 60 khung hình/giây ở độ phân giải đầy đủ. Chìa khoá để 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 một video
bộ mã hoá, quá trình mediaserver
sẽ tạo BufferQueue, kết nối
cho phía người tiêu dùng, sau đó chuyển phía nhà sản xuất cho
screenrecord
làm nền tảng.
Sau đó, tiện ích screenrecord
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 màn hình ảo này gửi đầu ra đến bề mặt đến từ quy trình mediaserver
. Trong trường hợp này, SurfaceFlinger là thực thể tạo vùng đệm thay vì thực thể sử dụng vùng đệm.
Sau khi cấu hình hoàn tất, screenrecord
sẽ kích hoạt khi dữ liệu đã mã hoá xuất hiện. Khi các ứng dụng vẽ, bộ đệm của chúng sẽ chuyển đến SurfaceFlinger,
và SurfaceFlinger sẽ kết hợp các bộ đệm đó thành một bộ đệm duy nhất được gửi trực tiếp đến bộ mã hoá video trong quy trình mediaserver
. Khung hình đầy đủ không bao giờ
mà quy trình screenrecord
nhìn thấy. Trong nội bộ, quá trình mediaserver
có cách riêng để di chuyển vùng đệm xung quanh, đồng thời truyền dữ liệu theo tay cầm, giảm thiểu hao tổn.
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ị SurfaceFlinger hoạt động như một đối tượng sử 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à trình tạo 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 kín sẽ được tạo trong đó màn hình tổng 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 tổng hợp, vì vậy, vào lần làm mới tiếp theo, hình ảnh tổng hợp bên trong cửa sổ được làm mới
cũng sẽ hiện nội dung của cửa sổ. Để xem cách hoạt động của tính năng này, hãy bật Tuỳ chọn cho nhà phát triển trong phần 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 sử 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.