Ответы:
Все представления отображаются в одном потоке графического интерфейса, который также используется для всех действий пользователя.
Поэтому, если вам нужно быстро обновить графический интерфейс или если рендеринг занимает слишком много времени и влияет на работу пользователя, используйте SurfaceView
.
Несколько вещей, которые я отметил:
Для получения дополнительной информации (и отличного примера использования) обратитесь к проекту LunarLander в разделе примеров SDK.
обновлено 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, как указано ранее.Основное отличие состоит в том, что они SurfaceView
могут быть нарисованы фоновыми тэдами, но Views
не могут.
SurfaceViews
использовать больше ресурсов, поэтому вы не хотите использовать их, если вам не нужно.
A SurfaceView
- это пользовательский вид в Android, который можно использовать для рисования внутри него.
Основное различие между a View
и a SurfaceView
состоит в том, что представление рисуется в
UI Thread
, который используется для всего взаимодействия с пользователем.
Если вы хотите достаточно быстро обновить пользовательский интерфейс и отобразить в нем большое количество информации, лучше выбрать SurfaceView.
Но есть несколько технических особенностей SurfaceView
:
1. Они не аппаратно ускорены.
2. Нормальные представления отображаются при вызове методов invalidate
или postInvalidate()
, но это не означает, что представление будет немедленно обновлено ( VSYNC
будет отправлено A , и ОС решит, когда оно будет обновлено. SurfaceView
Может быть немедленно обновлено.
3. Поверхностный вид имеет выделенный surface buffer
, так что это дороже
Одно из основных различий между видом поверхности и видом заключается в том, что для обновления экрана для обычного вида мы должны вызвать метод invalidate из того же потока, в котором вид определен. Но даже если мы назовем Аннулировать, обновление не происходит сразу. Это происходит только после следующего поступления сигнала VSYNC. Сигнал VSYNC - это сигнал, сгенерированный ядром, который происходит каждые 16,6 мс или он также известен как 60 кадров в секунду. Поэтому, если мы хотим больше контроля над обновлением экрана (например, для очень быстро движущейся анимации), мы не должны использовать обычный класс представления.
С другой стороны, в случае просмотра поверхности, мы можем обновить экран так быстро, как мы хотим, и мы можем сделать это из фонового потока. Таким образом, обновление вида поверхности действительно не зависит от VSYNC, и это очень полезно, если мы хотим сделать высокоскоростную анимацию. У меня есть несколько обучающих видео и примеры приложений, которые хорошо объясняют все эти вещи. Пожалуйста, посмотрите на следующие обучающие видео.
Зачем использовать SurfaceView, а не классический класс View ...
Одна из основных причин заключается в том, что SurfaceView может быстро визуализировать экран.
Проще говоря, SV более способен управлять синхронизацией и рендерингом анимации.
Чтобы лучше понять, что такое SurfaceView, мы должны сравнить его с классом View.
Какая разница ... проверьте это простое объяснение в видео
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
Что ж, с View у нас есть одна серьезная проблема ... время рендеринга анимации.
Обычно onDraw () вызывается из системы времени выполнения Android.
Поэтому, когда система времени выполнения Android вызывает onDraw (), приложение не может контролировать
время показа, и это важно для анимации. У нас есть промежуток времени
между приложением (нашей игрой) и системой выполнения Android.
SV может вызывать onDraw () выделенным потоком.
Таким образом: приложение контролирует время. Таким образом, мы можем отобразить следующее растровое изображение анимации.