Kapan itu perlu, atau lebih baik untuk menggunakan SurfaceView
bukan View
?
211
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
.
Beberapa hal yang saya perhatikan:
Untuk informasi lebih lanjut (dan contoh penggunaan yang bagus) lihat proyek LunarLander di bagian contoh SDK.
sumber
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
onDraw
metode.view.invalidate
utas UI atauview.postInvalid
utas 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.sumber
Perbedaan utama adalah bahwa
SurfaceView
dapat ditarik oleh latar belakang tetapiViews
tidak bisa.SurfaceViews
gunakan lebih banyak sumber daya sehingga Anda tidak ingin menggunakannya kecuali Anda harus melakukannya.sumber
A
SurfaceView
adalah tampilan khusus di Android yang dapat digunakan untuk menggambar di dalamnya.Perbedaan utama antara a
View
dan aSurfaceView
adalah bahwa View digambar dalamUI 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
invalidate
ataupostInvalidate()
, tetapi ini tidak berarti tampilan akan segera diperbarui (AVSYNC
akan dikirim, dan OS memutuskan kapan akan diperbarui.SurfaceView
Dapat segera diperbarui.3. SurfaceView memiliki dialokasikan
surface buffer
, jadi lebih mahalsumber
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
sumber
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.
sumber