Vous cherchez une solution plus rapide que GDI pour le rendu des parcelles de données dynamiques

StackOverflow https://stackoverflow.com/questions/1074813

Question

J'ai écrit d'un simple traceur de données à base de GDI en C ++ / CLI, mais il est pas particulièrement rapide (certains profils de base indique qu'il est le rendu à l'écran qui est le problème).

Est-il possible d'activer l'accélération matérielle pour un UserControl ou est-il une interface .NET pour Direct3D? ... ou y at-il d'autres options que je pourrais prendre en considération.

Nous utilisons le code managé de sorte que la solution doit vraiment être CLI compatible si possible.

[Modifier] Dans le cas où il aide, je bandes déchirantes (128 points de données) de rectangles qui sont chacun 2x2 pixels à l'aide Graphics::FillRectangle - peut-être il y a une meilleure façon de le faire

Était-ce utile?

La solution

Managed DirectX a été dépréciée depuis un certain temps. Vous ne voulez vraiment pas l'utiliser. , Vous devriez utiliser SlimDX qui est une couche interop open source pour les API DirectX SDK écrit en C ++ / CLI. Il est mieux que DirectX géré et est pris en charge par une communauté de développeurs experts. (Je vais travailler sur l'amélioration du soutien DirectWrite avec eux bientôt.)

Autres conseils

D'après mon expérience, vous ne serez pas obtenir assez de bonnes performances sur l'utilisation de GDI +. Même pour le dessin simple, vous vous rendrez vite compte qu'il ya beaucoup de frais généraux.

Simili serait (comme vous l'avez mentionné) être Direct3D, ou vous pourriez envisager régulièrement GDI avec appels système. Cela rend évidemment la plate-forme de code dépendant, mais il peut être assez rapide. J'ai eu de bons résultats en utilisant cela.

Tout dépend de combien la complexité vous êtes prêt à traiter. GDI peut être relativement facile une fois que vous les bases, Direct3D est un peu plus complexe. Bien que Direct3D est une preuve future.

Il est vrai que GDI + est pas très bonne performance sage, mais j'ai moi-même écrit un GDI + traceur dans un projet lié au travail qui est capable de cracher des graphiques avec des milliers de points à ~ 30 images pr seconde à une résolution de 1680x1050 (graphique de défilement).

Il a fallu beaucoup de tuning pour y parvenir:

  • Convertir tout à un seul chemin avant de tirer.
  • Si vous utilisez de nouveau-tampon, utilisez un avec le format de pixel Format32bppPArgb, cela peut accélérer blitting 2-4x.
  • Si le dessin d'un trajet avec un beaucoup de lignes verticales (signal à haute fréquence), les dessiner sous forme de lignes horizontales sur un tampon de retour au lieu, puis dessiner l'image en rotation sur l'écran. Sachez que dessiner une image rotation aussi certain coût.

Je ne vois pas comment votre scénario nécessite beaucoup d'optimisation bien, 128 points de données est rien. Mettre ces points dans un GraphicsPath pourrait faire une différence cependant, puisque cela signifierait moins de frais généraux de triage.

Quelle est la résolution et la fréquence d'images-nous parlons ici de la manière?

Microsoft a maintenant également Direct2D , qui est en 2D avec accélération matérielle dessin:

  

Direct2D est une accélération matérielle,   -Mode immédiat, API graphique 2-D que   fournit de hautes performances et   rendu de haute qualité pour 2-D   géométrie, bitmaps et texte. le   API Direct2D est conçu pour   interopérer bien avec GDI, GDI + et   Direct3D.

Il nécessite Windows 7 / Server 2008 R2, mais le soutien a été de nouveau ajoutée à Vista / Server 2008 par le Plate-forme de mise à jour pour Windows Vista

  • Windows Server 2008 SP2 avec Plate-forme de mise à jour pour Windows Server 2008
  • Licencié sous: CC-BY-SA avec attribution
    Non affilié à StackOverflow
    scroll top