Ho creato un controllo WPF (ereditato da FrameworkElement) che visualizza un'immagine piastrellata che può essere spostata. Ogni riquadro è 256x256 pixel a 24 bpp. Ho ignorato OnRender. Lì, carico le nuove tessere (come BitmapFrame), quindi disegno tutte le tessere visibili usando drawingContext.DrawImage.Prestazioni di rendering WPF con BitmapSource
Ora, ogni volta che ci sono più di una manciata di nuove tessere per ciclo di rendering, il framerate scende da 60 fps a zero per circa un secondo. Questo non è causato dal caricamento delle immagini (che richiede l'ordine di millisecondi), né da DrawImage (che non richiede assolutamente nulla, in quanto si limita a riempire una struttura di dati di rendering intermedi).
La mia ipotesi è che il thread di rendering si strozzi ogni volta che ottiene un numero elevato (~ 20) di nuove istanze BitmapSource (ovvero, quelle che non aveva già memorizzato nella cache). O impiega molto tempo a convertirli in un formato interno compatibile con DirectX o potrebbe trattarsi di un problema di memorizzazione nella cache. Non può essere a corto di RAM video; Perforator mostra picchi inferiori a 60 MB, ho 256 MB. Inoltre, Perforator afferma che tutti gli obiettivi di rendering sono accelerati dall'hardware, quindi non può essere neanche questo.
Qualsiasi approfondimento sarebbe apprezzato!
Grazie in anticipo
Daniel
@RandomEngy:
BitmapScalingMode.LowQuality ridotto il problema un po ', ma non sbarazzarsi di esso. Sto già caricando le tessere alla risoluzione prevista. E non può essere il driver grafico, che è aggiornato (Nvidia).
Sono un po 'sorpreso di sapere che il ridimensionamento richiede molto tempo. Il modo in cui l'ho capito, una bitmap (indipendentemente dalle sue dimensioni) viene appena caricata come trama Direct3D e quindi ridimensionata su hardware. In effetti, una volta che la bitmap è stata renderizzata per la prima volta, posso cambiarne la rotazione e la scala senza ulteriori blocchi.