Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Lớp và Màn hình

Lớp và màn hình là hai nguyên thủy đại diện cho công việc thành phần và các tương tác với phần cứng màn hình.

Lớp

Một lớp là đơn vị quan trọng nhất của thành phần. Một lớp là sự kết hợp của một bề mặt và một thể hiện 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 nó 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.

Bất động sản Sự miêu 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 các thông tin như vị trí của các cạnh của một lớp và Z trật tự của nó so với các lớp khác (cho dù nó phải ở phía trước hoặc đằng sau lớp khác).
Nội dung Xác định cách nội dung hiển thị trên lớp sẽ được trình bày trong giới hạn được xác định bởi các thuộc tính vị trí. Bao gồm thông tin như cắt (để mở rộng một phần nội dung để lấp đầy các giới hạn của lớp) và chuyển đổi (để hiển thị nội dung được xoay hoặc lật).
Thành phần Xác định cách lớp nên được kết hợp với các lớp khác. Bao gồm các thông tin như chế độ và một giá trị alpha lớp toàn cho pha trộn alpha compositing .
Tối ưu hóa Cung cấp thông tin không hoàn toàn cần thiết để kết hợp chính xác lớp, nhưng thiết bị này có thể được sử dụng bởi Thiết bị soạn thảo phần cứng (HWC) để tối ưu hóa cách thiết bị thực hiện thành phần. Bao gồm thông tin như vùng hiển thị của lớp và phần nào của lớp đã được cập nhật kể từ khung trước.

Hiển thị

Một màn hình là một đơn vị quan trọng của thành phần. Một hệ thống có thể có nhiều màn hình và màn hình có thể được thêm vào hoặc loại bỏ trong quá trình hoạt động bình thường của hệ thống. Các màn hình được thêm / bớt theo yêu cầu của HWC hoặc theo yêu cầu của khung. Các HWC yêu cầu thiết bị hiển thị được thêm vào hoặc gỡ bỏ khi một màn hình ngoài được kết nối hoặc ngắt kết nối từ thiết bị, được gọi là hotplugging. Khách hàng yêu cầu màn hình ảo, có nội dung được trả lại vào một bộ đệm off-màn hình thay vì để một màn hình vật lý.

Màn hình ảo

SurfaceFlinger hỗ trợ một màn hình bên trong (được xây dựng vào điện thoại hoặc máy tính bảng), màn hình ngoài (ví dụ như truyền hình kết nối thông qua HDMI), và một hoặc màn hình ảo hơn mà làm cho ghép đầu ra có sẵn trong hệ thống. Màn hình ảo có thể được sử dụng để ghi lại màn hình hoặc gửi màn hình qua mạng. Các khung đượ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 các lớp với màn hình chính (ngăn xếp lớp) hoặc có tập hợp riêng của chúng. Không có VSYNC cho màn hình ảo, vì vậy VSYNC cho màn hình bên trong kích hoạt thành phần cho tất cả các màn hình.

Trên các triển khai HWC hỗ trợ chúng, các màn hình ảo có thể được kết hợp với OpenGL ES (GLES), HWC hoặc cả GLES và HWC. Khi 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

Các screenrecord lệnh cho phép người dùng mọi kỷ lục xuất hiện trên màn hình như một .mp4 tập tin trên đĩa. Để thực hiện điều này, hệ thống nhận các khung tổng hợp từ SurfaceFlinger, ghi chúng vào bộ mã hóa video, sau đó ghi dữ liệu video được mã hóa vào một tệp. Các codec video được quản lý bởi một quá trình riêng biệt ( mediaserver ), vì vậy bộ đệm đồ họa lớn phải di chuyển xung quanh hệ thống. Để làm cho nó khó khăn hơn, mục tiêu là quay video 60 khung hình / giây ở độ phân giải đầy đủ. Chìa khóa để làm cho việc này hoạt động hiệu quả là BufferQueue.

Các MediaCodec lớp cho phép một ứng dụng để cung cấp dữ liệu như byte liệu trong bộ đệm, hoặc thông qua một bề mặt. Khi screenrecord yêu cầu truy cập vào một bộ mã hóa video, mediaserver quá trình tạo ra một BufferQueue, kết nối riêng của mình về phía người tiêu dùng, sau đó đi nhà sản xuất phía sau để screenrecord như một bề mặt.

Các screenrecord tiện ích sau đó yêu cầu SurfaceFlinger để tạo ra một màn hình ảo gương màn hình chính (có nghĩa là, nó có tất cả các lớp giống nhau), và chỉ đạo nó để gửi ra bề mặt mà đến từ các mediaserver quá trình. Trong trường hợp này, SurfaceFlinger là nhà sản xuất bộ đệm hơn là người tiêu dùng.

Sau khi cấu hình xong, screenrecord trigger khi xuất hiện dữ liệu được mã hóa. Như các ứng dụng vẽ, bộ đệm của họ đi đến SurfaceFlinger, mà composite chúng vào một bộ đệm duy nhất được gửi trực tiếp đến bộ mã hóa video trong mediaserver quá trình. Các khung hình đầy đủ không bao giờ được nhìn thấy bởi các screenrecord quá trình. Bên trong, các mediaserver quá trình có cách riêng của mình di chuyển vùng đệm xung quanh đó cũng đi dữ liệu bằng cách xử lý, giảm thiểu chi phí.

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 tiêu dùng BufferQueue. Cũng có thể yêu cầu SurfaceFlinger tạo một màn hình ảo, 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 khép kín sẽ được tạo ra nơi màn hình tổng hợp xuất hiện trong một cửa sổ. Cửa sổ đó bây giờ là một phần của đầu ra tổng hợp, vì vậy trong lần làm mới tiếp theo, hình ảnh tổng hợp bên trong cửa sổ cũng hiển thị nội dung cửa sổ. Để thấy điều này trong hành động, cho phép tùy chọn nhà phát triển trong Cài đặt, chọn Simulate hiển thị thứ yếu, và cho phép một cửa sổ. Để xem màn hình thứ cấp trong hành động, sử dụng screenrecord để nắm bắt hành vi cho phép màn hình hiển thị sau đó chơi nó trở lại khung hình.