2010-01-13 14 views
6

Şirketimizin üzerinde çalıştığı bir uygulama şu anda 'Fayans' çizmek için gradyanlı birçok dikdörtgen şekli görüntüler. Bir performans sorunu ortaya çıkaran bir iç tartışma ortaya çıktı. Bu karolar yaklaşık 100 piksele 200 pikseldir ve ya gradyan gölgeli kırmızı, sarı veya yeşildir. Herhangi bir zamanda, ekranda bu karoların 100'e kadar olabilir. Her biri için (kırmızı, sarı, yeşil) bir görüntü oluşturmak ve gerektiğinde tekrarlamak daha standart olabilir mi yoksa standart WPF fırçalarını kullanarak çizim yapmaya devam etmemiz daha mı iyi olurdu?Çok sayıda tekrarlanan görüntü WPF'deki fırçaları kullanmaktan daha fazla mı yoksa daha az performans mı veriyor?

DÜZENLEME: Açıklamak gerekirse, kullandığımız degrade fırçası bir LinearGradientBrush'tır.

+0

En çok hangi performans metrikleriyle ilgileniyorsunuz? Hız, bellek kullanımı, cpu kullanımı, vb. –

+0

Grafik performansı, işlemci kullanımı, vb. Yüzlerce bu tür gradyan döşemelerinin bir listesini kaydırdığımda, ekran titremesine ve yüksek işlemci kullanımına tanıklık ediyorum. Performansa yardımcı olmak için birkaç şey denedik ama şansımız yok. Rasterleştirilmiş görüntüler kullanmanın yerine yardımcı olacağını merak ediyordum. – Kilhoffer

+0

Sadece birkaç yüzlük bu karolar için titreme ve yüksek CPU kullanımı? Fayanslar için ne tür nesneler yaratıyorsunuz? Tam teşekküllü FrameworkElements veya UIElements oluşturuyor musunuz yoksa alt düzey Visual sınıfıyla mı çalışıyorsunuz? – Charlie

cevap

1

Deneyimlerden, fırça kullanarak çizim yapmak çok daha iyi bir performansa sahip olacaktır. Karo görüntülerini yükleme ve bunları oluşturma yükü, doldurulmuş dikdörtgenlerin oluşturulmasına kıyasla büyüktür.

+0

Degrade fırçaların neden daha iyi performans gösterdiğinin teknik nedenlerini anlatabilir misiniz? Eğer öyleyse, ödül senin olsun. – Kilhoffer

+0

Teknik nedenler oldukça basit. IO her zaman yapabileceğiniz en maliyetli işlemlerden biridir. Dosyalardan görüntü okumak zaman alacaktır; Bu yük olmadan bir şey yapmak daha az zaman alacaktır. Gerçek görüntü koduna bastığınızda, aynı şeyle (yüksek oranda optimize edilmiş DirectX) kaynatılır, ancak fark, fırça yaklaşımının görüntüyü oluşturmak için herhangi bir ek yükü olmamasıdır. – Charlie

+0

Üzgünüm, bunu yazımda belirtmeliydim. Buna göre düzenlerim. Tekrarlanacak olan sadece 3 görüntü var. Tek IO onları ilk defa okuyor. Bundan sonra, önbelleğe alınmış kaynaklar. – Kilhoffer

1

Bunu düzeltmenin tek yolu, her iki yolu da denemek ve her bir yaklaşımın performansını ölçmek olacaktır.

Oluşturma döngüsünü zamanlamak ve sonucu kütüğe kaydetmek için kod eklemeniz gerekir, daha sonra gerçekçi bir şekil alabilmek için 1000 (hatta 100.000) yeniden çizime zorlarsınız.

Yoksulluk hisim, LinearGradientBrush öğesinin bir görüntüyü (kaynaklardan bile) yüklemekten daha hızlı olacağıdır - ancak hatalı olduğunun kanıtlanmasına razıyım.