2009-06-27 11 views
4

Erste Tests zeigen, dass GDI + (Schreiben in VB.NET) nicht schnell genug für meine Zwecke ist. Meine Anwendung muss in der Lage sein, Zehntausende von Partikeln (farbige Kreise, sehr bevorzugt Anti-Aliasing) in einer Vollbildauflösung mit 20 Bildern pro Sekunde zu zeichnen.Ultra schnelle Zeichnung in DotNET

Ich zögere, weg von GDI +, da ich auch viele der anderen erweiterten Zeichenfunktionen (Bindestriche, Bilder, Text, Pfade, Füllungen) von GDI + benötigen.

Auf der Suche nach einem guten Rat über die Verwendung von OpenGL, DirectX oder anderen Plattformen, um Partikel-Rendering aus VB.NET zu beschleunigen. Meine App ist streng 2D.

Goodwill, David

Antwort

3

Wenn Sie VB.NET verwenden möchten, dann können Sie mit XNA oder SlimDX gehen.

Ich habe etwas Erfahrung in der Erstellung von Spielen mit GDI + und XNA, und ich kann verstehen, dass GDI + Ihnen Probleme bereitet. Wenn ich wo Sie ich XNA überprüfen würde, ist es viel schneller als GDI +, weil es Ihre Grafikkarte tatsächlich zum Zeichnen verwendet und es hat viele gute Dokumentation und Beispiele online.

SlimDX sieht auch gut aus, aber ich habe keine Erfahrung damit. SlimDX ist im Grunde die DirectX-API für .NET.

+1

Beachten Sie, dass es mit früheren Versionen von XNA sehr schwierig war, WinForms-Anwendungen mit XNA zu mischen. Soweit ich weiß, wird dies jetzt unterstützt. – rein

+0

Ihr seid golden! Vielen Dank. Ich werde für eine Woche oder so beschäftigt sein, all diese Sachen auszuprobieren. –

3

Der einzige Weg, um die Geschwindigkeit, die Sie benötigen zu bekommen, ist für Software-Rendering-Hardware-Rendering wegzubewegen ... und leider, die auf OpenGL oder DirectX zu bewegen bedeutet.

Die Alternative besteht darin, Ihre Grafikroutinen so zu optimieren, dass nur die zu zeichnenden Partikel gezeichnet werden, nicht der gesamte Bildschirm/das gesamte Fenster.

Ich würde mit JaredPar zustimmen, dass Sie besser dran sind, zuerst Profiling, um zu bestimmen, ob Ihre vorhandene Codebasis verbessert werden kann, bevor Sie einen großen Wechsel zu einem neuen Framework vornehmen. DirectX ist nicht das einfachste Framework, wenn Sie damit nicht vertraut sind.

+0

Leider ist es wichtig, dass die gesamte Partikelwolke zugleich sichtbar ist. Wenn der Benutzer heranzoomt, kann ich viele der Partikel verwerfen (sie werden in OcTrees und 2D-Gittern gespeichert, so dass ein Teil einfach ist), aber sie muss auch für eine vollständig herausgezoomte Ansicht gut funktionieren. Ist es möglich, GDI + und -say-DirectX auf der gleichen Speicherbitmap zu verwenden, oder verliere ich wertvolle Millisekunden Blitting Pixel zwischen diesen beiden SDKs? –

+1

Ich denke nicht, dass es möglich ist, GDI + und DirectX auf derselben Speicherbitmap zu verwenden - die eine wird von der Grafikkarte gerendert, die andere von Software. Sie können GDI + auf die gleiche Weise wie DirectX aufzeichnen, aber das Synchronisieren kann etwas schwierig sein. – rein

2

Es ist möglich, dass das Problem in Ihrem Algorithmus und nicht GDI + ist. Profiling ist der einzige Weg, um sicher zu wissen. Ohne ein Profil ist es sehr wahrscheinlich, dass Sie zu einem neuen GUI-Framework wechseln und genau die gleichen Probleme haben.

Wenn Sie ein Profil erstellt haben, welcher Teil von GDI + hat ein Problem verursacht?

+1

Ich habe alle Optimierungen auf diesen Code geworfen, den ich kenne, aber ich war nie in der Lage, Anzeigecode richtig zu profilieren. Ich finde, dass, wenn ich dem leistungssensitiven Code Profilerstellung hinzufüge, ich immer die tatsächliche Leistung ändere (ich denke, Teilchenphysiker haben mit ähnlichen Problemen gekämpft). Die Vollbild-Zeichnung ist kein Problem. Wenn ich nur ein paar Partikel rende, ist die Bildwiederholrate sehr akzeptabel. Ich habe versucht, Partikel als gefüllte Ellipsen zu rendern, als einen einzigen GraphicsPath und mit DrawBitmap mit Sprites, die die exakt richtige Pixeltiefe und Auflösung haben. –

+0

@ David-Rutten: Hast du das jemals gelöst? Wenn ich deinen Kommentar lese, muss ich sagen, bitte erwarte nicht, dass dein Profiling es nicht verlangsamt. * Das spielt keine Rolle. * Entscheidend ist die prozentuale Zeit in jeder Routine oder Codezeile, da dies gespeichert würde, wenn diese Routine oder Codezeile nicht vorhanden wäre. Mit der Zeit meine ich * Wanduhrzeit *. Wenn das Sampling auf die In-Thread-CPU-Zeit beschränkt ist, ist es für Systemaufrufe blind, die viel Zeit in Anspruch nehmen können. –

+0

@Mike: Ich konnte das in GDI + nicht zufriedenstellend lösen. Die Verschlechterung der Anzeige bei dynamischen Neuzeichnungen scheint die einzige Lösung zu sein, mit der ich meinen Kopf umschließen könnte. Ich schaue mir GTK + jetzt an, aber mein Job hat mich in letzter Zeit besiegt und ich bin vom UI-Code zurück zur Kernentwicklung gewechselt. –

1

Da Sie in VB.net arbeiten, haben Sie versucht, WPF (Teil von .net seit 3.0) zu verwenden? Da WPF auf DirectX und nicht auf GDI + basiert, sollte Ihnen das die Geschwindigkeit geben, die Sie benötigen, obwohl die Entwicklung von WPF überhaupt nicht einfach ist.

+0

habe ich noch nicht, aber ich werde jetzt. Danke für den Tipp. Ich habe bisher DotNET2.0 benutzt, aber es gibt keinen Grund, warum ich nicht wechseln kann. –

2

Der bedeutendste Geschwindigkeitserhöhung fand ich, wenn ein Spielehersteller mit GDI + schreiben, war meine Bitmaps Format32bppPArgb zu konvertieren; -

SuperFastBitmap = ConvertImagePixelFormat (SlowBitmap, Imaging.PixelFormat.Format32bppPArgb)

Wenn Sie sind nicht in diesem Format bereits, Sie sehen den Unterschied sofort, wenn Sie konvertieren.

+0

Das ist Gerat. Vielen Dank. Weißt du, warum dieser Effekt auftritt? – BudBrot

2

Wie Jared sagte, könnte es sein, dass ein signifikanter Teil Ihrer Zyklen nicht in GDI gehen, und Sie könnten diese reduzieren.

Eine einfache Möglichkeit, diese zu finden, besteht darin, sie einige Male willkürlich anzuhalten und den Stapel zu untersuchen. Die Chance, dass Sie es bei der Verschwendung von Zeit fangen, entspricht dem Bruchteil der Zeit, die verschwendet wird.

Jede Anweisung oder Aufrufanweisung, die auf mehr als einem solchen Beispiel angezeigt wird, ist etwas, das, wenn Sie es ersetzen könnten, eine Beschleunigung sehen würde.

In general, the method is this.