Perbedaan antara SurfaceView dan View?

211

Kapan itu perlu, atau lebih baik untuk menggunakan SurfaceViewbukan View?

Viktor
sumber

Jawaban:

210

Tampilan semuanya digambar pada utas GUI yang sama yang juga digunakan untuk semua interaksi pengguna.

Jadi, jika Anda perlu memperbarui GUI dengan cepat atau jika rendering terlalu banyak waktu dan memengaruhi pengalaman pengguna, gunakan SurfaceView.

Niko Gamulin
sumber
2
Periksa jawaban pierr yang berisi lebih detail.
Helin Wang
Tidak lagi sesederhana ini. Periksa jawaban pierr; ia memiliki tautan ke dokumen arsitektur terperinci ( source.android.com/devices/graphics/architecture.html ), dan menjelaskan mengapa akselerasi perangkat keras perenderan kanvas dapat membuat Tampilan khusus menjadi pilihan yang lebih baik.
fadden
1
Kapan menggunakan FrameLayout untuk menumpuk tampilan, alih-alih SurfaceView?
IgorGanapolsky
103

Beberapa hal yang saya perhatikan:

  • SurfaceViews berisi mekanisme rendering yang bagus yang memungkinkan utas untuk memperbarui konten permukaan tanpa menggunakan handler (bagus untuk animasi).
  • Tampilan permukaan tidak bisa transparan, mereka hanya bisa muncul di belakang elemen lain dalam hierarki tampilan.
  • Saya telah menemukan bahwa mereka lebih cepat untuk animasi daripada rendering ke View.

Untuk informasi lebih lanjut (dan contoh penggunaan yang bagus) lihat proyek LunarLander di bagian contoh SDK.

Ralphleon
sumber
36
FYI ... SurfaceView sekarang bisa transparan: stackoverflow.com/questions/5391089/...
Steve
@Ralphleon: Apa yang Anda maksud dengan Surface Views tidak bisa transparan? Bisakah tampilan lain tumpang tindih dengan tampilan Surface? Misalnya, dapatkah saya menampilkan ListView pada tampilan Permukaan sementara?
Ashwin
78

diperbarui 05/09/2014

BAIK. Kami memiliki dokumen resmi sekarang. Itu berbicara semua yang saya sebutkan, dengan cara yang lebih baik.


Baca lebih detail di sini .

Ya, perbedaan utama adalah surfaceView dapat diperbarui pada utas latar belakang. Namun, ada banyak lagi yang mungkin Anda pedulikan.

  • surfaceView telah mendedikasikan buffer permukaan sementara semua tampilan berbagi satu buffer permukaan yang dialokasikan oleh ViewRoot. Dengan kata lain, surfaceView membutuhkan lebih banyak sumber daya.

  • surfaceView tidak dapat dipercepat perangkat keras (pada JB4.2) sementara operasi 95% pada Tampilan normal adalah HW dipercepat menggunakan openGL ES.

  • Lebih banyak pekerjaan yang harus dilakukan untuk membuat surfaceView khusus Anda. Anda perlu mendengarkan Acara surfaceCreated / Destroy, membuat utas render, yang lebih penting, menyinkronkan utas render dan utas utama. Namun, untuk menyesuaikan Tampilan, yang perlu Anda lakukan adalah mengganti onDrawmetode.

  • Waktu untuk memperbarui berbeda. Mekanisme pembaruan tampilan normal dibatasi atau dikendalikan oleh kerangka kerja: Anda memanggil view.invalidateutas UI atau view.postInvalidutas lainnya untuk menunjukkan kepada kerangka kerja bahwa tampilan harus diperbarui. Namun, tampilan tidak akan segera diperbarui tetapi tunggu sampai acara VSYNC berikutnya tiba. Pendekatan mudah untuk memahami VSYNC adalah dengan menganggapnya sebagai penghitung waktu yang menyala setiap 16ms untuk layar 60fps. Di Android, semua pembaruan tampilan normal (dan tampilan sebenarnya tapi saya tidak akan berbicara hari ini), disinkronkan dengan VSYNC untuk mencapai kehalusan yang lebih baik. Sekarang, kembali ke surfaceView, Anda dapat merendernya kapan saja sesuai keinginan. Namun, saya hampir tidak dapat mengetahui apakah ini merupakan keuntungan, karena tampilan juga disinkronkan dengan VSYNC, seperti yang dinyatakan sebelumnya.
pierrotlefou
sumber
2
Dari jawaban Anda, saya merasa lebih baik menggunakan kelas yang berasal dari View daripada SurfaceView. Atau ada yang salah? Ini akan bertentangan dengan sebagian besar tutorial pengembangan game 2D.
Badai
2
@Storm sesuatu yang perlu dipertimbangkan adalah bahwa SurfaceView oleh desain seharusnya tidak memblokir UI Thread di mana View hanya dapat dimodifikasi oleh UI Thread. Pada sebagian besar game, SurfaceViews akan melakukan rendering yang baik yang akan memblokir UI Thread dengan tampilan sederhana. Itulah manfaat utama, dari pemahaman saya, tentang SurfaceView.
zgc7009
Apa yang Anda maksud dengan membuat utas render . Kami harus membuat ini secara manual setiap kali?
IgorGanapolsky
44

Perbedaan utama adalah bahwa SurfaceViewdapat ditarik oleh latar belakang tetapi Viewstidak bisa. SurfaceViewsgunakan lebih banyak sumber daya sehingga Anda tidak ingin menggunakannya kecuali Anda harus melakukannya.

jcoder
sumber
"Mereka menggunakan lebih banyak sumber daya sehingga kamu tidak ingin menggunakannya kecuali kamu harus melakukannya." - Siapa yang menggunakan lebih banyak sumber daya? Tampilan atau SurfaceViews?
Dror
6
Surfaceview menggunakan lebih banyak sumber daya daripada tampilan
Ritesh Gune
1
@RiteshGune berapa banyak?
Alex Sifuentes
Kapan kita harus melakukannya ?
IgorGanapolsky
12

A SurfaceViewadalah tampilan khusus di Android yang dapat digunakan untuk menggambar di dalamnya.

Perbedaan utama antara a Viewdan a SurfaceViewadalah bahwa View digambar dalam UI Thread, yang digunakan untuk semua interaksi pengguna.

Jika Anda ingin memperbarui UI dengan cukup cepat dan memberikan sejumlah informasi di dalamnya, SurfaceView adalah pilihan yang lebih baik.

Tetapi ada beberapa bagian teknis untuk SurfaceView:

1. Mereka bukan perangkat keras yang dipercepat.

2. Tampilan normal diberikan saat Anda memanggil metode invalidateatau postInvalidate(), tetapi ini tidak berarti tampilan akan segera diperbarui (A VSYNCakan dikirim, dan OS memutuskan kapan akan diperbarui. SurfaceViewDapat segera diperbarui.

3. SurfaceView memiliki dialokasikan surface buffer, jadi lebih mahal

Setu Kumar Basak
sumber
Mengapa perangkat keras dipercepat ?
IgorGanapolsky
8

Salah satu perbedaan utama antara tampilan permukaan dan tampilan adalah untuk menyegarkan layar untuk tampilan normal, kita harus memanggil metode yang tidak valid dari utas yang sama di mana tampilan didefinisikan. Tetapi bahkan jika kita menyebut tidak valid, penyegaran tidak terjadi segera. Ini terjadi hanya setelah kedatangan sinyal VSYNC berikutnya. Sinyal VSYNC adalah sinyal yang dihasilkan kernel yang terjadi setiap 16,6 ms atau ini juga dikenal sebagai 60 frame per detik. Jadi jika kita ingin lebih banyak kontrol atas penyegaran layar (misalnya untuk animasi yang bergerak sangat cepat), kita tidak boleh menggunakan kelas tampilan normal.

Di sisi lain dalam kasus tampilan permukaan, kita dapat menyegarkan layar secepat yang kita inginkan dan kita bisa melakukannya dari utas latar belakang. Jadi menyegarkan tampilan permukaan benar-benar tidak bergantung pada VSYNC, dan ini sangat berguna jika kita ingin melakukan animasi kecepatan tinggi. Saya punya beberapa video pelatihan dan contoh aplikasi yang menjelaskan semua hal ini dengan baik. Silakan lihat video pelatihan berikut.

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

somenath mukhopadhyay
sumber
0

Mengapa menggunakan SurfaceView dan bukan kelas View klasik ...

Salah satu alasan utama adalah SurfaceView dapat dengan cepat membuat layar.

Dengan kata sederhana, SV lebih mampu mengatur waktu dan membuat animasi.

Untuk lebih memahami apa itu SurfaceView, kita harus membandingkannya dengan kelas View.

Apa bedanya ... periksa penjelasan sederhana ini di video

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

Nah dengan View kita punya satu masalah besar .... waktu rendering animasi.

Biasanya onDraw () dipanggil dari sistem run-time Android.

Jadi, ketika sistem run-time Android memanggil onDraw () maka aplikasi tidak dapat mengontrol

waktu tampilan, dan ini penting untuk animasi. Kami memiliki celah waktu

antara aplikasi (game kami) dan sistem run-time Android.

SV dapat memanggil onDraw () oleh Thread khusus.

Jadi: aplikasi mengontrol waktu. Jadi kita dapat menampilkan gambar bitmap animasi berikutnya.

Takis Doris
sumber