Schnellerer Einzelpixelbefehl als Writepixelfast?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Froggy

Betreff: Schnellerer Einzelpixelbefehl als Writepixelfast?

BeitragMo, Sep 08, 2008 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich schreibe das Programm für die Abschlussarbeit meiner Matura (meines Abiturs) in Blitz Basic (bzw. Blitz Plus).

Mein Programm braucht sehr viel Ressourcen alleine um die Bildschirmpixel zu färben. Das liegt aber an Blitz Basic. Lasst dieses Programm in BB laufen:

Code: [AUSKLAPPEN]

Graphics 1280,1024,32,1
SetBuffer BackBuffer()

ms1=MilliSecs()

LockBuffer BackBuffer()

For i=0 To 1279
   For j=0 To 1023
      WritePixelFast i,j,16777215,BackBuffer()
   Next
Next

UnlockBuffer BackBuffer()

Flip

ms2=MilliSecs()

WaitKey

Cls

Text 0,0,"Millisekunden: "+(ms2-ms1)
Text 0,12,"FPS: "+Int(1000/Float(ms2-ms1))

Flip

WaitKey

End


Mein PC braucht etwa 50 Millisekunden, was 20 FPS entspricht. Und das alleine, um den Bildschirm zu plotten. In meinem Programm muss jeder Pixel einzeln gefärbt werden. Befehle wie Rect etc. sind also nicht brauchbar.

Jetzt wollte ich euch fragen, ob es eine Möglichkeit gibt, den Bildschirm so schnell wie Rect zu färben (der braucht 0 ms), dabei jedoch jeden Pixel einzeln zu färben (z.B. um je Pixel eine verschiedene Farbe zu haben).

Danke für die Antwort
 

da_poller

BeitragMo, Sep 08, 2008 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
mir fallen auf die schnelle 2 ideen ein

1. bilder die 1x1 px groß sind in passender farbe zeigen(ka wie schnell das wäre)

2. schnellere programiersprache



und so nebenbei... für was ist es nötig JEDEN EINZELNEN px zu färben?

bei der auflösung wären kleine rect mit 2x2 oder 3x3 px vllt noch vertretbar.. aber ein normaler befehl zum plotten schneller als writepixelfast fällt mir nicht ein
 

Froggy

BeitragMo, Sep 08, 2008 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, ich versuch mich an einer 3D-Engine für BB.

Da muss man halt bei jedem Pixel eines Dreieck überprüfen, ob er gezeichnet werden soll, oder ob es bereits einen Pixel gibt, der näher an der Kamera ist.

Hier noch mein Programm zum Test (Exe-File)

Gesteuert wird mit der Maus und den Tasten Q,W,E,A,S,D und beendet wird mit Escape.

Noobody

BeitragMo, Sep 08, 2008 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Einen Rasterizer in BB zu schreiben, der auch noch echtzeitfähig sein soll, halte ich für eine verrückte Idee Razz
Das einzige, was ich dir empfehlen kann, ist eine kleinere Auflösung zu wählen (320*240 oder 640*480, btw. läuft dein Testprogramm wegen der grossen Auflösung auf meinem Laptop nicht).
Bei Pixel - Manipulationen ist BB einfach nicht besonders schnell, das muss man wohl einsehen.
In anderen Sprachen wie BMax bzw. C++ liesse sich das ganze schneller erledigen, aber der Umstieg wird wohl ein Problem sein.
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

aMul

Sieger des Minimalist Compo 01/13

BeitragMo, Sep 08, 2008 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit BB wirst du einzelne Pixel nicht schneller einfärben können als mit WritePixelFast.

Mein Vorschlag: nimm eine kleinere Auflösung. Ich nehme mal an, dass es bei deiner Arbeit wohl nicht darauf ankommt, wie schön es aussieht, sondern wie es gemacht ist. Und das kannst du auf 640 * 480 auch demonstrieren.

EDIT:
Mist, Zweiter. Mr. Green

Ich hab allerdings noch eine Idee:
Es gab mal irgendwo irgendeine Lib, glaube ich, mit der man mit den Bank-Befehlen die Pixel eines Bildes verändern konnte, das könnte schneller sein, schau dich mal danach um.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Sep 08, 2008 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Für mich stellt sich die Frage, warum nur muß jeder Pixel eizelnd eingefärbt werden? Und was kann man dann mehr machen, als das Downloadbeispiel bereits zeigt?

Soll es ein Raytracer werden?
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Froggy

BeitragMo, Sep 08, 2008 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
btw. läuft dein Testprogramm wegen der grossen Auflösung auf meinem Laptop nicht

Schon möglich, es ist 1280*1024. Ausserdem muss es schon ein recht guter Laptop sein, damit du mehr als 5 FPS hast.

Zitat:
Es gab mal irgendwo irgendeine Lib, glaube ich, mit der man mit den Bank-Befehlen die Pixel eines Bildes verändern konnte, das könnte schneller sein, schau dich mal danach um.

Ok, werd ich mal machen. Weiss allerdings nicht genau, wie man eine Lib importiert etc. Hab das noch nie gemacht.

Zitat:
Für mich stellt sich die Frage, warum nur muß jeder Pixel eizelnd eingefärbt werden?

Stell dir vor ich zeichne ein Dreieck, dass hinter einem bereits gezeichneten Dreieck liegt. Dann darf dieses Dreieck das vordere nicht überschreiben. Da sich die Dreiecke aber auch schneiden könnten und somit Teile des einen Dreiecks hinter und andere Teile vor dem anderen Dreieck liegen könnten, muss ich für jeden Pixel einzeln überprüfen, ob er keinen näheren überschreibt.

Silver_Knee

BeitragMo, Sep 08, 2008 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
es hört sich bestimmt doof an aber zeichene doch von hinten nach vorne o.O

ZaP

BeitragMo, Sep 08, 2008 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei 1280x1024 habe ich mit meinem AMD64 3200+ ebenfalls 20FPS, bei 1024x768 sind es jedoch schon 56.
Starfare: Worklog, Website (download)
 

Froggy

BeitragMo, Sep 08, 2008 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Silver_Knee hat Folgendes geschrieben:
es hört sich bestimmt doof an aber zeichene doch von hinten nach vorne o.O

Und was, wenn sich Dreiecke schneiden?

Edit: Das wichtigste ist natürlich auch, dass ich die Bilder, die die Texturen liefern, nicht perspektivisch verzerren kann und daher Pixel für Pixel vom Texturbild auf das Dreieck übertragen muss.

@all:
Hab wie empfohlen eine 640*480-Version gemacht. Ist natürlich viel schneller. Trotzdem wär es natürlich schon wünschenswert, das ganze zu optimieren. Könnte mir jemand sagen, wo ich die oben erwähnte Userlib finden kann? Sad

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Sep 08, 2008 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Worauf ich eigendlich hinaus wollte ist, warum du das alles zu Fuss machen willst? Denn dafür liefert Blitz3D bereits schnelle Lösungen an (siehe Beispielcode unten). Es kann natürlich sein, dass du das alles machst, um eben genau erklären zu können was da passiert, denoch war davon nicht die Rede.

Zitat:
Stell dir vor ich zeichne ein Dreieck, dass hinter einem bereits gezeichneten Dreieck liegt. Dann darf dieses Dreieck das vordere nicht überschreiben. Da sich die Dreiecke aber auch schneiden könnten und somit Teile des einen Dreiecks hinter und andere Teile vor dem anderen Dreieck liegen könnten, muss ich für jeden Pixel einzeln überprüfen, ob er keinen näheren überschreibt.


Will also nur sicherstellen, dass du da eventuell nicht etwas übersehen hast...

Hier der Beispielcode (geht auch mit Textur, dazu dann UV-Mapping anwenden)

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(50)
Local Camera=CreateCamera()
Local Light=CreateLight()
PositionEntity Camera,0,0,-5
RotateEntity Light,90,0,0

Local Mesh=CreateMesh()
Local Face=CreateSurface(Mesh)
Local v0,v1,v2,Angle

v0=AddVertex(Face,-1,-1, 0)
v1=AddVertex(Face, 0,+1, 0)
v2=AddVertex(Face,+1,-1, 0)
VertexColor Face,v0,255,0,0,1
VertexColor Face,v1,255,255,0,1
VertexColor Face,v2,255,0,0,1
AddTriangle(Face,v0,v1,v2)

v0=AddVertex(Face,-1,+1,+1)
v1=AddVertex(Face, 0,-1, 0)
v2=AddVertex(Face,+1,+1,-1)
VertexColor Face,v0,0,255,0,1
VertexColor Face,v1,0,255,255,1
VertexColor Face,v2,0,255,0,1
AddTriangle(Face,v0,v1,v2)

UpdateNormals Mesh
EntityFX Mesh,2+16


While Not KeyHit(1)
   Angle=Angle+1
   PositionEntity Camera,Cos(Angle)*4,0,Sin(Angle)*4
   PointEntity Camera,Mesh
   
   WaitTimer(Timer)
   RenderWorld
   Flip 0
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

BladeRunner

Moderator

BeitragDi, Sep 09, 2008 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Dreiecke werden üblicherweise Tiefensortiert, d.h. was weiter weg liegt wird zuerst gezeichnet. Natürlich ist so ein Z-Buffer nicht perfekt und extrem lange Tris werden falsch sortiert, aber es bringt enorm Performance.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Froggy

BeitragDi, Sep 09, 2008 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Die Dreiecke werden üblicherweise Tiefensortiert, d.h. was weiter weg liegt wird zuerst gezeichnet. Natürlich ist so ein Z-Buffer nicht perfekt und extrem lange Tris werden falsch sortiert, aber es bringt enorm Performance.

Das einzige, was das bringen würde, wäre, dass ich nicht immer überprüfen müsste, ob der Pixel gezeichnet werden muss. Trotzdem muss ich wegen der Textur jeden Pixel einzeln zeichnen.

@hectic & all: Es geht natürlich darum, das Programm in BB2D (bzw. BP) zu schreiben!

BladeRunner

Moderator

BeitragDi, Sep 09, 2008 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Von texturiert lus ich vorher noch nix, sorry. Einfarbig hättest Du rect nehmen können.
Da alle Grafikbefehle rein 2D-basiert sind fehlt ihnen jede Hardwarebeschleunigung, und von daher wirst du auch kein schnelleres Ergebnis erhalten. Einzig ein Umsteigen auf eine 3D-Lib wäre noch drin, wobei du dann 3D-in-2D-aus-3D hättest, sprich du nutzt eine 3D Umgebung um beschleunigte 2D-Befehle zu erhalten mit denen Du 3D darstellst.
Draw3D wäre da einen Blick wert.
Aber rein softwareberechnet sind dir eben Grenzen gesetzt - einer der Gründe warum 3D-Karten überhaupt erst entwickelt wurden.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Froggy

BeitragMi, Sep 10, 2008 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mir Grenzen gesetzt sind, ist klar.
Es wäre nur schön, wenn man diese ein Bisschen ausweiten könnte.

Smily

BeitragMi, Sep 10, 2008 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
WritePixel ist ja in BB schon genau dafür gemacht wordn, die grenzen ei bisschen auzuweiten.

Du kannst aber z.B. Dreiecke von Hinten nach vorne zeichnen und jeweils mit der Hintergrundfarbe füllen. (Geht natürlich nur, wenn der Hintergrund einfarbig ist)

um echtzeitfähig gefüllte Dreiecke zu zeichnen, gibt es hier schon ein paar coderoutinen.

Irgendwo wirst du zurückstecken müssen. Das, was du willst ist in blitzbasic schlicht nicht umsetzbar

cu,
Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

Froggy

BeitragFr, Sep 12, 2008 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich werd dann wohl einfach das ganze mit 640*480 machen und schreiben, man soll nicht zu nah ranfahren (bei 0.01 FPS kann man lange warten, bis man das Programm beendet hat Wink )

==> Close

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group