SetColor extrem langsam
Übersicht

FroggyBetreff: SetColor extrem langsam |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie waärs wenn du einfach das pixmap in ein image verwandelst?
Denn beide vorhaben von dir sind langsam. |
||
Froggy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Pixmaps malen ist aber langsam | ||
Froggy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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() |
||
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. glColor ist garnicht so langsam
2. GL_POINTS ist sehhhr langsam 3. Pixel einzeln zeichnen ist immer sehr langsam |
||
Froggy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Immerhin sind das 25% mehr. Das ist schon recht viel, wenn man in Echtzeit berechnen will.
Hast du es übrigens mehrere Male versucht? |
||
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja mehrere male... max 1ms unterschied | ||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group