Question

Je suis en train d'écrire un control C# qui encapsule DirectX 9 et fournit une interface simplifiée pour effectuer 2D pixel de niveau de dessin..NET exige que je envelopper ce code dans un dangereux bloc de code et le compiler avec le permettre dangereux code de l'option.

Je suis le verrouillage de l'ensemble de la surface qui la renvoie un pointeur vers la zone verrouillée de la mémoire.Je peux alors écrire les données de pixel directement à l'aide de la "simple" de l'arithmétique des pointeurs.J'ai performances testé et trouvé une substantielle amélioration de la vitesse sur les autres "safe" méthodes que je connais.

Est-ce le moyen le plus rapide pour manipuler les pixels individuels en C# .NET application?Est-il un meilleur moyen plus sécuritaire?Si il y avait une rapide approche qui ne nécessite pas de manipulation du pointeur, il serait ma préférence pour l'utiliser.

(Je sais que c'est 2008 et nous devrions tous être à l'aide de DirectX 3D, OpenGL, etc., cependant, ce contrôle doit être utilisé exclusivement pour la 2D pixel rendu et tout simplement ne nécessite pas de rendu 3D.)

Était-ce utile?

La solution

À l'aide de dangereux pointeurs est le moyen le plus rapide pour faire manipulation de la mémoire en C# (certainement plus rapide que d'utiliser le Maréchal des fonctions wrapper).

Juste par curiosité, quel genre de dessin 2D opérations essayez-vous de réaliser?

Je demande parce que le verrouillage d'une surface DirectX à faire au niveau des pixels manipulations ira à l'encontre de la plupart de l'accélération matérielle des avantages que vous espérez tirer de l'utilisation de DirectX.Aussi, le DirectX appareil ne parviennent pas à initialiser lorsqu'il est utilisé sur les services terminal server (bureau à distance), de sorte que le contrôle sera inutilisable dans ce scénario (ce qui ne peut pas d'importance pour vous).

DirectX sera une grande victoire lors de l'élaboration des grands triangles et de transformer des images (la texture plaquée sur un quad), mais il ne sera pas vraiment d'accomplir la grande avec des pixels de la manipulation.

Rester dans .NET des terres, une alternative consiste à tenir autour d'un objet Bitmap pour agir en tant que votre surface, à l'aide de LockBits et accéder directement aux pixels à travers la dangereuse pointeur dans le retour de l'objet BitmapData.

Autres conseils

Oui, c'est probablement le moyen le plus rapide.

Il y A quelques années, j'ai eu à comparer deux 1024x1024 images au niveau du pixel;le pixel méthodes a pris 2 minutes, et le dangereux scan de 0,01 seconde.

J'ai également utilisé dangereux pour accélérer les choses de cette nature.Les améliorations de performances sont spectaculaires, pour dire le moins.Le point ici est que dangereux s'éteint un tas de choses que vous ne pourriez pas besoin aussi longtemps que vous savez ce que vous faites.

Aussi, découvrez DirectDraw.Il est de la 2D graphiques composant de DirectX.Il est vraiment rapide.

Récemment, j'ai été chargé de créer un simple histogramme de contrôle pour l'un de nos client léger, applications (C#).Les images que j'était en train d'analyser étaient sur le 1200x1200 et j'ai dû aller par le même chemin.J'ai pu faire la chose de dessiner lui-même une fois sans problème, mais le contrôle nécessaire pour être re-extensible.J'ai essayé de l'éviter, mais je devais aller au raw de la mémoire elle-même.

Je ne dis pas que c'est impossible à l'aide de la norme .NET cours, mais je ne pouvais pas le faire trop de travail à la fin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top