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

211

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

Виктор
источник

Ответы:

210

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

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

Нико Гамулин
источник
2
Проверьте ответ Pierr, который содержит более подробную информацию.
Хелин Ван
4
Официальный подробный ответ: developer.android.com/guide/topics/graphics/2d-graphics.html
Хелин Ван
Это уже не так просто. Проверьте ответ Pierr; он содержит ссылку на документ с подробной архитектурой ( source.android.com/devices/graphics/architecture.html ) и объясняет, почему аппаратное ускорение рендеринга Canvas может сделать пользовательские представления лучшим выбором.
Fadden
1
Когда использовать FrameLayout для стековых представлений вместо SurfaceView?
Игорь Ганапольский
103

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

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

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

Ralphleon
источник
36
К вашему сведению ... SurfaceView теперь может быть прозрачным: stackoverflow.com/questions/5391089/…
Стив
@Ralphleon: Что вы подразумеваете под Surface Views не может быть прозрачным? Могут ли другие виды перекрывать вид поверхности? Например, я могу временно отобразить ListView на виде Surface?
Эшвин
78

обновлено 05.09.2014

ХОРОШО. У нас есть официальный документ сейчас. Это говорило все, что я упомянул, в лучшем виде.


Подробнее читайте здесь .

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

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

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

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

  • Время обновления отличается. Обычный механизм обновления представления является ограничением или управляется платформой: вы вызываете view.invalidateв потоке пользовательского интерфейса или view.postInvalidв другом потоке, чтобы указать платформе, что представление должно быть обновлено. Тем не менее, представление не будет обновлено немедленно, но дождитесь следующего события VSYNC. Простой подход к пониманию VSYNC состоит в том, чтобы рассмотреть его как таймер, который запускается каждые 16 мс для экрана со скоростью 60 кадров в секунду. В Android все обычные обновления просмотра (и отображения на самом деле, но я не буду говорить об этом сегодня) синхронизируются с VSYNC для достижения лучшей плавности. Теперь вернемся к SurfaceView, вы можете отобразить его в любое время по своему желанию. Тем не менее, я не могу сказать, является ли это преимуществом, так как дисплей также синхронизирован с VSYNC, как указано ранее.
pierrotlefou
источник
2
От вашего ответа я чувствую, что лучше использовать класс, производный от View, чем SurfaceView. Или я что-то не так делаю? Это было бы против большинства учебных пособий по разработке 2D-игр.
шторм
2
@Storm нужно учитывать, что дизайн SurfaceView не должен блокировать поток пользовательского интерфейса, где представление может быть изменено только потоком пользовательского интерфейса. В большинстве игр SurfaceViews будут выполнять рендеринг, который блокирует поток пользовательского интерфейса простым представлением. Насколько я понимаю, это основное преимущество SurfaceView.
zgc7009
Что вы подразумеваете под созданием потока рендеринга . Мы должны каждый раз создавать это вручную?
Игорь Ганапольский
44

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

jcoder
источник
«Они используют больше ресурсов, поэтому вы не хотите их использовать, если не обязаны». - Кто использует больше ресурсов? Виды или SurfaceViews?
Дрор
6
SurfaceView использовать больше ресурсов , чем просмотров
Ritesh гуне
1
@RiteshGune сколько?
Алекс Сифуэнтес
Когда мы должны ?
Игорь Ганапольский
12

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

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

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

Но есть несколько технических особенностей SurfaceView:

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

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

3. Поверхностный вид имеет выделенный surface buffer, так что это дороже

Сету Кумар Басак
источник
Почему важно ускорить аппаратное обеспечение ?
Игорь Ганапольский
8

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

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

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

Соменат Мухопадхяй
источник
0

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

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

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

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

Какая разница ... проверьте это простое объяснение в видео

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

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

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

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

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

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

SV может вызывать onDraw () выделенным потоком.

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

Такис ​​Дорис
источник