Різниця між SurfaceView і Переглядом?


Відповіді:


210

Усі представлення зображуються на одній темі GUI, яка також використовується для взаємодії з користувачами.

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


2
Перевірте відповідь пірра, яка містить більше деталей.
Хелін Ван

4
Офіційна детальна відповідь: developer.android.com/guide/topics/graphics/2d-graphics.html
Хелін Ван

Це вже не зовсім так просто. Перевір відповідь пірра; він містить посилання на детальний документ архітектури ( source.android.com/devices/graphics/architecture.html ), і пояснює, чому апаратне прискорення надання Canvas може зробити власні подання кращим вибором.
вівден

1
Коли використовувати FrameLayout для складання переглядів, а не SurfaceView?
ІгорГанапольський

103

Я зазначив кілька речей:

  • SurfaceViews містить приємний механізм візуалізації, який дозволяє потокам оновлювати вміст поверхні без використання обробника (добре для анімації).
  • Поверхні огляду не можуть бути прозорими, вони можуть відображатися лише за іншими елементами в ієрархії подання.
  • Я виявив, що вони набагато швидші для анімації, ніж візуалізація на Перегляд.

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


36
FYI ... Тепер SurfaceView може бути прозорим: stackoverflow.com/questions/5391089/…
Стів

@Ralphleon: Що ви маєте на увазі під виглядом поверхні, не може бути прозорим? Чи можуть інші види перекривати перегляд поверхні? Наприклад, чи можу я тимчасово відображати ListView у поданні Поверхня?
Ешвін

78

оновлено 09.09.2014

ГАРАЗД. Зараз у нас є офіційний документ. Це говорило все, що я згадав, кращим чином.


Детальніше читайте тут .

Так, головна відмінність полягає в тому, що поверхню ViewView можна оновити на фоновому потоці. Однак є більше, що може вас хвилювати.

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

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

  • Більше роботи потрібно зробити, щоб створити індивідуальний поверхневий погляд. Вам потрібно прослухати подію surfaceCreate / Destroy, створити нитку візуалізації, що ще важливіше, синхронізувати нитку візуалізації та основну нитку. Однак, щоб налаштувати Вигляд, все, що вам потрібно зробити, - це onDrawметод переопределення .

  • Час оновлення різний. Механізм оновлення звичайного перегляду обмежує або керує фреймворком: Ви викликаєте view.invalidateпотік інтерфейсу або view.postInvalidінший потік, щоб вказати рамці, що подання має бути оновлено. Однак перегляд не буде оновлюватися негайно, але зачекайте, поки надійде наступна подія VSYNC. Простий підхід для розуміння VSYNC полягає в тому, щоб вважати, що це таймер, який запускається кожні 16 мс для екрана з 60 кадрів в секунду. В Android все звичайне оновлення перегляду (а відображення насправді, але я не говорю це сьогодні) синхронізується з VSYNC для досягнення кращої плавності. Тепер, повернувшись до поверхніView, ви можете візуалізувати його будь-коли за своїм бажанням. Однак я навряд чи можу сказати, чи є це перевагою, оскільки дисплей також синхронізований з VSYNC, як зазначено раніше.

2
З вашої відповіді я розумію, що краще використовувати клас, похідний від View, ніж SurfaceView. Або я щось помиляюсь? Це було б протилежним до більшості навчальних посібників з розробки 2D ігор.
Буря

2
@Storm, що варто враховувати, - це те, що SurfaceView за дизайном не повинен блокувати потоки інтерфейсу користувача, де вид може бути змінений лише потоком інтерфейсу користувача. У більшості ігор SurfaceViews буде робити трохи рендерінга, який заблокує інтерфейс інтерфейсу користувача за допомогою простого перегляду. Це, з мого розуміння, головна користь SurfaceView.
zgc7009

Що ви маєте на увазі під створенням потоку візуалізації . Ми повинні створювати це вручну кожен раз?
ІгорГанапольський

44

Основна відмінність полягає в тому, що SurfaceViewїх можна намалювати на фонових шаблонах, але Viewsне можна. SurfaceViewsвикористовуйте більше ресурсів, хоча тому ви не хочете використовувати їх, якщо не доведеться.


"Вони використовують більше ресурсів, хоча ви не хочете користуватися ними, якщо не потрібно". - Хто використовує більше ресурсів? Перегляди чи SurfaceViews?
Дрор

6
Surfaceview використовує більше ресурсів, ніж переглядів
Ritesh Gune

1
@RiteshGune скільки?
Алекс Сіфуентес

Коли ми повинні ?
ІгорГанапольський

12

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

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

Якщо ви хочете оновити інтерфейс користувача досить швидко і надати в ньому багато інформації, SurfaceView - кращий вибір.

Але є кілька технічних нутрощів SurfaceView:

1. Вони не апаратні прискорені.

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

3. SurfaceView має виділений surface buffer, тому це дорожче


Чому важливо прискорити апаратне забезпечення ?
ІгорГанапольський

8

Однією з головних відмінностей між поверхневим переглядом і переглядом є те, що для оновлення екрана для нормального перегляду нам потрібно викликати метод недійсного з тієї ж нитки, де визначено подання. Але навіть якщо ми називаємо недійсним, оновлення відбувається не відразу. Це відбувається лише після наступного надходження сигналу 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

Добре із представленням у нас є одна головна проблема .... терміни надання анімації.

Зазвичай onDraw () викликається з системи запуску Android.

Отже, коли система запуску Android запускає функцію onDraw (), програма не може контролювати

час відображення, і це важливо для анімації. У нас є розрив у термінах

між додатком (нашою грою) та системою запуску Android.

SV, який він може викликати onDraw (), спеціальною темою.

Таким чином: програма контролює терміни. Таким чином ми можемо відобразити наступне растрове зображення анімації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.