J'ai créé un contrôle WPF (héritant de FrameworkElement) qui affiche un graphique en mosaïque pouvant être mis en panoramique. Chaque mosaïque est de 256x256 pixels à 24bpp. J'ai remplacé OnRender. Là, je charge toutes les nouvelles tuiles (comme BitmapFrame), puis dessine toutes les tuiles visibles en utilisant drawingContext.DrawImage.Performances de rendu WPF avec BitmapSource
Maintenant, chaque fois qu'il y a plus d'une poignée de nouvelles tuiles par cycle de rendu, le framerate tombe de 60fps à zéro pendant environ une seconde. Ceci n'est pas dû au chargement des images (qui prend environ de l'ordre de la milliseconde), ni à DrawImage (qui ne prend pas de temps car il ne fait que remplir une structure de données de rendu intermédiaire). Je suppose que le thread de rendu se bloque à chaque fois qu'il reçoit un grand nombre (~ 20) de nouvelles instances de BitmapSource (c'est-à-dire celles qu'il n'a pas déjà mises en cache). Soit il passe beaucoup de temps à les convertir en un format compatible DirectX interne, soit il peut s'agir d'un problème de mise en cache. Il ne peut pas manquer de RAM vidéo; Perforateur montre des pics à moins de 60 Mo, j'ai 256 Mo. En outre, Perforator indique que toutes les cibles de rendu sont accélérées par le matériel, ce qui ne peut pas être le cas non plus.
Toute idée serait appréciée!
Merci à l'avance
Daniel
@RandomEngy:
BitmapScalingMode.LowQuality réduit le problème un peu, mais ne pas se débarrasser. Je charge déjà les dalles à la résolution voulue. Et ce ne peut pas être le pilote graphique, qui est à jour (Nvidia).
Je suis un peu surpris d'apprendre que la mise à l'échelle prend autant de temps. La façon dont je l'ai compris, une image bitmap (indépendamment de sa taille) est juste chargée comme une texture Direct3D, puis mise à l'échelle matérielle. En fait, une fois que le bitmap a été rendu pour la première fois, je peux changer sa rotation et son échelle sans aucun gel supplémentaire.