7
votes

C # GDI + / System.Drawing.Graphics - Création d'un tampon et de blitter manuellement?

Je crée un visualiseur de CAO qui traite de très grands fichiers d'image et j'essaie de l'optimiser comme étant une empreinte de la mémoire et une faible mémoire de mémoire.

Il utilise GDI + pour rendu sur un panneau.

C'est la faille actuelle est avec le rendu d'image. Certains des fichiers que j'utilise des images de référence, qui sont particulièrement grands (8000x8000 pixels). J'ai optimisé l'utilisation de la mémoire en les chargant uniquement lorsqu'ils deviennent visibles et en les éliminant quand ils ne le sont pas. Cela réduit les risques du programme qui manque de mémoire, mais empêche les images d'être chargées et déchargées trop souvent; Cependant, rendant les images elles-mêmes (context.drawimage) porte toujours une très grande surcharge.

J'explore maintenant des moyens de blâmer les images dans un tampon plus petit de quelque sorte, rendant ce tampon (généralement beaucoup plus petit), puis rafraîchir / la reconstruire lorsque le niveau de zoom change de manière significative.

Le problème est que je ne trouve aucune disposition pour cela à GDI, que ce soit. Quelqu'un peut-il suggérer comment je pourrais y parvenir?


0 commentaires

4 Réponses :


3
votes

Je ne pense pas que GDI est conçu pour de telles mises à jour à grande vitesse d'images. Si vous essayez de faire défiler l'image et de suivre la souris à chaque mouvement, essayez de modifier les sections de l'image et de remplir l'espace ouvert par le décalage. Réutilisez essentiellement les astuces que les programmeurs utilisés lors de la défilation de manière douce / panoramique à la fois lorsque les CPU sont lents et que la RAM est petite.


0 commentaires

2
votes

Si vous créez une nouvelle application graphique nécessitant un haut framerate et que vous recherchez des suggestions, je suggère d'abandonner GDI + et d'utiliser WPF. WPF utilise une accélération matérielle et prend en charge les graphiques de mode retenue; Cela a beaucoup de meilleures performances pour moins de travail que GDI +.

S'il y a une limitation qui interdit WPF, veuillez l'expliquer dans votre question. Cela est pertinent car de telles limitations peuvent également avoir une incidence sur le dessin GDI +.


0 commentaires

1
votes

GDI Binned en faveur de Direct3D sous forme d'éléments 3D entrés dans l'équation de toute façon. Les images transformées en vignettes simples et de carreaux de plus grands chargés de la manière requise.


0 commentaires

0
votes

J'ai fait face à un problème similaire lors du développement de ma propre application SIG. La meilleure solution que j'ai trouvée pour cela (même lorsque vous utilisez WPF) consiste à taire de grosses images et à afficher uniquement les parties visibles. Cela se dit, je voudrais passer à WPF non seulement pour les raisons données dans les réponses ci-dessus, mais également pour le bon soutien de l'imagerie proposé. Voir Ce lien pour plus d'informations


0 commentaires