Ich bin ein Wissenschaftler, der sich mit C für numerische Berechnungen sehr wohl fühlt, aber ich brauche etwas Hilfe bei der Anzeige der Ergebnisse. Ich möchte in der Lage sein, eine kontinuierlich aktualisierte Bitmap in einem Fenster anzuzeigen, das aus Echtzeitdaten berechnet wird. Ich würde gerne in der Lage sein, das Bild ziemlich schnell zu aktualisieren (z. B. schneller als 1 Bild / Sekunde, vorzugsweise 100 fps). Zum Beispiel:
%Vor%Was ist der einfachste Weg dies unter Linux (Ubuntu) zu tun? Was sollte ich für initializewindow () und drawimage () verwenden?
Wenn Sie nur die Daten anzeigen möchten (also keine GUI benötigen), sollten Sie sich die SDL : Es ist einfach, eine Oberfläche aus Ihren Pixeldaten zu erstellen und dann es auf dem Bildschirm anzeigen .
Inspiriert von Artelius Antwort: Ich habe auch ein Beispielprogramm gehackt:
%Vor%Ich würde SDL auch empfehlen. Es gibt jedoch ein gewisses Verständnis, das Sie sammeln müssen, wenn Sie schnelle Programme schreiben wollen, und das ist nicht die einfachste Sache.
Ich würde diesen O'Reilly-Artikel als Ausgangspunkt vorschlagen.
Aber ich werde die wichtigsten Punkte aus einer Berechnungsperspektive herunterkochen.
Was SDL "Double Buffering" nennt, wird im Allgemeinen Seitenwechsel genannt.
Dies bedeutet im Grunde, dass es auf der Grafikkarte zwei Speicherbereiche gibt, die Seiten genannt werden, von denen jeder groß genug ist, um die Daten eines Bildschirms aufzunehmen. Einer wird auf dem Monitor sichtbar gemacht, der andere ist für Ihr Programm zugänglich. Wenn Sie SDL_Flip()
aufrufen, wechselt die Grafikkarte ihre Rollen, dh die sichtbare wird programmierbar und umgekehrt).
Anstatt die Rollen der Seiten zu vertauschen, müssen Sie stattdessen die Daten von der für das Programm zugänglichen Seite auf die Monitorseite kopieren (mit %Co_de% ).
Das Umblättern von Seiten ist schnell, hat aber einen Nachteil: Nach dem Umblättern der Seite wird Ihr Programm mit einem Puffer angezeigt, der die Pixel von vor 2 Bildern enthält. Dies ist in Ordnung, wenn Sie jedes Pixel für jeden Frame neu berechnen müssen.
Wenn Sie jedoch nur kleinere Bereiche auf dem Bildschirm für jeden Frame ändern müssen und der Rest des Bildschirms nicht geändert werden muss, dann kann SDL_UpdateRect()
ein besserer Weg sein (siehe auch: UpdateRect
).
Das hängt natürlich davon ab, was Sie berechnen und wie Sie es visualisieren. Analysieren Sie Ihren Bilderzeugungscode - vielleicht können Sie ihn umstrukturieren, um etwas effizienteres daraus zu machen?
Beachten Sie, dass SDL, wenn Ihre Grafikhardware Seitenumblätter nicht unterstützt, die andere Methode für Sie verwendet.
Dies ist eine andere Frage, der Sie sich stellen müssen. Im Grunde leben Software-Oberflächen im RAM, Hardware-Oberflächen leben im Video-RAM, und OpenGL-Oberflächen werden von OpenGL-Magie verwaltet.
Abhängig von Ihrer Hardware-, Betriebssystem- und SDL-Version kann das programmatische Ändern der Pixel einer Hardwareoberfläche eine Menge Speicher kopieren (VRAM in RAM und dann zurück!). Das soll nicht bei jedem Frame passieren. In solchen Fällen funktionieren Softwareoberflächen besser. Aber dann können Sie die doppelte Pufferung und hardwarebeschleunigte Blits nicht nutzen.
Blits sind Blockkopien von Pixeln von einer Oberfläche zur anderen. Dies funktioniert gut, wenn Sie viele identische Symbole auf einer Oberfläche zeichnen möchten. Nicht so nützlich, wenn Sie eine Temperaturkarte erstellen.
Mit OpenGL können Sie viel mehr mehr mit Ihrer Grafikhardware machen (3D-Beschleunigung für einen Start). Moderne Grafikkarten haben eine Menge Rechenleistung, aber es ist schwer zu verwenden, es sei denn, Sie machen eine 3D-Simulation. Schreiben von Code für einen Grafikprozessor ist möglich, aber ganz anders als gewöhnliches C.
Hier ist ein kurzes Demo-SDL-Programm, das ich gemacht habe. Es soll kein perfektes Beispiel sein und möglicherweise Probleme mit der Portabilität haben. (Ich werde versuchen, ein besseres Programm in diesem Beitrag zu bearbeiten, wenn ich Zeit bekomme.)
%Vor%GUI stuff ist ein regelmäßig neu erfundenes Rad, und es gibt keinen Grund, kein Framework zu verwenden.
Ich würde empfehlen, entweder QT4 oder wxWidgets zu verwenden. Wenn Sie Ubuntu verwenden, wird GTK + ausreichen, da es mit GNOME kommuniziert und Ihnen möglicherweise besser gefällt (QT und wxWidgets erfordern beide C ++).
Sehen Sie sich GTK + an, QT und wxWidgets .
Hier sind die Tutorials für alle 3:
Zusätzlich zu Jed Smiths Antwort gibt es auch untergeordnete Frameworks, wie OpenGL, die oft für die Spieleprogrammierung verwendet werden. Angesichts der Tatsache, dass Sie eine hohe Bildrate verwenden möchten, würde ich so etwas in Betracht ziehen. GTK und dergleichen sind nicht primär für die schnelle Aktualisierung von Anzeigen gedacht.
Meiner Erfahrung nach war Xlib über die MIT-SHM-Erweiterung wesentlich schneller als SDL-Oberflächen, ich bin mir jedoch nicht sicher, ob ich SDL auf die optimale Weise verwendet habe.