Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kesintisiz animasyonlar, yüksek kare hızı ve yüksek performanslı medya yakalama ve kayıttan yürütme ile WinUI uygulamaları oluşturun.
Animasyonları sorunsuz hale getirme
WinUI uygulamalarının önemli özelliklerinden biri sorunsuz etkileşimlerdir. Bu, "parmağınıza yapışan" dokunma manipülasyonlarını, düzgün geçişleri ve animasyonları ve giriş geri bildirimi sağlayan küçük hareketleri içerir. XAML çerçevesinde, bir uygulamanın görsel öğelerinin bileşimine ve animasyonuna ayrılmış oluşturma iş parçacığı adlı bir iş parçacığı vardır. Oluşturma iş parçacığı ui iş parçacığından (çerçeve ve geliştirici kodu çalıştıran iş parçacığı) ayrı olduğundan, uygulamalar karmaşık düzen geçişlerinden veya genişletilmiş hesaplamalardan bağımsız olarak tutarlı bir kare hızı ve düzgün animasyonlar elde edebilir. Bu bölümde, bir uygulamanın animasyonlarını sorunsuz tutmak için oluşturma iş parçacığının nasıl kullanılacağı gösterilmektedir. Animasyonlar hakkında daha fazla bilgi için bkz. Animasyonlara genel bakış. Yoğun hesaplamalar yaparken uygulamanın yanıt hızını artırma hakkında bilgi edinmek için bkz. Kullanıcı arabirimi iş parçacığını duyarlı tutma.
Bağımlı animasyonlar yerine bağımsız kullanın
Animasyonlu özellikteki değişiklikler bir sahnedeki nesnelerin geri kalanını etkilemediğinden, bağımsız animasyonlar oluşturma sırasında baştan sona hesaplanabilir. Bu nedenle bağımsız animasyonlar, ui iş parçacığı yerine oluşturma iş parçacığında çalıştırılabilir. Bu, bileşim iş parçacığı tutarlı bir tempoda güncelleştirildiğinden bunların düzgün kalmasını garanti eder.
Bu animasyon türlerinin tümünün bağımsız olacağı garanti edilir:
Anahtar çerçeveler kullanan nesne animasyonları
Sıfır süreli animasyonlar
Canvas.Left ve Canvas.Top özelliklerine yönelik animasyonlar
UIElement.Opacity özelliğine yönelik animasyonlar
SolidColorBrush.Color alt özelliğini hedeflerken Brush türündeki özelliklere yönelik animasyonlar
Bu dönüş değer türlerinin alt özelliklerini hedeflerken aşağıdaki UIElement özelliklerine yönelik animasyonlar:
Bağımlı animasyonlar düzeni etkiler, bu nedenle kullanıcı arabirimi iş parçacığından ek giriş olmadan hesaplanamaz. Bağımlı animasyonlar Genişlik ve Yükseklik gibi özelliklerde yapılan değişiklikleri içerir. Varsayılan olarak, bağımlı animasyonlar çalıştırılmaz ve uygulama geliştiricisinin kabulunu gerektirir. Etkinleştirildiklerinde, UI iş parçacığı engelsiz kalırsa sorunsuz çalışırlar, ancak çerçeve veya uygulama çok fazla başka iş yapıyorsa UI iş parçacığında takılmaya başlarlar.
XAML çerçevesindeki neredeyse tüm animasyonlar varsayılan olarak bağımsızdır, ancak bu iyileştirmeyi devre dışı bırakmak için gerçekleştirebileceğiniz bazı eylemler vardır. Bu senaryolara özellikle dikkat edin:
- EnableDependentAnimation özelliğini, kullanıcı arabirimi iş parçacığında bağımlı animasyonların çalışmasına izin verecek şekilde ayarlama. Bu animasyonları bağımsız bir sürüme dönüştürün. Örneğin, bir nesnenin Genişliği ve Yüksekliği yerine ScaleTransform.ScaleX ve ScaleTransform.ScaleY'ye animasyon ekleyin. Resim ve metin gibi nesneleri ölçeklendirmekten çekinmeyin. Çerçeve yalnızca ScaleTransform animasyonlu çalışırken bilinear ölçeklendirme uygular. Görüntü/metin, daima net olmasını sağlamak amacıyla nihai boyutunda yeniden rasterleştirilecektir.
- Etkili bir şekilde bağımlı animasyonlar olan çerçeve başına güncelleştirmeler yapma. Bunun bir örneği, CompositionTarget.Rendering olayının işleyicisine dönüştürmeler uygulamaktır.
- CacheMode özelliği BitmapCache olarak ayarlanmış bir öğede bağımsız olarak kabul edilen animasyonları çalıştırma. Bu, önbelleğin her çerçeve için yeniden rasterleştirilmesi gerektiğinden bağımlı olarak kabul edilir.
WebView2 veya MediaPlayerElement'e animasyon eklemeyin
WebView2 denetiminde barındırılan web içeriği doğrudan XAML çerçevesi tarafından işlenmez, bu nedenle sahnenin geri kalanıyla oluşturmak için fazladan çalışma gerekir. Ekranda denetimi animasyonlu hale getirdiğinizde bu yük birikir ve örneğin, web içeriğinin çevresindeki XAML ile senkronize görünmemesi gibi eşitleme sorunlarına neden olabilir. Web içeriği etrafında hareket etmeniz gerekiyorsa, WebView2 yüzeyinin kendisi yerine WinUI kromunu çevreleyen animasyon ekleyin. Önceki yönergeler WebViewBrush'dan bahsedebilir; modern WinUI uygulamalarında WebView2 desteklenen web barındırma denetimidir ve doğrudan WebViewBrush değişimi yoktur.
MediaPlayerElement animasyonu oluşturmak da benzer şekilde kötü bir fikirdir. Performans düşüşünün ötesinde, oynatılan video içeriğinde yırtılmalara veya diğer görüntü bozulmalarına neden olabilir.
Sonsuz animasyonları tedbirli kullanın
Çoğu animasyon belirli bir süre boyunca yürütülür, ancak Timeline.Duration özelliğini Sonsuza kadar olarak ayarlamak bir animasyonun süresiz olarak çalışmasına izin verir. Sürekli CPU kaynaklarını tükettiğinden ve CPU'nun düşük güç veya boşta kalma durumuna geçmesini önleyerek daha hızlı güç kesintisine neden olabileceğinden sonsuz animasyonların kullanımını en aza indirmenizi öneririz.
CompositionTarget.Rendering için işleyici eklemek, sonsuz bir animasyon çalıştırmaya benzer. Normalde UI iş parçacığı yalnızca yapılacak bir iş olduğunda etkindir, ancak bu olaya bir işleyici eklemek, onu her karede çalışmaya zorlar. İşlenecek iş olmadığında işleyiciyi kaldırın ve tekrar ihtiyaç duyulduğunda yeniden kaydedin.
Animasyon kitaplığını kullanma
Microsoft.UI.Xaml.Media.Animation ad alanı, diğer Windows animasyonlarıyla tutarlı bir görünüme ve hisye sahip yüksek performanslı, düzgün animasyonlardan oluşan bir kitaplık içerir. İlgili sınıfların adında "Tema" vardır ve Animasyonlara genel bakış bölümünde açıklanmıştır. Bu kitaplık, uygulamanın ilk görünümünün animasyonunu oluşturma, durum ve içerik geçişleri oluşturma gibi birçok yaygın animasyon senaryosını destekler. WinUI uygulamalarının performansını ve tutarlılığını artırmak için mümkün olduğunda bu animasyon kitaplığını kullanmanızı öneririz.
Not Animasyon kitaplığı tüm olası özelliklere animasyon uygulayamaz. XAML senaryolarında animasyon kütüphanesinin uygulanmadığı durumlar için, Görsel taslaklı animasyonlar'a bakın.
CompositeTransform3D özelliklerine bağımsız olarak animasyon ekleme
Bir CompositeTransform3D'nin her özelliğine bağımsız olarak animasyon uygulayabilirsiniz, bu nedenle yalnızca ihtiyacınız olan animasyonları uygulayın. Örnekler ve daha fazla bilgi için bkz . UIElement.Transform3D. Dönüşümleri animasyonlama hakkında daha fazla bilgi için bkz. Görsel taslaklı animasyonlar ve Anahtar çerçevesi ve kolaylaştırma işlevi animasyonları.
Medya kaynaklarını iyileştirme
Ses, video ve görüntüler, uygulamaların çoğunun kullandığı cazip içerik biçimleridir. Medya yakalama hızları arttıkça ve içerik standart tanımdan yüksek tanımlıya geçtikçe bu içeriği depolamak, çözmek ve kayıttan yürütmek için gereken kaynak miktarı artar. XAML çerçevesi modern Windows medya altyapısını temel alır, bu nedenle WinUI uygulamaları bu geliştirmelerin çoğunu otomatik olarak devralır. WinUI uygulamanızda medyadan en iyi şekilde çıkmanıza yardımcı olacak bazı ek püf noktaları aşağıdadır.
Medya akışlarını serbest bırakma
Medya dosyaları, uygulamaların genellikle kullandığı en yaygın ve pahalı kaynaklardan bazılarıdır. Medya dosyası kaynakları uygulamanızın bellek ayak izinin boyutunu büyük ölçüde artırabileceğinden, uygulama kullanımı biter bitmez tanıtıcıyı medyaya göndermeyi unutmayın.
Örneğin, uygulamanız bir RandomAccessStream veya bir IInputStream nesnesiyle çalışıyorsa, temel alınan nesneyi serbest bırakmak için uygulamanız kullanmayı bitirdiğinde nesne üzerinde close yöntemini çağırdığınızdan emin olun.
Mümkün olduğunda tam ekran video oynatımını göster
WinUI uygulamalarında, tam pencere işlemeyi etkinleştirmek ve devre dışı bırakmak için her zaman MediaPlayerElement üzerindeki IsFullWindow özelliğini kullanın. Bu, medya kayıttan yürütme sırasında sistem düzeyinde iyileştirmelerin kullanılmasını sağlar.
XAML çerçevesi, işlenen tek şey olduğunda video içeriğinin görüntülenmesini iyileştirerek daha az güç kullanan ve daha yüksek kare hızları veren bir deneyime neden olabilir. En verimli medya kayıttan yürütme için MediaPlayerElement boyutunu ekranın genişliği ve yüksekliği olarak ayarlayın ve diğer XAML öğelerini görüntülemeyin.
Bir MediaPlayerElement üzerinde XAML öğelerinin bindirilmesi için ekranın tam genişliğini ve yüksekliğini kaplayan, örneğin kapalı açıklamalı alt yazılar veya anlık aktarım denetimleri gibi meşru nedenler vardır. Medya oynatmayı en verimli durumuna geri döndürmek için gerekli olmadığında bu öğeleri (ayarlayın Visibility="Collapsed") gizlediğinizden emin olun.
Görüntü devre dışı bırakma ve güç tasarrufu
Kullanıcı eylemi algılanmadığında ( örneğin, bir uygulama video oynattığında) ekranın devre dışı bırakılmasını önlemek için DisplayRequest.RequestActive'ı çağırabilirsiniz.
Güç ve pil ömrünü korumak için DisplayRequest.RequestRelease'ı çağırarak artık gerekli olmadığı anda görüntüleme isteğini serbest bırakmanız gerekir.
Görüntüleme isteğini serbest bırakmanız gereken bazı durumlar şunlardır:
- Video oynatma, kullanıcı eylemi, sınırlı bant genişliği nedeniyle arabelleğe alma veya ayarlama işlemleri gibi nedenlerle duraklatılır.
- Çalma durur. Örneğin, video oynamayı bitirdi veya sunum sona erdi.
- Bir oynatma hatası meydana geldi. Örneğin, ağ bağlantısı sorunları veya bozuk bir dosya.
Ekli videonun yanına diğer öğeleri yerleştirme
Genellikle uygulamalar, videoların bir sayfada oynatıldığı ekli bir görünüm sunar. MediaPlayerElement sayfanın tamamını kaplamadığı ve başka XAML nesneleri çizildiği için tam ekran optimizasyonunu kaybettiniz ve bunu açıkça görebilirsiniz. MediaPlayerElement çevresinde bir kenarlık çizerek istemeden bu moda girmeye dikkat edin.
Ekli moddayken videonun üzerine XAML öğeleri çizmeyin. Bunu yaparsanız, çerçeve sahneyi oluşturmak için biraz ek iş yapmak zorunda kalır. Aktarım denetimlerini videonun üzerine yerleştirmek yerine eklenmiş bir medya öğesinin altına yerleştirmek, bu durum için iyileştirmenin iyi bir örneğidir. Bu görüntüde, kırmızı çubuk bir dizi aktarım denetimi (oynatma, duraklatma, durdurma vb.) gösterir.
Bu denetimleri tam ekran olmayan medyanın üzerine yerleştirmeyin. Bunun yerine, aktarım denetimlerini medyanın işlendiği alanın dışında bir yere yerleştirin. Sonraki görüntüde kontroller medyanın altına yerleştirilir.
MediaPlayerElement kaynağını ayarlama gecikmesi
Medya altyapıları pahalı nesnelerdir ve XAML çerçevesi DLL'lerin yüklenmesini ve büyük nesnelerin oluşturulmasını mümkün olduğunca geciktirmektedir. MediaPlayerElement, kaynağı Source özelliği aracılığıyla ayarlandıktan sonra bu işi yapmaya zorlanır. Kullanıcı medya yürütmeye gerçekten hazır olduğunda bunu ayarlamak , MediaPlayerElement ile ilişkili maliyetin çoğunu mümkün olduğunca geciktirir.
MediaPlayerElement.PosterSource Ayarlama
MediaPlayerElement.PosterSource ayarı, XAML'nin başka türlü kullanılmış olabilecek bazı GPU kaynaklarını serbest bırakmasına olanak tanır. Bu API, bir uygulamanın mümkün olduğunca az bellek kullanmasına olanak tanır.
Medya temizlemeyi geliştirme
Temizleme, medya platformlarının gerçekten duyarlı olması için her zaman zor bir görevdir. Genellikle insanlar bunu kaydırıcının değerini değiştirerek gerçekleştirir. Bunu mümkün olduğunca verimli hale getirmek için birkaç ipucu aşağıdadır:
- MediaPlayerElement.MediaPlayer üzerindeki Konumu sorgulayan bir süreölçer temelinde Slider değerini güncelleştirin. Zamanlayıcınız için makul bir güncelleştirme sıklığı kullandığınızdan emin olun. Position özelliği kayıttan yürütme sırasında yalnızca 250 milisaniyede bir güncelleştirilir.
- Kaydırıcıdaki adım frekansının boyutu, videonun uzunluğuna göre ayarlanmalıdır.
- Kullanıcı kaydırıcının başparmağını sürüklediğinde PlaybackRate özelliğini 0 olarak ayarlamak için kaydırıcıdaki PointerPressed, PointerMoved, PointerReleased olaylarına abone olun.
- PointerReleased olay işleyicisinde, temizleme sırasında en uygun başparmak tutturma elde etmek için medya konumunu el ile kaydırıcı konumu değerine ayarlayın.
Video çözünürlüğünü cihaz çözünürlüğüyle eşleştirme
Videonun kodunu çözmek çok fazla bellek ve GPU döngüsü aldığından, görüntüleneceği çözünürlüğe yakın bir video biçimi seçin. Bir video 1080 çözünürlüğünde olup çok daha küçük bir boyuta düşürülecekse, kodunu çözmek için kaynakları kullanmanın bir anlamı yoktur. Birçok uygulamada farklı çözünürlüklerde kodlanmış aynı video yoktur; ancak varsa, görüntüleneceği çözünürlüğe yakın bir kodlama kullanın.
Önerilen biçimleri seçme
Medya biçimi seçimi hassas bir konu olabilir ve genellikle iş kararları tarafından yönlendirilir. Windows Uygulama SDK'sı performans açısından, birincil video biçimi olarak H.264 video ve tercih edilen ses biçimleri olarak AAC ve MP3 öneririz. Yerel dosya oynatma için MP4, video içeriği için tercih edilen dosya formatıdır. H.264 kod çözme, en son grafik donanımları aracılığıyla hızlandırılır. Ayrıca, VC-1 kod çözme için donanım hızlandırma yaygın olarak kullanılabilse de, pazardaki büyük bir grafik donanımı kümesi için hızlandırma, çoğu durumda tam akış donanım boşaltması (yani VLD modu) yerine kısmi hızlandırma düzeyiyle (veya IDCT düzeyiyle) sınırlıdır.
Video içeriği oluşturma işlemine tam denetim sahibiyseniz sıkıştırma verimliliği ve GOP yapısı arasında iyi bir dengeyi nasıl tutabileceğinizi öğrenmelisiniz. B resimleriyle görece daha küçük GOP boyutu, arama veya hile modlarındaki performansı artırabilir.
Oyunlarda olduğu gibi kısa, düşük gecikme süreli ses efektleri eklerken sıkıştırılmış ses biçimlerinde tipik olan işleme yükünü azaltmak için sıkıştırılmamış PCM verilerine sahip WAV dosyalarını kullanın.
Görüntü kaynaklarını iyileştirme
Görüntüleri uygun boyuta ölçeklendirme
Görüntüler çok yüksek çözünürlüklerde yakalanır ve bu da uygulamaların görüntü verilerinin kodunu çözerken daha fazla CPU ve diskten yüklendikten sonra daha fazla bellek kullanmasına neden olabilir. Ancak yüksek çözünürlüklü bir görüntüyü yalnızca yerel boyutundan daha küçük görüntülemek için bellekte kod çözme ve kaydetmenin bir anlamı yoktur. Bunun yerine, DecodePixelWidth ve DecodePixelHeight özelliklerini kullanarak görüntünün tam boyutunda bir sürümünü oluşturun.
Bunu yapmayın:
<Image Source="ms-appx:///Assets/highresCar.jpg"
Width="300" Height="200"/> <!-- BAD CODE DO NOT USE.-->
Bunun yerine şunu yapın:
<Image>
<Image.Source>
<BitmapImage UriSource="ms-appx:///Assets/highresCar.jpg"
DecodePixelWidth="300" DecodePixelHeight="200"/>
</Image.Source>
</Image>
DecodePixelWidth ve DecodePixelHeight birimleri varsayılan olarak fiziksel piksellerdir. DecodePixelType özelliği bu davranışı değiştirmek için kullanılabilir: DecodePixelType değerini Mantıksal olarak ayarlamak, diğer XAML içeriğine benzer şekilde sistemin geçerli ölçek faktörünü otomatik olarak hesaplanmasıyla kod çözme boyutuna neden olur. Bu nedenle, örneğin DecodePixelWidth ve DecodePixelHeight'ın görüntünün görüntüleneceği Görüntü denetiminin Yükseklik ve Genişlik özellikleriyle eşleşmesini istiyorsanız DecodePixelType değerini Mantıksal olarak ayarlamak genel olarak uygun olacaktır. Fiziksel piksel kullanmanın varsayılan davranışıyla, sistemin geçerli ölçek faktörünü kendiniz hesaba katmalısınız; ve kullanıcının görüntüleme tercihlerini değiştirmesi durumunda ölçek değişikliği bildirimlerini dinlemeniz gerekir.
DecodePixelWidth/Height açıkça görüntüden daha büyük olarak ayarlanırsa, uygulama gereksiz yere piksel başına 4 bayt'a kadar ek bellek kullanır ve bu da büyük görüntüler için hızla pahalı hale gelir. Görüntünün ölçeği, büyük ölçekli faktörler için bulanık görünmesine neden olabilecek bilinear ölçeklendirme kullanılarak da azaltılır.
DecodePixelWidth/DecodePixelHeight, görüntü ekranda görüntülenecekten açıkça daha küçük olarak ayarlanırsa ölçeği artırılır ve pikselli görünebilir.
Önceden uygun bir kod çözme boyutunun belirlenemediği bazı durumlarda, belirli bir DecodePixelWidth/DecodePixelHeight değeri belirtilmediğinde, görüntünün kodunu uygun boyutta çözmek için elinden geleni yapacak olan XAML'nin otomatik doğru boyut kod çözme özelliğine güvenmelisiniz.
Görüntü içeriğinin boyutunu önceden biliyorsanız açık bir kod çözme boyutu ayarlamanız gerekir. Sağlanan kod çözme boyutu diğer XAML öğesi boyutlarına göreyse DecodePixelType değerini Mantıksal olarak da ayarlamanız gerekir. Örneğin, Image.Width ve Image.Height ile içerik boyutunu açıkça ayarlarsanız, Görüntü denetimiyle aynı mantıksal piksel boyutlarını kullanmak için DecodePixelType.Logical değerini DecodePixelType.Logical olarak ayarlayabilir ve ardından büyük bellek tasarrufları elde etmek için görüntünün boyutunu denetlemek için BitmapImage.DecodePixelWidth ve/veya BitmapImage.DecodePixelHeight'ı açıkça kullanabilirsiniz.
Çözülen içeriğin boyutu belirlenirken Image.Stretch'in dikkate alınması gerektiğini unutmayın.
Uygun boyutlandırılmış kod çözme
Belirli bir çözümleme boyutu ayarlamazsanız XAML, görüntüyü, ilgili sayfanın ilk düzenine göre ekranda belireceği tam boyuta kodlayarak belleği korumaya çalışır. Uygulamanızı mümkün olduğunca bu özelliği kullanacak şekilde yazmanız önerilir. Aşağıdaki koşullardan herhangi biri karşılanırsa bu özellik devre dışı bırakılır.
- BitmapImage, Içeriği SetSourceAsync veya UriSource ile ayarladıktan sonra canlı XAML ağacına bağlanır.
- Görüntü, SetSource gibi zaman uyumlu kod çözme kullanılarak çözüldü.
- Görüntü, Opaklık değerini 0 olarak veya Görünürlük ayarının konak görüntü öğesinde veya fırçada veya herhangi bir üst öğede Daraltılmış olarak ayarlanması yoluyla gizlenir.
- Görüntü denetimi veya fırça YokEsnetme kullanır.
- Görüntü NineGrid olarak kullanılır.
-
CacheMode="BitmapCache"görüntü öğesinde veya herhangi bir üst öğede ayarlanır. - Görüntü fırçası dikdörtgen değildir (örn. şekle veya metne uygulandığında).
Yukarıdaki senaryolarda, bellek tasarrufu sağlamanın tek yolu açık kod çözme boyutu ayarlamaktır.
Kaynağı ayarlamadan önce her zaman canlı ağaca bir BitmapImage eklemelisiniz. Bir görüntü öğesi veya fırça, işaretlemede belirtildiği her seferde, bu durum otomatik olarak geçerli olur. Örnekler aşağıda "Canlı ağaç örnekleri" başlığı altında verilmiştir. Her zaman SetSource kullanmaktan kaçınmanız ve bunun yerine bir akış kaynağı ayarlarken SetSourceAsync kullanmanız gerekir. ImageOpened olayının yükseltilmesi beklenirken görüntü içeriğini gizlemekten (sıfır opaklık veya daraltılmış görünürlükle) kaçınmak iyi bir fikirdir. Bunu yapmak bir yargı çağrısıdır: Yapılırsa otomatik doğru boyutlu kod çözme özelliğinden yararlanamazsınız. Uygulamanızın başlangıçta görüntü içeriğini gizlemesi gerekiyorsa, mümkünse kod çözme boyutunu da açıkça ayarlamalıdır.
Canlı ağaç örnekleri
Örnek 1 (iyi)—biçimlendirmede belirtilen Tekdüzen Kaynak Tanımlayıcısı (URI).
<Image x:Name="myImage" UriSource="Assets/cool-image.png"/>
Örnek 2 işaretleme—"kod arkası" belirtilen URI.
<Image x:Name="myImage"/>
Örnek 2 arka planda kod (iyi)— BitmapImage'ı UriSource'u ayarlamadan önce ağaca bağlama.
var bitmapImage = new BitmapImage();
myImage.Source = bitmapImage;
bitmapImage.UriSource = new Uri("ms-appx:///Assets/cool-image.png", UriKind.RelativeOrAbsolute);
Örnek 2 arka planda kod (hatalı)— BitmapImage'ı ağaca bağlamadan önce UriSource'u ayarlama.
var bitmapImage = new BitmapImage();
bitmapImage.UriSource = new Uri("ms-appx:///Assets/cool-image.png", UriKind.RelativeOrAbsolute);
myImage.Source = bitmapImage;
Önbelleğe alma iyileştirmeleri
Bir uygulama paketinden veya web'den içerik yüklemek için UriSource kullanan görüntülerde önbelleğe alma iyileştirmeleri etkindir. URI, temel alınan içeriği benzersiz olarak tanımlamak için kullanılır ve dahili olarak XAML çerçevesi içeriği birden çok kez indirmez veya çözmez. Bunun yerine, içeriği birden çok kez görüntülemek için önbelleğe alınmış yazılım veya donanım kaynaklarını kullanır.
Bu iyileştirmenin istisnası, görüntünün farklı çözünürlüklerde birden çok kez görüntülenmesidir (açıkça veya otomatik doğru boyutlu kod çözme yoluyla belirtilebilir). Her önbellek girdisi görüntünün çözünürlüğünü de depolar ve XAML gerekli çözünürlükle eşleşen bir kaynak URI'ye sahip bir görüntü bulamazsa bu boyutta yeni bir sürümün kodunu çözer. Ancak kodlanmış görüntü verilerini yeniden indirmez.
Sonuç olarak, bir uygulama paketinden görüntü yüklerken UriSource'un kullanılmasını benimsemeli ve gerekli olmadığında dosya akışı ve SetSourceAsync kullanmaktan kaçınmalısınız.
Sanallaştırılmış panellerdeki görüntüler (örneğin ListView)
Uygulama açıkça kaldırdığı için veya modern bir sanallaştırılmış panelde olduğu ve görüntü dışına kaydırıldığında örtük olarak kaldırıldığı için bir görüntü ağaçtan kaldırılırsa, XAML artık gerekli olmadığından görüntünün donanım kaynaklarını serbest bırakarak bellek kullanımını iyileştirir. Bellek, hemen serbest bırakılmaz; bunun yerine, görüntü öğesi ağaçtan kaldırıldıktan bir saniye sonra gerçekleşen çerçeve güncellemesi sırasında serbest bırakılır.
Sonuç olarak, görüntü içeriği listelerini barındırmak için modern sanallaştırılmış panelleri kullanmaya çalışmanız gerekir.
Yazılım taramalı görüntüler
Dikdörtgen olmayan bir fırça veya NineGrid için bir görüntü kullanıldığında, görüntü, yazılım rasterizasyon yolu kullanır ve bu, görüntüleri hiç ölçeklendirmez. Ayrıca, görüntünün bir kopyasını hem yazılım hem de donanım belleğinde depolaması gerekir. Örneğin, bir görüntü bir elips için fırça olarak kullanılıyorsa, potansiyel olarak büyük olabilecek tam görüntü dahili olarak iki kez depolanır. NineGrid veya dikdörtgen olmayan bir fırça kullanırken uygulamanızın görüntülerini, yaklaşık işlenecekleri boyuta göre önceden ölçeklendirmesi gereklidir.
Arka plan iş parçacığında görüntü yükleme
XAML, yazılım belleğinde ara bir yüzeye ihtiyaç duymadan, görüntünün içeriğini donanım belleğindeki bir yüzeye zaman uyumsuz olarak çözümleyebilmesini sağlayan bir iç optimizasyona sahiptir. Bu, en yüksek bellek kullanımını ve işleme gecikmesini azaltır. Aşağıdaki koşullardan herhangi biri karşılanırsa bu özellik devre dışı bırakılır.
- Görüntü NineGrid olarak kullanılır.
-
CacheMode="BitmapCache"görüntü öğesinde veya herhangi bir üst öğede ayarlanır. - Görüntü fırçası dikdörtgen değildir (örn. şekle veya metne uygulandığında).
SoftwareBitmapSource
SoftwareBitmapSource sınıfı BitmapDecoder, kamera API'leri ve XAML gibi farklı WinRT ad alanları arasında birlikte çalışabilen sıkıştırılmamış görüntüleri değiştirir. Bu sınıf, WriteableBitmap ile normalde gerekli olabilecek ek bir kopyayı gizler ve en yüksek bellek ve kaynaktan ekrana gecikme süresini azaltmaya yardımcı olur.
Kaynak bilgileri sağlayan SoftwareBitmap , uygulamanın belleği uygun gördüğü şekilde yeniden eşlemesini sağlayan yeniden yüklenebilir bir yedekleme deposu sağlamak için özel bir IWICBitmap kullanacak şekilde de yapılandırılabilir. Bu gelişmiş bir C++ kullanım örneğidir.
Uygulamanız, görüntü üreten ve kullanan diğer WinRT API'leriyle birlikte çalışabilmek için SoftwareBitmap ve SoftwareBitmapSource kullanmalıdır. Uygulamanız, WriteableBitmap yerine sıkıştırılmamış görüntü verilerini yüklerken SoftwareBitmapSource kullanmalıdır.
Küçük resimler için GetThumbnailAsync kullanın
Görüntüleri ölçeklendirmek için bir kullanım örneği, küçük resimler oluşturmaktır. Görüntülerin küçük sürümlerini sağlamak için DecodePixelWidth ve DecodePixelHeight kullanabilseniz de, Windows küçük resimleri almak için daha da verimli API'ler sağlar. GetThumbnailAsync , dosya sisteminin zaten önbelleğe alınmış olduğu görüntülerin küçük resimlerini sağlar. Bu, görüntünün açılması veya kodunun çözülmesi gerekmeyen XAML API'lerinden daha iyi performans sağlar.
Bir Windows Uygulama SDK'sı uygulamasında, ana pencereyi olarak App.MainWindowdepolayarak seçiciyi uygulama pencere tutamacınızla başlatın.
FileOpenPicker picker = new FileOpenPicker();
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd);
picker.FileTypeFilter.Add(".bmp");
picker.FileTypeFilter.Add(".jpg");
picker.FileTypeFilter.Add(".jpeg");
picker.FileTypeFilter.Add(".png");
picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
StorageFile file = await picker.PickSingleFileAsync();
StorageItemThumbnail fileThumbnail = await file.GetThumbnailAsync(ThumbnailMode.SingleItem, 64);
BitmapImage bmp = new BitmapImage();
await bmp.SetSourceAsync(fileThumbnail);
Image img = new Image();
img.Source = bmp;
Görüntülerin kodunu bir kez çözme
Görüntülerin kodunun birden çok kez çözülmesini önlemek için bellek akışlarını kullanmak yerine Uri'den Image.Source özelliğini atayın. XAML çerçevesi aynı Uri'yi birden çok yerde bir kod çözülen görüntüyle ilişkilendirebilir, ancak aynı verileri içeren birden çok bellek akışı için aynı işlemi yapamaz ve her bellek akışı için farklı bir kod çözme görüntüsü oluşturur.
Windows developer