SetColor extrem langsam

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Froggy

Betreff: SetColor extrem langsam

BeitragMi, Jun 15, 2011 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute,

ich hab das Problem, dass glColor3ub mit glVertex2i extrem viel langsamer ist, als CopyPixelFast in Blitz Basic.

Gibt es in Blitz Max etwas ähnliches wie CopyPixelFast oder gibt es einen schnelleren Befehl um die Farbe zu setzen als glColor3ub?

Mir geht es darum, entweder schnell Pixel aus einem Pixmap auf den Bildschirm zu kopieren oder die Farben in einem Array zu speichern und dann die Pixel mit diesen Farben zu zeichnen.

Ich möchte nicht auf OO verzichten, aber wenn Blitz Basic schneller ist, bleibt mir keine Wahl :/

Gruss,
froggy
 

Macintosh

BeitragMi, Jun 15, 2011 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie waärs wenn du einfach das pixmap in ein image verwandelst?
Denn beide vorhaben von dir sind langsam.
 

Froggy

BeitragMi, Jun 15, 2011 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es in Blitz Max einen Befehl, um eine Farbe direkt aus einem Timage auszulesen?


Btw: Ich habs nun gleich schnell wie BlitzBasic, indem ich rot, grün, blau als bytes in ein Array speichere und glColor3ubv verwende.

Leider läuft es noch nicht flüssig: Mit glColor3ubv habe ich 70 ms pro Bild, ohne 17 ms, aber dann ist alles gleichfarbig.

Edit: 50 ms, indem ich glColor3ubv(pixmap.PixelPtr(x,y)) verwende! Jetzt noch ein bisschen schneller, und es läuft flüssig.

ToeB

BeitragMi, Jun 15, 2011 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal doch die Pixmap direkt hin ?

BlitzMax: [AUSKLAPPEN]
DrawPixmap( Pixmap, x, y )


Dann könntest du auch so tun als ob die Pixmap dein Farb-Array ist, einfach die Farben drin einspiechern Wink

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Macintosh

BeitragMi, Jun 15, 2011 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Pixmaps malen ist aber langsam
 

Froggy

BeitragMi, Jun 15, 2011 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Missverständnis: Ich will nicht ein Bild einfach so kopieren, sondern einzelne Pixel daraus.
Ich will nämlich einen Raycaster basteln.


Was sind eigentlich Static Pixmaps und sind die schneller?

Noobody

BeitragMi, Jun 15, 2011 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Pixmaps oder gar einzelne Pixel auf den Bildschirm zu malen ist generell sehr langsam, ob nun mit Max2D oder direkt mit OpenGL. Diese Libraries sind auf hardwarebeschleunigtes 3D bzw. 2D-durch-Polygone ausgelegt, nicht auf direkte Pixelmanipulation.

Wenn du also schnelles WritePixelFast à la B3D willst, müsstest du auf eine Library wie etwa SDL zurückgreifen. Mit etwas Aufwand lässt sich die auch in BMax verwenden und bietet so klassisches 2D, wahlweise sogar kombinierbar mit OpenGL für 3D.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Froggy

BeitragMi, Jun 15, 2011 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, aber warum brauche ich so viel länger, wenn ich bei jedem Pixel die Farbe ändere, als wenn ich einfach alles gleichfarbig Pixel für Pixel einfärbe, d.h. warum sind glColor3ubv und SetColor so unglaublich langsam?

Edit: Ein Beispielprogramm, damit ihr seht, was ich meine.
Mit glColor3ub gehts zwei- bis dreimal so lange.

BlitzMax: [AUSKLAPPEN]
SetGraphicsDriver GLMax2DDriver()
Graphics 1280,720

glColor3ub(0,0,255)

ms = MilliSecs()
glBegin GL_POINTS
For i = 0 To 1280
For j = 0 To 720
glVertex2s x,y
Next
Next
glEnd
Flip

Print MilliSecs()-ms



ms = MilliSecs()
glBegin GL_POINTS
For i = 0 To 1280
For j = 0 To 720
glColor3ub(255,0,0)
glVertex2s x,y
Next
Next
glEnd
Flip

Print MilliSecs()-ms
 

Macintosh

BeitragMi, Jun 15, 2011 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
1. glColor ist garnicht so langsam
2. GL_POINTS ist sehhhr langsam
3. Pixel einzeln zeichnen ist immer sehr langsam
 

Froggy

BeitragMi, Jun 15, 2011 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Macintosh hat Folgendes geschrieben:
1. glColor ist garnicht so langsam
2. GL_POINTS ist sehhhr langsam
3. Pixel einzeln zeichnen ist immer sehr langsam


1. Doch, siehe Demo.
2. In 11-13ms 1280x720 komplett füllen finde ich nicht so sehhhr langsam.
3. Siehe 2.
 

Macintosh

BeitragMi, Jun 15, 2011 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir schauts so aus:

1280*720 * glColor3ub(0, 0, 0) - 23ms
1280*720 * glVertex2s(0, 0) - 104ms
Beide zusammen ~ 125ms

Und bei mir ist bei deinem Code die variante mit Farbe schneller. xD
 

Froggy

BeitragMi, Jun 15, 2011 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Immerhin sind das 25% mehr. Das ist schon recht viel, wenn man in Echtzeit berechnen will.
Hast du es übrigens mehrere Male versucht?
 

Macintosh

BeitragMi, Jun 15, 2011 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja mehrere male... max 1ms unterschied

mpmxyz

BeitragDo, Jun 16, 2011 9:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Was sind eigentlich Static Pixmaps und sind die schneller?

Static Pixmaps sind Pixmaps, die einen extern verwalteten Speicherbereich nutzen.
Es gibt daher keinen Geschwindigkeitsunterschied.
Eine weitere Sache: Du möchtest einen Raycaster basteln?
Dann könntest du die vertikalen Bildteile per DrawImageRect zeichnen.
Das macht dann nur noch 1024 Zeichenaufrufe anstelle von bis zu 1024*768. (Wie gesagt, der Fehler liegt hier in der Anwendung der Befehle; die sind nicht für solche Massenaufrufe gedacht.)
Wenn du unbedingt bei einzelnen Pixeln bleiben möchtest, gibt immer noch eine Möglichkeit, die auch relativ schnell ist: Shader
Das sind Programme, die auf der Grafikkarte laufen.
Es gibt dabei verschiedene Typen. In diesem Fall bräuchtest du den sogenannten Pixel-/Fragment-Shader, welcher für jeden gezeichneten Pixel ausgeführt wird.
Hier müsstest du leicht tricksen, um eine gute Raycaster-Berechnung ohne überflüssige Berechnungen durchzuführen. Es gibt nämlich auch ein paar Einschränkungen bei Shadern. So kann man zum Beispiel nicht beliebig in das Bild schreiben.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group