Lớp và màn hình

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.