Hallo @HexOR;
Danke für Dein Beispiel. Deine Änderungen beziehen sich ja im Wesentlichen auf das Event-Handling. Das ist in meinem eigentlichen Programm auch über WindowEvent() abgefangen. Ich habe die einzelnen Schleifen mit repeat until und keyboardinkey() hier nur deswegen einzeln eingebaut um die unterschiedliche Darstellungsweise in version 5.73 und 6.00 aufzuzeigen. Ich wusste ja nicht worin der Unterschied zwischen den Versionen lag. Die Darstellung über StartDrawing (screenoutput) ist ja die Gleiche. Was ich aber definitiv ausprobieren werde, ist, das Flip-Buffers nur einmal pro Mainloop-Durchlauf aufzurufen und dafür alle Bildbestandteile neu zu zeichnen bzw gegebenfalls auf ein komplett neues Image zu schreiben und dann darzustellen. Ich bedanke mich noch einmal ganz herzlich für Deine Hilfe. Mein Problem mit der Darstellung ist auf jeden Fall gelöst.
2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03
Re: 2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03
Noch einmal @HeXOR, der Teufel steckt wohl doch tiefer im Detail, als ich dachte. Dein Beispiel läuft ja tatsächlich auch unter OpenGL.
Es liegt also doch an meinem Programmlauf. Zunächst dachte ich, es würde nur an der Umstellung von DirectX auf openGL als Default liegen.
Ich werde deinen Programmablauf noch einmal genauer untersuchen. Ich habe jetzt wieder etwas gelernt und werde versuchen meinen Programmablauf umzustricken. Danke dafür.
Es liegt also doch an meinem Programmlauf. Zunächst dachte ich, es würde nur an der Umstellung von DirectX auf openGL als Default liegen.
Ich werde deinen Programmablauf noch einmal genauer untersuchen. Ich habe jetzt wieder etwas gelernt und werde versuchen meinen Programmablauf umzustricken. Danke dafür.
Re: 2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03
Ich hab jetzt den ganzen Beitrag gelesen und dein Beispiel getestet.
Bei mir verdeckt immer ein gelbes Rechteck den Bildschirm, der eigentliche Schirm blitzt nur ab und zu mal durch.
Das Problem liegt meiner Einschätzung nach definitiv an den ganzen FlipBuffers.
Wei bereits von HeXOR erwähnt ist das der komplett falsche Ansatz.
Ich schätze mal hier liegt ein grundsätzliches Missverständnis des FlipBuffer Befehls vor.
FlipBuffers tauscht die beiden Buffer einfach aus.
D.h. wenn du auf einen leeren Bildschrim eine Linie zeichnest, dann wird
das in den Hintergrundbuffer (Buffer B) gezeichnet.
Diese Linie wird erst sichtbar nach einem FlipBuffers. Die beiden Buffer werden getauscht.
So dass jetzt der Buffer mit der Linie angezeigt wird.
Dein Hintergrundbuffer ist aber danach leer, da dieser jetzt den anfänglich leeren Bildschirm enthält.
Wenn du jetzt parallel zur ersten, eine zweite Linie zeichnen möchtest, dann musst du die erste Linie
nochmals mit zeichnen.
Allgemein, müsstes du nach FlipBuffer deine letze Aktion nochmals Zeichnen. Dann würde das gehen.
Es macht natürlich mehr Sinn, nur einmal während eines Main-Loops FlipBuffers zu verwenden.
Ich hab das bei meinem Projekt mit einer Procedure DrawBoard() gelöst, die immer das ganze Spielfeld neu zeichnet und
danach FlipBuffers() aufruft.
Bei mir verdeckt immer ein gelbes Rechteck den Bildschirm, der eigentliche Schirm blitzt nur ab und zu mal durch.
Das Problem liegt meiner Einschätzung nach definitiv an den ganzen FlipBuffers.
Wei bereits von HeXOR erwähnt ist das der komplett falsche Ansatz.
Ich schätze mal hier liegt ein grundsätzliches Missverständnis des FlipBuffer Befehls vor.
FlipBuffers tauscht die beiden Buffer einfach aus.
D.h. wenn du auf einen leeren Bildschrim eine Linie zeichnest, dann wird
das in den Hintergrundbuffer (Buffer B) gezeichnet.
Diese Linie wird erst sichtbar nach einem FlipBuffers. Die beiden Buffer werden getauscht.
So dass jetzt der Buffer mit der Linie angezeigt wird.
Dein Hintergrundbuffer ist aber danach leer, da dieser jetzt den anfänglich leeren Bildschirm enthält.
Wenn du jetzt parallel zur ersten, eine zweite Linie zeichnen möchtest, dann musst du die erste Linie
nochmals mit zeichnen.
Allgemein, müsstes du nach FlipBuffer deine letze Aktion nochmals Zeichnen. Dann würde das gehen.
Es macht natürlich mehr Sinn, nur einmal während eines Main-Loops FlipBuffers zu verwenden.
Ich hab das bei meinem Projekt mit einer Procedure DrawBoard() gelöst, die immer das ganze Spielfeld neu zeichnet und
danach FlipBuffers() aufruft.
Re: 2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03
noch was ist mir aufgefallen!
Die Keyboard Loops! Das ist nicht der beste Weg, um auf Tastatureingaben zu warten.
Hier wird der Prozessor nicht freigegben und hat folglich egal wie schnell er ist immer 100% Auslastung.
Auch eine Event-Verarbeitung für das Fenster fehlt.
Das muss sein, sonst schmiert das Programm beim Überlauf des Event-Buffers ab
Etwa so in die Richtung!
Die Keyboard Loops! Das ist nicht der beste Weg, um auf Tastatureingaben zu warten.
Hier wird der Prozessor nicht freigegben und hat folglich egal wie schnell er ist immer 100% Auslastung.
Auch eine Event-Verarbeitung für das Fenster fehlt.
Das muss sein, sonst schmiert das Programm beim Überlauf des Event-Buffers ab
Code: Alles auswählen
Repeat
taste$=""
ExamineKeyboard()
taste$=KeyboardInkey()
Until taste$<>""
Code: Alles auswählen
Structure TDrawFlags
xDrawMenu.i
xDrawBackground.i
EndStructure
Global DrawFlags.TDrawFlags
Repeat
Event = WindowEvent()
ExamineKeyboard()
; Tastenauswertung und DrawFlags setzten
DrawBoard()
Delay(5) ; hier das Delay gibt den Task für 5ms frei
Until KeyboardPushed(#PB_Key_Escape) Or Event = #PB_Event_CloseWindow
Procedure DrawBoard()
StartDrawing(ScreenOutput())
With DrawFlags
; hier DrawFlags wieder auswerten und entspechend Zeichnen
If \xDrawBackground
EndIf
If \xDrawMenu
EndIf
EndWith
StopDrawing()
FlipBuffers()
EndProcedure
Re: 2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03
@SMaag Danke für den Hinweis, Diese Dauerschleife habe ich nur in diesem Beispielprogr. verwendet, um die Unterschiede zwischen 5.73 LTS und 6.0 aufzuzeigen, die ich mir nicht erklären konnte, bis @HexOR mich dankenswerterweise darauf hinwies, daß seit 6.0 opengl als Standard-Library dient. Nachdem ich jetzt directx11 als Subsystem eingetragen habe, funktioniert die Ausgabe ja auch wieder.
Das ist die eigentliche Hauptschleife, wobei in SYS_Action die events ausgewertet werden hinsichtlich Mausclicks bzw. Tastatureingaben
und einmal pro sekunde gibt die Sys_Zeit die Spielzeit auf dem Screen aus. und ME(nschen)ZU(g) wertet die Eingaben aus.
Danke für Deine Hilfe
Ergänzung:
Die Sache mit den Flipbuffers, muss ich noch ergründen. In allen Projekten bisher hat das geklappt, weil hier Directx wohl anders arbeitet als opengl.
Jetzt werde ich den derzeitigen screen als Sprite übernehmen und dann die Änderungen neu zeichnen.
Code: Alles auswählen
Hauptspiel:
wy=WindowHeight(#win1) ; Bestimmung der tatsächlichen Fenstergröße y
wx=WindowWidth(#win1) ; Bestimmung der tatsächlichen Fenstergröße x
If wx<>#win1_x:gg(3)=2:EndIf ; Größe des Spielfensters 0=normal;1=min;2=max
taste=0
timanfang=ElapsedMilliseconds()
Repeat
mausx=Int(#win1_x/wx*WindowMouseX(#win1))
mausy=Int(#win1_y/wy*WindowMouseY(#win1))
mausz=Mauszone()
event=WindowEvent()
If event
SYS_ACTION(event)
Else
Delay(5)
SYS_ZEIT()
EndIf
event=0
MEZU()
Until gg(1)>0
und einmal pro sekunde gibt die Sys_Zeit die Spielzeit auf dem Screen aus. und ME(nschen)ZU(g) wertet die Eingaben aus.
Danke für Deine Hilfe
Ergänzung:
Die Sache mit den Flipbuffers, muss ich noch ergründen. In allen Projekten bisher hat das geklappt, weil hier Directx wohl anders arbeitet als opengl.
Jetzt werde ich den derzeitigen screen als Sprite übernehmen und dann die Änderungen neu zeichnen.