Bề mặt và bề mặt

Các đối tượng bề mặt cho phép các ứng dụng hiển thị hình ảnh để hiển thị trên màn hình. Giao diện SurfaceHolder cho phép ứng dụng chỉnh sửa và kiểm soát bề mặt.

Mặt

Bề mặt là giao diện để người sản xuất trao đổi bộ đệm với người tiêu dùng.

BufferQueue cho một bề mặt hiển thị thường được định cấu hình để đệm ba lần. Bộ đệm được phân bổ theo yêu cầu, vì vậy nếu nhà sản xuất tạo bộ đệm đủ chậm, chẳng hạn như ở tốc độ 30 khung hình / giây trên màn hình 60 khung hình / giây, có thể chỉ có hai bộ đệm được phân bổ trong hàng đợi. Phân bổ bộ đệm theo yêu cầu giúp giảm thiểu tiêu thụ bộ nhớ. Bạn có thể xem tóm tắt về các bộ đệm được liên kết với mọi lớp trong kết dumpsys SurfaceFlinger xuất.

Hầu hết các máy khách kết xuất trên các bề mặt bằng OpenGL ES hoặc Vulkan . Tuy nhiên, một số máy khách kết xuất trên các bề mặt bằng canvas.

Kết xuất canvas

Việc triển khai canvas được cung cấp bởi Skia Graphics Library . Nếu bạn muốn vẽ một hình chữ nhật, bạn gọi API Canvas, API này đặt các byte trong bộ đệm một cách thích hợp. Để đảm bảo rằng một bộ đệm không được cập nhật bởi hai máy khách cùng một lúc hoặc được ghi vào khi đang được hiển thị, hãy khóa bộ đệm để truy cập nó. Sử dụng các lệnh sau để làm việc với khóa canvas:

  • lockCanvas() khóa bộ đệm để hiển thị trên CPU và trả về một Canvas để sử dụng để vẽ.
  • unlockCanvasAndPost() mở khóa bộ đệm và gửi nó đến trình tổng hợp.
  • lockHardwareCanvas() khóa bộ đệm để hiển thị trên GPU và trả về một canvas để sử dụng cho việc vẽ.

Lần đầu tiên nhà sản xuất yêu cầu bộ đệm từ BufferQueue, bộ đệm được cấp phát và khởi tạo bằng 0. Việc khởi tạo là cần thiết để tránh vô tình chia sẻ dữ liệu giữa các tiến trình. Tuy nhiên, nếu bạn sử dụng lại một bộ đệm, nội dung trước đó vẫn còn. Nếu bạn liên tục gọi lockCanvas()unlockCanvasAndPost() mà không vẽ bất cứ thứ gì, trình sản xuất sẽ luân chuyển giữa các khung được kết xuất trước đó.

Mã khóa / mở khóa bề mặt giữ một tham chiếu đến bộ đệm được kết xuất trước đó. Nếu bạn chỉ định một vùng bẩn khi khóa bề mặt, nó sẽ sao chép các pixel bẩn từ bộ đệm trước đó. SurfaceFlinger hoặc HWC thường xử lý bộ đệm; nhưng vì chúng ta chỉ cần đọc từ bộ đệm, nên không cần phải đợi quyền truy cập độc quyền.

SurfaceHolder

SurfaceHolder là một giao diện mà hệ thống sử dụng để chia sẻ quyền sở hữu bề mặt với các ứng dụng. Một số ứng dụng khách làm việc với bề mặt muốn có SurfaceHolder, vì các API để lấy và thiết lập các thông số bề mặt được thực hiện thông qua SurfaceHolder. Một SurfaceView chứa một SurfaceHolder.

Hầu hết các thành phần tương tác với một khung nhìn đều liên quan đến SurfaceHolder. Một số API khác, chẳng hạn như MediaCodec, tự hoạt động trên bề mặt.