Was ist der schnellste Weg, um ein 2D-Array von Farbtriplets auf dem Bildschirm zu zeichnen?

8

Die Zielsprache ist C / C ++ und das Programm muss nur unter Linux arbeiten, aber plattformunabhängige Lösungen werden offensichtlich bevorzugt. Ich laufe Xorg, XVideo und OpenGL sind verfügbar.

Wie viele FPS kann ich auf einem Intel Core 2 Duo mit Intel Grafik auf 1024x768 erwarten? (NUR Zeichnungsanzahl, bedenken Sie, dass die Arrays im RAM bereit sein müssen; keine genaue Prognose erforderlich)

    
Johannes Weiß 02.02.2009, 16:29
quelle

6 Antworten

9

Der schnellste Weg, um ein 2D-Array von Farbtripletts zu zeichnen:

  1. Verwenden Sie float ( nicht Byte, nicht doppelt) Speicher. Jedes Triplet besteht aus 3 Floats von jeweils 0,0 bis 1,0. Dies ist das Format, das optimal von GPUs implementiert wird (aber Graustufen GL_LUMINANCE Speicher verwenden, wenn Sie keinen Farbton benötigen - viel schneller!)
  2. Laden Sie das Array in eine Textur mit glTexImage2D hoch
  3. Stellen Sie sicher, dass der GL_TEXTURE_MIN_FILTER Texturparameter auf GL_NEAREST gesetzt ist
  4. Ordnen Sie die Textur einem geeigneten Quad zu.

Diese Methode ist etwas schneller als glDrawPixels (was aus irgendeinem Grund eher schlecht umgesetzt wird) und viel schneller als die nativen Blitting-Funktionen der Plattform.

Außerdem haben Sie die Möglichkeit, Schritt 4 ohne Schritt 2 zu wiederholen, wenn sich Ihre Pixmap nicht geändert hat, was natürlich viel schneller ist.

Zu den Bibliotheken, die nur langsames natives Blitting bieten, gehören:

  • Windows 'GDI
  • SDL auf X11 (unter Windows bietet es ein schnelles opengl-Backend bei Verwendung von HW_SURFACE)
  • Qt

Was den zu erwartenden FPS anbelangt, zeichnen Sie eine 1024x768-Textur auf einem Intel Core 2 Duo mit Intel-Grafik: etwa 60 FPS, wenn die Textur jedes Bild ändert, und> 100 FPS, falls nicht.

Aber mach es einfach selbst und sieh;)

    
Iraimbilanja 02.02.2009, 19:02
quelle
6

Ich habe das eine Weile zurück mit C und OpenGL gemacht, und habe sehr gute Leistung bekommen, indem ich einen Quad in voller Größe erstellt habe, und dann Textur-Mapping benutzt habe, um die Bitmap auf die Fläche des Quads zu übertragen.

Hier ist ein Beispielcode, hoffentlich können Sie davon Gebrauch machen.

%Vor%     
jandersson 02.02.2009 18:59
quelle
1

Wenn Sie versuchen, Pixel auf den Bildschirm zu übertragen, werden Sie wahrscheinlich sdl verwenden wollen "Oberflächen" -Facuility. Versuchen Sie für eine optimale Leistung, dass die Eingabedaten in einem ähnlichen Layout wie die Ausgabefläche angeordnet sind. Wenn möglich, vermeiden Sie es, Pixel in der Oberfläche nacheinander zu setzen.

SDL ist keine eigenständige Hardwareschnittstelle, sondern eine Portabilitätsebene, die auf vielen anderen Anzeigeebenen gut funktioniert, einschließlich DirectX, OpenGL, DirectFB und xlib, so dass Sie eine sehr gute Portabilität erhalten, und a sehr dünne Schicht über diese Technologien, so dass Sie sehr wenig Performance-Overhead darüber hinaus zahlen.

    
TokenMacGuy 02.02.2009 17:28
quelle
1

Andere Optionen außer SDL (wie erwähnt)

  • Kairo glitzert (in C, funktioniert auf allen Plattformen, aber am besten unter Linux)
  • QT Canvas (in C ++, Multiplattform)
  • OpenGL rohe API oder QT OpenGL (Sie müssen openGL kennen)
  • reines Xlib / XCB, wenn Sie Nicht-Opengl-Plattformen
  • berücksichtigen wollen

Mein Vorschlag

  1. QT, wenn Sie C ++ bevorzugen
  2. Kairo, wenn Sie C bevorzugen
kazanaki 02.02.2009 18:22
quelle
1

die Frage "wie viele fps kann ich erwarten" kann nicht ernsthaft beantwortet werden. nicht einmal wenn du den Opa des Typen nennst, der die Prozessor-Layouts gemacht hat. es hängt von vielen Variablen ab.

  • Wie viele Drillinge müssen Sie rendern?
  • wechseln sie zwischen den Frames?
  • mit welcher Rate (Sie werden die Änderung nicht bemerken, wenn es öfter als 30 Mal pro Sekunde ist)?
  • ändern sich alle Pixel die ganze Zeit oder nur einige der Pixel in einigen Bereichen?
  • Schaust du dir die Pixel ohne perspektivische Verzerrung an?
  • Siehst du immer alle Pixel?
  • Abhängig von der Version des Opengl-Treibers erhalten Sie unterschiedliche Ergebnisse

Das könnte ewig so weitergehen, die Antwort hängt ganz von Ihrem Algorithmus ab. Wenn Sie sich an den OpenGL-Ansatz halten, können Sie auch verschiedene Erweiterungen ausprobieren ( Ссылка ) ), um zu sehen, ob es Ihren Bedürfnissen besser entspricht; obwohl die bereits erwähnte glTexSubImage () -Methode ziemlich schnell ist.

    
akira 30.04.2009 15:50
quelle
0
  

Wie viele FPS kann ich bei 1024x768 erwarten?

Die Antwort auf diese Frage hängt von so vielen Faktoren ab, dass es unmöglich ist, das zu sagen.

    
Bombe 02.02.2009 16:34
quelle

Tags und Links