Frage

Ich schreibe ein C#-Steuerelement, das DirectX 9 umschließt und eine vereinfachte Schnittstelle zum Durchführen von 2D-Zeichnungen auf Pixelebene bereitstellt..NET erfordert, dass ich diesen Code in einen unsicheren Codeblock einschließe und mit der Option „unsicheren Code zulassen“ kompiliere.

Ich sperre die gesamte Oberfläche, die dann einen Zeiger auf den gesperrten Speicherbereich zurückgibt.Ich kann dann Pixeldaten direkt mit „einfacher“ Zeigerarithmetik schreiben.Ich habe dies auf Leistung getestet und eine erhebliche Geschwindigkeitsverbesserung gegenüber anderen mir bekannten „sicheren“ Methoden festgestellt.

Ist dies der schnellste Weg, einzelne Pixel in einer C#-.NET-Anwendung zu bearbeiten?Gibt es einen besseren und sichereren Weg?Wenn es einen ebenso schnellen Ansatz gäbe, der keine Zeigermanipulation erfordert, würde ich diesen lieber verwenden.

(Ich weiß, das ist 2008 und wir sollten alle DirectX 3D verwenden, OpenGL, usw., dieses Steuerelement soll jedoch ausschließlich für das 2D-Pixel-Rendering verwendet werden und erfordert einfach kein 3D-Rendering.)

War es hilfreich?

Lösung

Mit unsicheren Zeiger ist der schnellste Weg # in C direkten Speichermanipulation zu tun (auf jeden Fall schneller als die Wrapper-Funktionen Marshal verwenden).

Nur aus Neugier, welche Art von 2D-Zeichenoperationen wollen Sie durchführen?

Ich frage, weil eine DirectX Verriegelungsfläche Pixelebene Manipulationen zu tun, wird die meisten Hardware-Beschleunigung Vorteile besiegen, die eine Verwendung von DirectX zu gewinnen hoffen. Außerdem wird die DirectX-Gerät nicht initialisiert werden, wenn die Terminaldienste verwendet, über (Remote Desktop), so dass die Steuerung nicht mehr brauchbar ist in diesem Szenario (dies kann nicht für Sie).

DirectX wird ein großer Gewinn sein, wenn große Dreiecke zeichnen und Bilder (Textur auf einem Quad abgebildet) Transformieren, aber es wird nicht wirklich so toll, mit einzelnen Pixelmanipulation durchführen.

Der Aufenthalt in .NET Land, eine Alternative ist, um ein Bitmap-Objekt zu halten, wie Ihre Oberfläche zu wirken, LockBits verwenden und direkt die Pixel durch die unsicheren Zeiger in dem zurückBitmapData-Objekt zugreifen.

Andere Tipps

Ja, das ist wahrscheinlich der schnellste Weg.

Vor ein paar Jahren hatte ich zwei 1024x1024 Bilder auf Pixelebene vergleichen; die get-Pixel-Methoden dauerte 2 Minuten und die unsichere Scan dauerte 0,01 Sekunden.

Ich habe auch unsicher zu beschleunigen Dinge dieser Art verwendet. Die Leistungsverbesserungen sind dramatisch, gelinde gesagt. Der Punkt hier ist, dass unsichere ausgeschaltet wird ein paar Dinge, die Sie nicht so lange müssen möglicherweise, wie Sie wissen, was Sie tun.

Auch Besuche DirectDraw- . Es ist die 2D-Grafik-Komponente von DirectX. Es ist wirklich schnell.

Ich war vor kurzem mit der Erstellung einer einfachen Histogramm Steuerung für einen unserer Thin-Client-Anwendungen (C #) beauftragt. Die Bilder, die ich war die Analyse waren etwa 1200x1200 und ich hatte den gleichen Weg zu gehen. Ich konnte die Sache selbst kein Problem einmal ziehen, aber die Steuerung benötigte wieder ansehnliche werden. Ich habe versucht, es zu vermeiden, aber ich hatte an dem rohen Speicher selbst zu erhalten.

Ich sage nicht, es ist unmöglich, die Standard-.NET-Klassen, aber ich konnte es auch am Ende nicht bekommen zu arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top