2010-06-23 17 views
7

Nesne sürükleme, yeniden boyutlandırma ve boyama karesi gibi hızlı geri yüklemeler sırasında performansın bir sorun olduğu bir sahiplik sahibi kontrolüm var. i geçici hızlı senaryoları yeniden boyamak sırasında azaltılmış kaliteli görüntü çekecek, Picasadahil olmak üzere birçok diğer uygulamalar fark etmiş ve daha sonra güncelleme yüksek kaliteli versiyonu ile görüntü UI "yerleşir." zamanPicasa'nın çizim hızını düşürmek için düşük kaliteli görüntü oluşturma işlemini taklit etme

Birçok hızlı yeniden çizme gerçekleştiğinde nasıl daha düşük kaliteli bir resim üretmeliyim? i performansını artırmak için istihdam edebilirsiniz buna benzer diğer stratejiler var mıdır

Ekstra Bilgi (ya da sahte performans artışı.):

Bu sahip çizim yoğun kullanımını gündeme getirmektedir bir form tasarımcı benzeri bir uygulamadır. İyi çalışır, ancak üç ya da dört görüntünün istemci alanında dikdörtgenlere boyanması gerektiğinde boguklaşmaya başlar. (Son kullanıcıların çizimde en fazla para çeken öğelerin farklı türlerini oluşturmasına izin verilir.)

DrawImage'den çok daha verimli olması beklenen görüntüleri çizmek için DrawImageUnscaled GDI + yöntemini kullanıyorum ancak performans profil gösterileri Bu DrawImageUnscaled hala darboğaz. Tek başvurumun daha az çekmenin akıllıca yollarını bulmak olduğunu düşünüyorum.

P.S. Bu konuyla ilgili önceki bir soru bana bir Tumbleweed rozeti kazandırdı, bu yüzden başka bir yaklaşımı alıyorum: How to increase performance over GDI's DrawImage(Unscaled)?

cevap

3

Bekleyin - burada düşük asılı bir meyveyi kaçırdınız. Büyük ihtimalle yeniden boyutlandırma işlemleri sırasında görüntüyü gerçekten yeniden çizmiyorlar. Video sürücüsündeki mevcut görüntüyü StretchBlt kullanarak yeniden boyutlandırabilirler - bu da video sürücüsü/donanımı tarafından çok daha hızlı, daha düşük kalitede bir görüntüyü yeniden çizebileceğinizden daha hızlı olacak şekilde optimize edilebilir.

strateji:
-Image nesneler, görüntü nesnesinin
-repaint görüntüsünün
-repaint sürükleyerek -during son pozisyonu
günceller tam kaliteyi çizer Son Pozisyon/Boyut (diag) için üye değişkeni var Bunu yapın:
* Son Konum/Boyut için Geçerli konum/Boyut: Geçerli konum/Boyut
* Güncelleştirme Son Konum/Boyut
* Birkaç saniyeden daha fazla bir süredir. Son fare hareketinden bu yana çizim ve/veya> .2s, yeni bir tam kaliteli görüntü elde etmek için yeniden boyamayı (sadece geçersiz kılma değil - ŞİMDİ istiyorsanız) arayın. Ayrıca diğer nesnelerden örtüşmeler algılarsanız (StrechBlt'd çok fazla)

Örnek kodlar Benzer bir şey yapan bir uygulamada kullanıyorum (nesnelerin 100'üne sahip olabilecek bir pencereyi boyutlandıran yakınlaştırma efekti) bir ipad demo sadece yumuşak) gibi görünür:

tabii
Declare Function StretchBlt Lib "gdi32.dll" _ 
    (ByVal hdcDest As IntPtr, _ 
    ByVal nXOriginDest As Integer, _ 
    ByVal nYOriginDest As Integer, _ 
    ByVal nWidthDest As Integer, _ 
    ByVal nHeightDest As Integer, _ 
    ByVal hdcSrc As IntPtr, _ 
    ByVal nXOriginSrc As Integer, _ 
    ByVal nYOriginSrc As Integer, _ 
    ByVal nWidthSrc As Integer, _ 
    ByVal nHeightSrc As Integer, _ 
    ByVal dwRop As Int32) As Boolean 

    Using g As Graphics = f.pb.CreateGraphics 
     ' parm of True says draw plain view - no text = looks bad Zooming. 
     f.DrawAll(g, True) 
     For i As Integer = iSteps To 1 Step -1 
      Dim HDC1 As IntPtr = g.GetHdc 
      Try 
       ' Size of bite will not be right, but by re-adjusting 
       ' with each iteration, it will make it to full-screen. 
       ' Looks as good as having it right to start with, only much easier. 
       TopBite = objTop \ i 
       BottomBite = h - ((h - objBottom) \ i) 
       ' Stretch/move the stuff. 
       StretchBlt(HDC1, 0, 0, w - LeftBite, h, _ 
        HDC1, LeftBite, TopBite, w - LeftBite, BottomBite - TopBite, 13369376) 
       ' Calculate where MyEntry would be after each stretch. Then the Bite 
       ' size calcs above will ensure its closer next time. 
       SimulateStretch(objTop, objBottom, TopBite, BottomBite, h) 
      Finally 
       g.ReleaseHdc(HDC1) 
      End Try 
      ' Clear exposed/invalid area to the right. 
      g.FillRectangle(br, w - LeftBite, 0, LeftBite, h) 
      ' Sleep will make Swells close in duration between small/big window. 
      ' (Can I actually sleep this short of a time?) 
      System.Threading.Thread.Sleep(5) 
     Next 
    End Using 

biri geri yukarı o zaman şeker şey görüntü ve boyutları, eğer süper düşük kaliteli ve pixellated olacak - böylece sıklıkla için daha akıllı algorythm kullanabilirsiniz Yeniden boyutlandırmama durumunda mousedrag sırasında gerçek onpaint'i ateşleyin. Bunun somunları ve cıvataları, özel uygulamaya bağlı olacaktır.Uygulamanızla ilgili daha ayrıntılı bilgi verebilmemiz için doğru olanı vermelisiniz (tam olarak neye benziyor?) Büyük bir kare usercontrol/birçok ownerdrawn öğesi varsayalım, hepsi aynı anda yeniden boyutlandırıldı. Küçük başlar ve yeniden boyutlandırılırlar, böylece örtüşmeye başlarlarsa, yeniden boyutlandırma işlemleri sırasında düzenli olarak tam olarak yeniden çizim yapmak zorunda kalırsınız.

+0

Ayrıca, daha düşük kalitede daha düşük performans için HQ görüntüsünden bir bellek HDC'sinde strechblt yapabilirsiniz, ancak hiç yapmadım, sonuçları bilmiyorum. – FastAl

İlgili konular