J'ai trouvé plusieurs modèles pour l'optimisation des Bitmaps de manutention en WPF. Je n'ai pas, cependant, de comprendre quand utiliser chacun des modèles. Comme je pense que c'est un problème commun, j'ai résumé ce que je comprends et ce que j'imagine et je demande votre aide. Si vous pouvez ajouter des motifs, expliquer en quoi ils diffèrent, expliquer s'ils utilisent le CPU ou le GPU, et enseigner quand utiliser et comment les combiner, ce serait d'une grande aide!
Contexte – les Images de "Grille" Scénario:
Mon application doit afficher de nombreuses images bitmap. Les images sont affichées sur l'écran, les lignes et les colonnes de la grille comme organisation (pas nécessairement la Grille ou UniformGrid classes, pense le Lecteur Window Media, Album de vue). Les Images peuvent se déplacer entre les différentes cellules de la grille. Quelques images de manière arbitraire, les cellules peuvent être remplacés par d'autres. Les Images doivent être cliquables, devrait fournir un menu contextuel, doivent être sélectionnables, glisser en mesure etc. En d'autres termes, "de combiner les bougres peu en un grand bitmap" n'est pas applicable, à moins de ne pas naïvement.
Modèle 0: Le Hack
Combinez les bougres peu en une image bitmap (comment? contexte de dessin?), et de l'utiliser comme arrière-plan. La superposition de ce avec des images avec un contenu vide qui va gérer les hits, les menus contextuels, événements, etc.
L'avantage est que nous ne sommes que de parler de deux images ici: L'un et celui qui doit le remplacer. Ce doit être vraiment rapide. Cependant, mes années d'expérience à lever le drapeau rouge de danger. Vos commentaires?
Modèle 1: Réduire La Taille De L'Image
C'est un no-brainer, quand vous connaissez à l'avance la taille de l'image pour la redimensionner, et lorsque vous êtes prêt à perdre les détails (couleur) pour la performance:
- Réduire la taille du bitmap à l'aide de BitmapImage.DecodePixelWidth
- Réduire la couleur de l'information à l'aide de FormatConvertedBitmap.DestinationFormat
- Définir le contrôle de mise à l'échelle de comportement de réglage de l'Image.S'étirer pour s'Étirer.Aucun
- Définir la SetBitmapScalingMode pour que l'image LowQuality.
- Geler le bougre
Voir le code ici.
Modèle 2: Contexte de pré-extraction de
Ce modèle est applicable lorsque vous pensez que vous pouvez profiter de l'utilisateur en regardant les images sur l'écran, et de préparer à l'avance les prochaines images à afficher. Les inconvénients pour votre projet, en plus de la surcharge de la mémoire, c'est qu'il a à soutenir le .Net Framework 4 cible et pas seulement le profil du client, de sorte qu'elle pourrait encourir une installation sur le client. Vous aurez vous-même avoir à souffrir de la programmation asynchrone de la douleur.
Dans ce modèle vous créer exactement le nombre de contrôles d'Image. Lorsque les bitmaps doivent être ajoutés, déplacés ou supprimés, vous ne modifier que le contrôle de l'Image' BitmapSource(s). Un BackgroundWorker tâche est responsable de la pré-extraction de la BitmapSource(s) (éventuellement à l'aide de la "Réduire la Taille de l'Image" schéma ci-dessus) et de les insérer dans MemoryCache.
Pour que cela fonctionne, vous devez définir la BitmapImage de CacheOption à OnLoad, afin que le travail de déchargement à l'arrière-plan travailleur.
Modèle 3: Contexte De Dessin
Ceci a été suggéré par Sheldon Ziao de Support de Microsoft sur la MSDN WPF forum ici. Voir la page 494, Chapitre 15 "2D Graphiques" en Adam Nathan WPF 4 Unleashed pour une description de DrawingContext. Je ne peux pas dire que je le comprends. Selon la réponse ici, je suppose que cela permettrait d'améliorer la manipulation de la Géométrie des dessins, pas des bitmaps. Ensuite, je ne pense pas que ce sera de soutenir l'accent et les événements exigences pour les images (mon mauvais pour ne pas expliquer le mieux les exigences lors du forum) de Plus, je suis inquiet par le livre le résumé de la phrase: "Notez que l'utilisation de DrawingContext ne change pas le fait que vous êtes d'exploitation au sein d'une retenue en mode système. La spécifié de dessin ne se produit pas immédiatement; les commandes sont conservées par WPF jusqu'à ce qu'ils sont nécessaires." Cela signifie qu'une fois notre même gestionnaire re nous ne pouvons pas tirer parti du parallélisme comme dans "arrière-plan pré-extraction".
Schéma 4: Écriture Des Bitmaps
La documentation MSDN ici décrit comme un double système de tampon: Votre thread de l'INTERFACE utilisateur des mises à jour de la mémoire tampon; le WPF thread de rendu se déplace ce mémoire vidéo.
L'utilisation prévue (voir ici) est pour les bitmaps que changer beaucoup de choses dans un film vidéo sur l'écran. Je ne suis pas sûr, mais c'est possible que cela pourrait être piraté et combiné avec l'arrière-plan de Pré-extraction de motif et utilisée dans la grille scénario.
Modèle 5: Mise En Cache Des Bitmap
Pas beaucoup d'infos sur le site web MSDN (ici). Sur le WPF archives du forum (ici), il est expliqué que "La BitmapCache API est conçu pour le cache de votre contenu (lors du rendu dans le matériel) dans la mémoire vidéo, le sens qu'il reste résident sur votre GPU. Cela vous permet d'économiser le coût de re-rendu que le contenu lorsque vous dessinez à l'écran." Cela semble être une bonne idée. Je ne suis pas sûr, cependant, ce sont les pièges et comment les utiliser.
Schéma 6: RenderTargetBitmap
Le RenderTargetBitmap convertit un Visuel d'une image bitmap. Je ne sais pas si c'est pertinent ici. Voir ici.
Edit: en ce qui Concerne Paul Hoenecke question: j'ai écrit que "Ma demande a afficher de nombreux bitmap iages". Je ne mentionne que j'ai besoin d'afficher environ 800 images simultanément.
On peut lire à propos de la performance lors de mes questions WPF Bitmap de la performance et Comment puis-je faire de l'affichage d'images sur WPF plus "accrocheur"?
J'ai modifié la description de l'exemple 1 pour mettre en surbrillance le concept que le contrôle de l'image ne sont pas créés ou supprimés (sauf si on veut afficher un plus grand ou plus petit de la grille). Seulement leurs Sources sont définies à différents, nouveaux ou null BitmapSources.
Edit: Cette question publié sur le WPF forum de support, avec quelques réponses à partir de MS personnel.