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

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

175
задан Viktor 07 авг. '09 в 10:31
источник поделиться

7 ответов

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

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

173
ответ дан Niko Gamulin 07 авг. '09 в 10:36
источник поделиться

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

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

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

92
ответ дан Ralphleon 10 авг. '09 в 0:09
источник поделиться

обновлено 05/09/2014

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


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

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

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

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

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

  • Время для обновления отличается. Механизм обновления обычного вида ограничивает или контролирует структуру: вы вызываете view.invalidate в потоке пользовательского интерфейса или view.postInvalid в другом потоке, чтобы указать инфраструктуре, что представление должно быть обновлено. Однако представление не будет обновляться немедленно, но дождитесь следующего события VSYNC. Легкий подход к пониманию VYSNC заключается в том, чтобы рассматривать его как таймер, который запускает каждые 16 мс для экрана 60 кадров в секунду. В Android все нормальное обновление (и отображение на самом деле, но я не буду говорить сегодня), синхронизируется с VSYNC для достижения большей гладкости. Теперь, обратно в surfaceView, вы можете отображать его в любое время по своему усмотрению. Однако я не могу сказать, является ли это преимуществом, поскольку дисплей также синхронизируется с VSNC, как указано ранее.
59
ответ дан pierrotlefou 14 апр. '13 в 6:08
источник поделиться

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

38
ответ дан jcoder 07 авг. '09 в 10:34
источник поделиться

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

Основное различие между a View и a SurfaceView состоит в том, что в UI Thread, который используется для всего пользовательского взаимодействия. Если вы хотите быстро обновить интерфейс и предоставить хороший объем информации в это, SurfaceView - лучший выбор.

Но есть несколько технических аспектов для SurfaceView:

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

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

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

8
ответ дан setu basak 09 февр. '16 в 19:20
источник поделиться

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

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

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

2
ответ дан somenath mukhopadhyay 18 авг. '17 в 3:25
источник поделиться

Другое определение:

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

Источник: The Big Nerd Ranch Guide

0
ответ дан Mina Gabriel 29 марта '16 в 22:30
источник поделиться

Другие вопросы по меткам