2012-08-24 14 views
6

Resim görüntüleyicimi hızlandırmam ve bunu yapmak için kendi DirectX denetimimi oluşturmama bakıp bakmam gerektiğini merak etmem gerekiyor.Doğal WPF ve büyük resimleri görüntülemek için özel DirectX

Resim görüntüleyicim medikal görüntüleri gösterir. Oldukça büyük olabilirler. Mamografi söz konusu olduğunda 55mb konuşuyoruz. Piksel verileri, bir ushort dizisinde saklanan 16bit gri tonlamalıdır. Gory ayrıntılarına girmeden, şu anki yaklaşımım piksel verilerini bir ImageSource'a yüklüyor ve WPF Image kontrolünü kullanıyor.

DirectX ile hiçbir şey yapmadım. Dalış yapmaya değer mi? Yerel WPF'den daha hızlı mı? Eğer öyleyse ne kadar önemli? Ya da, DirectX'i unutup mevcut yaklaşımımı geliştirebileceğim alanlara bakmalı mıyım?

Birisi böyle söylemeden önce WPF'nin DirectX'i kullanacağını biliyorum. WPF katmanını kaldırarak ve DirectX'i kendim yazıyorsam performansı artıracağımı merak ediyorum.

+0

Tüm resmi veya yalnızca bölümlerini gösteriyor musunuz? Bir scrollviewer kullanırsanız, yalnızca ihtiyacınız olan tüm görüntüyü görüntüleyen –

+0

@JustinPihony belleğine yükler. –

+1

sadece directx! = Directx'i hatırlayın. Ayrıca, kullandığınız directx sarıcısına da bağlıdır.Exaple SlimDX veya sharpdx'in xna veya Managed DirectX'ten daha iyi bir performansı vardır. Ama sonuçta daha iyi performans aldığınızı düşünmüyorum. –

cevap

3

Birden çok gigabaytlık uydu ve grafik görüntüsü çizme konusunda deneyimim var. 55MB civarında görüntülerle çalışmak muhtemelen çok fazla optimize etmeye çalışmadan bile tamamdır. Öte yandan bir alternatifi önermek için yeterince detay vermediniz, bu yüzden artıları ve eksileri hakkında görüş bildireceğim.

2B windows API'lerini kullanmak en kolay uygulanacak ve döndürmeniz gerekmediğinde ve sadece bir görüntüyü görüntülemek ve yakınlaştırmak ve etrafta gezinmek istiyorsanız her zaman yeterince hızlı olmalıdır. Büyük bir resim olarak ele alırsanız, güzel bir pürüzsüz görüntü elde etmek için yarım ton ile çizim yapıyorsanız, uzaklaştırma yaptığınız zaman performans o kadar iyi olmaz. Bunun nedeni, çizdiği her resimdeki 55mb'lik resmi etkili bir şekilde okumak olacaktır.

Bu performans sorununu çözmek için, görüntünüzü etkili bir şekilde eşleme yaparak birden çok bitmap oluşturabilirsiniz. Uzaklaştırırken, çizmeye çalıştığınız çözünürlüğe en yakın indirgenmiş çözünürlük resmini seçebilirsiniz. DirectX ile uygulanması

http://en.wikipedia.org/wiki/Mipmap

gibi zor 10x olacaktır: Eğer mip-haritalama aşina değilseniz buraya bir Wikipedia bağlantıdır. Farklı grafik donanımları farklı maksimum doku boyutlarına sahiptir. Büyük olasılıkla, resminizi çizebilmek için birden fazla dokuya ayırmanız gerekecek ve aynı zamanda render durumlarını, matrisleri görüntüleyebilmeniz için de takip etmeniz gerekecektir.

Ancak, DirectX'i kullanıyorsanız, gerçek zamanlı fotoğraf ayarlamaları Sadece görünüm matrislerini ayarlayarak gerçek zamanlı rotasyon yapabilirsiniz. Bir piksel gölgelendiricide gerçek zamanlı kontrast, parlaklık, gama ve keskinlik yapabilirsiniz.

Önerebileceğim başka iki API var. Eğer kendinizi Vista'ya veya daha sonra sınırlamaya istekliyseniz Direct2D Direct3D'den biraz daha basit olacaktır. Ayrıca, windows olmayan bir platformda uygulamanız gerekecekse, bunun yerine OpenGL'yi kullanmanızı öneriyorum. Şu anki projem Direct3D'de. Çünkü birkaç yıl önce başladığımız zaman OpenGL geride kalıyordu ve Android cihazlarının popülaritesini göremedim. Ben şimdi onun yerine OpenGL kullansaydık.

1

WPF saatini nerede geçirdiğini görmek için profiling'u deneyin. Görüntüleri kendi doğal çözünürlüklerinde mi görüntülüyorsunuz? Değilse, bazı ön işleme yapmak ve 1/2 çözünürlük sürümleri oluşturmak faydalı olabilir.