Hallo zusammen,
wie der Titel schon erahnen läßt, gehts mir um Grafikprogrammierung in C# oder VB .Net. Ich bin fit in beiden Sprachen, also ist es nebensächlich. Nun aber zu dem eigentlichen:
Zuerst meine angestaubte aber immer noch funktionierende Hardware wäre ein Pentium 4 mit 3,4 GHz. 2GB Ram und die Grafikkarte wohl eher unter ferner liefen... Aktuell habe ich eine 1280x1024 Auflösung 32Bit eingestellt.
Softwaremäßig wäre da WinXP SP3 und das Visual Studio 2005 mit .Net Framework 2.0 installiert.
Aktuell bin ich soweit, dass bei den oben genannten Parametern meine FullScreen App mit "satten" 58 FPS läuft. Intern verwende ich zur Darstellung die BufferedGraphics und Bitmap Klassen. Ich versuche so schnell wie möglich ein Foto und ein rotes Dreieck darzustellen. Bei meinen Messungen ergibt sich, dass die CPU ca. 72% der Zeit damit beschäftigt ist, die Graphics.DrawImage Methode auszuführen. Ich möchte genau das weiter optimieren, um weitere FPS rauszukitzeln. Das Image liegt als Byte Array im Speicher und soll in jedem Frame verändert werden. Die entsprechenden Methoden sind so "ausgereift" dass ich da prozentual keine Steigerung mehr sehe und auch erstmal nicht möchte. Sie sind schlicht weg schnell genug für mich.
Das Ganze hat keinerlei Hintergrund, sondern mir geht es nur um das technisch machbare. Ich möchte nicht mit Managed DirectX, Hardwarebeschleunigung, WPF usw umgehen. Am Besten ist es, wenn das Ganze ohne jegliche Win API Zugriffe auskäme und unter .Net 2.0 lauffähig wäre. Unsicherer Code wäre auch möglich und wird teilweise verwendet. Abweichend von meinen Auflagen habe ich mit BitBlt experimentiert, mit dem Ergebnis dass ich entweder ein schwarzes Bild mit ca. 80 FPS habe oder das Ergebnis mit der Vorlage übereinstimmt aber dann die Framerate einbricht und ich dann bei 1 FPS lande bzw. alles stehen bleibt.
Kurz zusammgefasst: Wie kann ich so schnell wie möglich ein sich ständig veränderndes Bitmap unter Verwendung der .Net 2.0 Funktionalitäten zeichnen?
Hier noch den aktuell schnellsten Code den ich habe:
Die Initialisierung erfolgt dynamisch in Abhängigkeit von den Screen-Einstellungen. Ich habe sie für das obige Beispiel durch die aktuelle Config ersetzt. Also wer kann mir da vielleicht einen oder mehrere Tipps geben?
Nun danke ich dir speziell, dass du dir die Zeit genommen hast, das Ganze einmal durchzulesen.
Also bis dann.
Rossibaer
wie der Titel schon erahnen läßt, gehts mir um Grafikprogrammierung in C# oder VB .Net. Ich bin fit in beiden Sprachen, also ist es nebensächlich. Nun aber zu dem eigentlichen:
Zuerst meine angestaubte aber immer noch funktionierende Hardware wäre ein Pentium 4 mit 3,4 GHz. 2GB Ram und die Grafikkarte wohl eher unter ferner liefen... Aktuell habe ich eine 1280x1024 Auflösung 32Bit eingestellt.
Softwaremäßig wäre da WinXP SP3 und das Visual Studio 2005 mit .Net Framework 2.0 installiert.
Aktuell bin ich soweit, dass bei den oben genannten Parametern meine FullScreen App mit "satten" 58 FPS läuft. Intern verwende ich zur Darstellung die BufferedGraphics und Bitmap Klassen. Ich versuche so schnell wie möglich ein Foto und ein rotes Dreieck darzustellen. Bei meinen Messungen ergibt sich, dass die CPU ca. 72% der Zeit damit beschäftigt ist, die Graphics.DrawImage Methode auszuführen. Ich möchte genau das weiter optimieren, um weitere FPS rauszukitzeln. Das Image liegt als Byte Array im Speicher und soll in jedem Frame verändert werden. Die entsprechenden Methoden sind so "ausgereift" dass ich da prozentual keine Steigerung mehr sehe und auch erstmal nicht möchte. Sie sind schlicht weg schnell genug für mich.
Das Ganze hat keinerlei Hintergrund, sondern mir geht es nur um das technisch machbare. Ich möchte nicht mit Managed DirectX, Hardwarebeschleunigung, WPF usw umgehen. Am Besten ist es, wenn das Ganze ohne jegliche Win API Zugriffe auskäme und unter .Net 2.0 lauffähig wäre. Unsicherer Code wäre auch möglich und wird teilweise verwendet. Abweichend von meinen Auflagen habe ich mit BitBlt experimentiert, mit dem Ergebnis dass ich entweder ein schwarzes Bild mit ca. 80 FPS habe oder das Ergebnis mit der Vorlage übereinstimmt aber dann die Framerate einbricht und ich dann bei 1 FPS lande bzw. alles stehen bleibt.
Kurz zusammgefasst: Wie kann ich so schnell wie möglich ein sich ständig veränderndes Bitmap unter Verwendung der .Net 2.0 Funktionalitäten zeichnen?
Hier noch den aktuell schnellsten Code den ich habe:
Code:
// Felder in der Klasse mit der Initialisierung (passiert eigentlich in einer ResizeBuffer Methode)
IntPtr ptrBuffer = Marshal.AllocHGlobal(1280 * 1024 * 4);
Bitmap bmpFrame = new Bitmap(1280, 1024, 1280 * 4, PixelFormat.Format32bppArgb, ptrBuffer);
Graphics surface = this.CreateGraphics();
BufferedGraphics graphBuffer = BufferedGraphicsManager.Current.Allocate(surface, new Rectangle(0, 0, 1280, 1024));
// Mein Sorgenkind:
public void Render()
{
graphics.DrawImage(bmpFrame, 0, 0); // -> 72,88% der Zeit gehen hier drauf
post_processing(graphics); // -> 0.61 % der Zeit, uninteressant und nicht das Thema(!)
graphBuffer.Render(surface); // -> 25.9% der Zeit, uninteressant und nicht das Thema(!)
}
Die Initialisierung erfolgt dynamisch in Abhängigkeit von den Screen-Einstellungen. Ich habe sie für das obige Beispiel durch die aktuelle Config ersetzt. Also wer kann mir da vielleicht einen oder mehrere Tipps geben?
Nun danke ich dir speziell, dass du dir die Zeit genommen hast, das Ganze einmal durchzulesen.
Also bis dann.
Rossibaer