2009-08-07 3 views

ответ

174

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

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

+2

Проверьте ответ pierr, который содержит более подробную информацию. –

+3

Ответ официальной детали: http://developer.android.com/guide/topics/graphics/2d-graphics.html –

+0

Это уже не так просто. Проверьте ответ pierr; он имеет ссылку на подробный документ архитектуры (https://source.android.com/devices/graphics/architecture.html) и объясняет, почему аппаратное ускорение рендеринга Canvas может сделать пользовательский вид лучшим выбором. – fadden

40

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

+0

"Они используют больше ресурсов, хотя, так что вы не хотите использовать их, если вы не должны." - Кто использует больше ресурсов? Просмотры или SurfaceViews? – Dror

+6

Surfaceview использует больше ресурсов, чем виды –

+0

@RiteshGune сколько? –

92

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

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

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

+29

FYI ... A SurfaceView теперь может быть прозрачным: http://stackoverflow.com/questions/5391089/how-to-make-surfaceview-transparent – Steve

+4

Время прогрессирует! – Ralphleon

+0

@Ralphleon: Что вы имеете в виду под видом поверхности не может быть прозрачным? Могут ли другие виды перекрывать вид поверхности? Например, можно ли временно отображать ListView на поверхности? – Ashwin

62

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

ОК. У нас есть official document now.. Он говорил все, о чем я упомянул, в лучшем виде.


Подробнее here.

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

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

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

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

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

Из вашего ответа я чувствую, что лучше использовать класс, полученный из View, чем SurfaceView. Или я что-то ошибаюсь? Это было бы против большинства учебных пособий по разработке 2D игр. – Storm

+2

@Storm что-то, чтобы принять во внимание, заключается в том, что SurfaceView по дизайну не должен блокировать поток пользовательского интерфейса, где вид может быть изменен только с помощью потока пользовательского интерфейса. В большинстве игр SurfaceViews будет делать хороший бит рендеринга, который блокирует поток пользовательского интерфейса простым представлением. Это, по моему мнению, основное преимущество SurfaceView. – zgc7009

9

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

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

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

Но есть несколько технических Внутренности к SurfaceView:

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

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

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

0

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

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

Источник: Руководство Big Nerd Ranch

4

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

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

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

+0

Видео не найдено !! –

+0

исправлено ....... –

Смежные вопросы