Разница между SurfaceView и View? - PullRequest
       21

Разница между SurfaceView и View?

201 голосов
/ 07 августа 2009

Когда это необходимо или лучше использовать SurfaceView вместо View?

Ответы [ 7 ]

203 голосов
/ 07 августа 2009

Все представления отображаются в одном и том же потоке графического интерфейса, который также используется для всего взаимодействия с пользователем.

Так что, если вам нужно быстро обновить графический интерфейс или если рендеринг занимает слишком много времени и влияет на работу пользователя, используйте SurfaceView.

100 голосов
/ 10 августа 2009

Несколько вещей, которые я заметил:

  • SurfaceViews содержат хороший механизм рендеринга, который позволяет потокам обновлять содержимое поверхности без использования обработчика (хорошо для анимации).
  • Поверхностные виды не могут быть прозрачными, они могут появляться только за другими элементами в иерархии видов.
  • Я обнаружил, что они намного быстрее для анимации, чем рендеринг в View.

Для получения дополнительной информации (и отличного примера использования) обратитесь к проекту LunarLander в SDK раздел примеров.

76 голосов
/ 14 апреля 2013

обновлено 05.09.2014

OK. У нас есть официальный документ. В нем сказано все, что я упомянул, в лучшем виде.


Подробнее здесь .

Да, основное отличие заключается в том, что SurfaceView можно обновлять в фоновом потоке. Тем не менее, есть еще кое-что, что вас может волновать.

  • SurfaceView имеет выделенный поверхностный буфер, в то время как все представление разделяет один поверхностный буфер, который выделяется ViewRoot. Другими словами, SurfaceView стоит больше ресурсов.

  • SurfaceView не может быть аппаратно ускорен (по состоянию на JB4.2), в то время как 95% операций в обычном View ускоряются HW с использованием openGL ES.

  • Необходимо проделать дополнительную работу для создания вашего настроенного SurfaceView. Вам необходимо прослушать событие SurfaceCreated / Destroy, создать поток рендеринга, что более важно, синхронизировать поток рендеринга и основной поток. Однако, чтобы настроить представление, все, что вам нужно сделать, это переопределить метод onDraw.

  • Время обновления отличается. Обычный механизм обновления представления является ограничением или управляется платформой: вы вызываете view.invalidate в потоке пользовательского интерфейса или view.postInvalid в другом потоке, чтобы указать платформе, что представление должно быть обновлено. Тем не менее, представление не будет обновлено немедленно, но дождитесь следующего события VSYNC. Простой подход к пониманию VSYNC состоит в том, чтобы рассмотреть его как таймер, который запускается каждые 16 мс для экрана со скоростью 60 кадров в секунду. В Android все обычные обновления просмотра (и отображения на самом деле, но я не буду говорить сегодня) синхронизируются с VSYNC для достижения лучшей плавности. Теперь вернемся к SurfaceView, вы можете отобразить его в любое время. Тем не менее, я не могу сказать, является ли это преимуществом, поскольку дисплей также синхронизируется с VSYNC, как указано ранее.
43 голосов
/ 07 августа 2009

Основное отличие состоит в том, что SurfaceView может быть нарисовано фоновыми жабами, а Views - нет. SurfaceViews используйте больше ресурсов, поэтому вы не захотите их использовать, если вам не нужно.

12 голосов
/ 09 февраля 2016

A SurfaceView - это пользовательское представление в Android, которое можно использовать для рисования внутри него.

Основное различие между View и SurfaceView заключается в том, что представление отображается в UI Thread, который используется для всего взаимодействия с пользователем.

Если вы хотите достаточно быстро обновить пользовательский интерфейс и предоставить большое количество информации в это, SurfaceView является лучшим выбором.

Но у SurfaceView есть несколько технических деталей:

1. Они не аппаратно ускоряются.

2. Обычные представления отображаются при вызове методов invalidate или postInvalidate(), но это не означает, что представление будет немедленно обновляется (A VSYNC будет отправлено, и ОС решит, когда это обновляется. SurfaceView может быть немедленно обновлено.

3. SurfaceView имеет выделенный surface buffer, поэтому он более дорогой

7 голосов
/ 18 августа 2017

Одно из основных отличий между видом поверхности и видом заключается в том, что для обновления экрана для обычного вида мы должны вызвать метод invalidate из того же потока, в котором определен вид. Но даже если мы назовем Аннулировать, обновление не происходит сразу. Это происходит только после следующего поступления сигнала VSYNC. Сигнал VSYNC - это сигнал, сгенерированный ядром, который происходит каждые 16,6 мс или он также известен как 60 кадров в секунду. Поэтому, если мы хотим больше контролировать обновление экрана (например, для очень быстро движущейся анимации), нам не следует использовать класс обычного представления.

С другой стороны, в случае просмотра поверхности мы можем обновлять экран так быстро, как нам хочется, и мы можем делать это из фонового потока. Таким образом, обновление вида поверхности действительно не зависит от VSYNC, и это очень полезно, если мы хотим делать высокоскоростную анимацию. У меня есть несколько обучающих видео и примеры приложений, которые хорошо объясняют все эти вещи. Пожалуйста, посмотрите на следующие обучающие видео.

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

0 голосов
/ 24 октября 2018

Зачем использовать SurfaceView, а не классический класс View ...

Одной из основных причин является то, что SurfaceView может быстро визуализировать экран.

Проще говоря, SV более способен управлять синхронизацией и рендерингом анимации.

Чтобы лучше понять, что такое SurfaceView, мы должны сравнить его с классом View.

В чем разница ... посмотрите это простое объяснение в видео

https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30

Что касается View, у нас есть одна серьезная проблема ... время рендеринга анимации.

Обычно onDraw () вызывается из системы времени выполнения Android.

Итак, когда система времени выполнения Android вызывает onDraw (), приложение не может управлять

время показа, а это важно для анимации. У нас есть промежуток времени

между приложением (нашей игрой) и системой выполнения Android.

SV может вызывать onDraw () с помощью специального потока.

Таким образом: приложение контролирует время. Таким образом, мы можем отобразить следующее растровое изображение анимации.

...