Google стремится продвигать расовую справедливость для черных сообществ. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Поверхность и Поверхность

Поверхностные объекты позволяют приложениям отображать изображения на экранах. Интерфейсы SurfaceHolder позволяют приложениям редактировать и контролировать поверхности.

поверхность

Поверхность - это интерфейс для производителя для обмена буферами с потребителем.

BufferQueue для поверхности дисплея обычно настроен на тройную буферизацию. Буферы распределяются по требованию, поэтому, если производитель генерирует буферы достаточно медленно, например, при 30 кадрах в секунду на дисплее 60 кадров в секунду, в очереди может быть только два выделенных буфера. Выделение буферов по требованию помогает минимизировать потребление памяти. Вы можете увидеть сводку буферов, связанных с каждым слоем, в dumpsys SurfaceFlinger .

Большинство клиентов визуализируют на поверхности, используя OpenGL ES или Vulkan . Однако некоторые клиенты рендерится на поверхности, используя холст.

Визуализация холста

Реализация холста обеспечивается Графической библиотекой Skia . Если вы хотите нарисовать прямоугольник, вы вызываете API Canvas, который соответствующим образом устанавливает байты в буфере. Чтобы буфер не обновлялся двумя клиентами одновременно или не записывался во время отображения, заблокируйте буфер для доступа к нему. Используйте следующие команды для работы с блокировками холста:

  • lockCanvas() блокирует буфер для рендеринга на CPU и возвращает Canvas для рисования.
  • unlockCanvasAndPost() разблокирует буфер и отправляет его композитору.
  • lockHardwareCanvas() блокирует буфер для рендеринга на графическом процессоре и возвращает холст, используемый для рисования.

В первый раз, когда производитель запрашивает буфер из BufferQueue, буфер выделяется и инициализируется нулем. Инициализация необходима, чтобы избежать случайного обмена данными между процессами. Однако, если вы повторно используете буфер, предыдущее содержимое все еще присутствует. Если вы неоднократно вызываете lockCanvas() и unlockCanvasAndPost() без рисования чего-либо, производитель выполняет циклическое переключение между ранее отображенными кадрами.

Код блокировки / разблокировки поверхности сохраняет ссылку на ранее обработанный буфер. Если при блокировке поверхности вы указали грязную область, она скопирует незапятнанные пиксели из предыдущего буфера. SurfaceFlinger или HWC обычно обрабатывают буфер; но поскольку нам нужно только читать из буфера, нет необходимости ждать эксклюзивного доступа.

SurfaceHolder

SurfaceHolder - это интерфейс, используемый системой для совместного использования прав владения поверхностями с приложениями. Некоторые клиенты, которые работают с поверхностями, хотят SurfaceHolder, потому что API для получения и установки параметров поверхности реализованы через SurfaceHolder. SurfaceView содержит SurfaceHolder.

Большинство компонентов, которые взаимодействуют с представлением, включают SurfaceHolder. Некоторые другие API, такие как MediaCodec, работают на самой поверхности.