Schnellerer Einzelpixelbefehl als Writepixelfast?
Übersicht

FroggyBetreff: Schnellerer Einzelpixelbefehl als Writepixelfast? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Froggy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Einen Rasterizer in BB zu schreiben, der auch noch echtzeitfähig sein soll, halte ich für eine verrückte Idee ![]() 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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
es hört sich bestimmt doof an aber zeichene doch von hinten nach vorne o.O | ||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei 1280x1024 habe ich mit meinem AMD64 3200+ ebenfalls 20FPS, bei 1024x768 sind es jedoch schon 56. | ||
Starfare: Worklog, Website (download) |
Froggy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit 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. | ||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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! |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das mir Grenzen gesetzt sind, ist klar.
Es wäre nur schön, wenn man diese ein Bisschen ausweiten könnte. |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() ==> Close |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group