SurfaceView ve View arasındaki fark?


Yanıtlar:


210

Görünümlerin tümü, tüm kullanıcı etkileşimi için de kullanılan aynı GUI iş parçacığında çizilir.

Dolayısıyla, GUI'yi hızlı bir şekilde güncellemeniz gerekiyorsa veya oluşturma işlemi çok fazla zaman alıyorsa ve kullanıcı deneyimini etkiliyorsa kullanın SurfaceView.


2
Daha fazla ayrıntı içeren pierr'ın cevabını kontrol edin.
Helin Wang


Artık bu kadar basit değil. Pierr'in cevabını kontrol edin; ayrıntılı mimari dokümanı ( source.android.com/devices/graphics/architecture.html ) bir bağlantısı vardır ve Kanvas oluşturmanın donanım hızlandırmasının neden özel Görünümleri daha iyi bir seçim haline getirebileceğini açıklar.
Fadden

1
SurfaceView yerine görünümleri yığınlamak için FrameLayout ne zaman kullanılır?
IgorGanapolsky

103

Belirttiğim birkaç şey:

  • SurfaceViews iş parçacıklarının bir işleyici kullanmadan yüzeyin içeriğini güncellemesine izin veren güzel bir oluşturma mekanizması içerir (animasyon için iyi).
  • Surfaceviews olamaz , şeffaf olması onlar sadece görünümü hiyerarşisinde diğer elemanları geride görünebilir.
  • Animasyon için bir Görünüme dönüştürmekten çok daha hızlı olduklarını gördüm.

Daha fazla bilgi (ve harika bir kullanım örneği) için SDK'nın örnekler bölümündeki LunarLander projesine bakın.


36
Bilginize ... Bir SurfaceView artık şeffaf olabilir: stackoverflow.com/questions/5391089/…
Steve

@Ralphleon: Yüzey Görünümleri ile ne ifade edilemez? Diğer görünümler Yüzey görünümüyle çakışabilir mi? Örneğin, geçici olarak bir Yüzey Görünümünde bir ListView görüntüleyebilir miyim?
Ashwin

78

güncellendi 05/09/2014

TAMAM. Şimdi resmi bir belgemiz var . Bahsettiğim her şeyi daha iyi konuştu.


Daha ayrıntılı bilgi için burayı okuyun .

Evet, ana fark surfaceView arka plan iş parçacığında güncellenebilir olmasıdır. Ancak, daha fazla umursabilirsiniz.

  • surfaceView ayırma yüzey arabelleğine sahipken, tüm görünüm ViewRoot tarafından ayrılan bir yüzey arabelleğini paylaşır. Başka bir deyişle, surfaceView daha fazla kaynağa mal olur.

  • surfaceView donanım hızlandırılamaz (JB4.2 itibariyle) normal Görünümdeki% 95 işlemler openGL ES kullanılarak HW hızlandırılır.

  • Özel yüzey görünümünüzü oluşturmak için daha fazla çalışma yapılmalıdır. SurfaceCreated / Destroy Event'i dinlemeniz, bir render iş parçacığı oluşturmanız, daha da önemlisi, render iş parçacığını ve ana iş parçacığını senkronize etmeniz gerekir. Ancak, Görünümü özelleştirmek için tek yapmanız gereken geçersiz kılmaktıronDraw yöntemidir.

  • Güncelleme zamanı farklı. Normal görünüm güncelleme mekanizması çerçeve tarafından kısıtlanır veya denetlenir: Çerçevenin güncellenmesi gerektiğini belirtmek için view.invalidateUI iş parçacığını veya view.postInvalidbaşka bir iş parçacığını ararsınız. Ancak, görünüm hemen güncellenmez, ancak bir sonraki VSYNC etkinliği gelene kadar bekleyin. VSYNC'yi anlamanın kolay yaklaşımı, her 60 saniyede bir 60 fps ekran için bir zamanlayıcı olarak düşünmektir. Android'de, tüm normal görünüm güncellemeleri (ve aslında görüntüleme ancak bugün konuşmayacağım), daha iyi pürüzsüzlük elde etmek için VSYNC ile senkronize edilir. Şimdi surfaceView'e geri döndüğünüzde, istediğiniz zaman oluşturabilirsiniz. Ancak, ekranın daha önce belirtildiği gibi VSYNC ile de senkronize olduğundan, bunun bir avantaj olup olmadığını anlayamıyorum.

2
Cevabınızdan, ViewView'dan türetilmiş bir sınıfı kullanmanın SurfaceView'den daha iyi olduğunu hissediyorum. Yoksa yanlış bir şey mi alıyorum? Bu, 2D oyun geliştirme eğiticilerinin çoğuna karşı olacaktır.
Fırtına

2
Dikkate alınması gereken bir şey fırtınası, bir SurfaceView tasarımına göre, bir Görünümün yalnızca UI İş Parçacığı tarafından değiştirilebileceği UI İş Parçasını engellememesi gerektiğidir. Çoğu oyunda SurfaceViews, UI İş Parçasını basit bir görünümle engelleyecek iyi bir oluşturma işlemi yapacak. Bu, SurfaceView'un benim anlayışımdan birincil faydası.
zgc7009

Bir render iş parçacığı oluşturmakla ne demek istiyorsun . Bunu her seferinde manuel olarak mı oluşturmak zorundayız?
IgorGanapolsky

44

Temel fark SurfaceViewarka plan kalınlıklarıyla çizilebileceği, ancak Viewsyapılamadığıdır. SurfaceViewsdaha fazla kaynak kullanın, böylece gerekmedikçe kullanmak istemezsiniz.


"Yine de daha fazla kaynak kullanıyorlar, böylece gerekmedikçe kullanmak istemiyorsunuz." - Kim daha fazla kaynak kullanıyor? Görünümler veya SurfaceViews?
Dror

6
Surfaceview görüntüleme sayısından daha fazla kaynak kullanıyor
Ritesh Gune

1
@RiteshGune ne kadar?
Alex Sifuentes

Ne zaman ihtiyacımız var ?
IgorGanapolsky

12

A SurfaceView, Android'de içine çizmek için kullanılabilecek özel bir görünümdür.

A Viewve a arasındaki temel fark , tüm kullanıcı etkileşimi için kullanılan SurfaceViewbir Görünüm'ün çizilmesidir UI Thread.

Kullanıcı arayüzünü yeterince hızlı bir şekilde güncellemek ve içinde iyi miktarda bilgi oluşturmak istiyorsanız, SurfaceView daha iyi bir seçimdir.

Ancak, aşağıdakilerle ilgili birkaç teknik iç var SurfaceView:

1. Donanım hızlandırması yapılmaz.

2. Eğer yöntemler aramak için normal görünümler oluşturulur invalidateveya postInvalidate(), ancak bu görünüm hemen güncellenecektir anlamına gelmez (A VSYNCgönderilecektir ve güncellendiğinde OS karar verir. SurfaceViewHemen güncellenebilir.

3. Bir SurfaceView vardır tahsis surface buffer, bu yüzden daha pahalı


Donanımın hızlandırılması neden önemlidir ?
IgorGanapolsky

8

Yüzey görünümü ve görünüm arasındaki ana farklardan biri, ekranı normal bir görünüm için yenilemek için, görünümün tanımlandığı aynı iş parçacığından geçersiz kılma yöntemini çağırmamız gerektiğidir. Ancak geçersiz kılsa bile, canlandırma hemen gerçekleşmez. Sadece VSYNC sinyalinin bir sonraki gelişinden sonra ortaya çıkar. VSYNC sinyali, her 16,6 ms'de bir çekirdek tarafından üretilen bir sinyaldir veya bu saniyede 60 kare olarak da bilinir. Dolayısıyla, ekranın yenilenmesi üzerinde daha fazla kontrol istersek (örneğin, çok hızlı hareket eden animasyonlar için), normal görünüm sınıfını kullanmamalıyız.

Öte yandan, yüzey görünümü durumunda, ekranı istediğimiz kadar hızlı bir şekilde yenileyebilir ve bir arka plan iş parçacığından yapabiliriz. Dolayısıyla, yüzey görüntüsünün yenilenmesi gerçekten VSYNC'ye bağlı değildir ve yüksek hızlı animasyon yapmak istiyorsak bu çok yararlıdır. Tüm bunları güzel açıklayan birkaç eğitim videosu ve örnek uygulama var. Lütfen aşağıdaki eğitim videolarına bir göz atın.

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8


0

Klasik View sınıfını değil neden SurfaceView kullanıyorsunuz?

Bunun temel nedenlerinden biri SurfaceView'in ekranı hızlı bir şekilde oluşturabilmesidir.

Basit bir deyişle, bir SV zamanlamayı yönetme ve animasyonları oluşturma konusunda daha yeteneklidir.

SurfaceView'un ne olduğunu daha iyi anlamak için onu View sınıfıyla karşılaştırmamız gerekir.

Fark nedir ... videodaki bu basit açıklamayı kontrol edin

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

Peki View ile büyük bir sorunumuz var .... animasyon oluşturma zamanlaması.

Normalde onDraw () işlevi Android çalışma zamanı sisteminden çağrılır.

Bu nedenle, Android çalışma zamanı sistemi onDraw () öğesini çağırdığında uygulama kontrol edemez

ekranın zamanlaması ve bu animasyon için önemlidir. Zamanlama boşluğumuz var

(oyunumuz) ve Android çalışma zamanı sistemi arasında.

Özel bir iş parçacığı tarafından onDraw () çağırabileceği SV.

Böylece: uygulama zamanlamayı kontrol eder. Böylece animasyonun bir sonraki bitmap görüntüsünü gösterebiliriz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.