2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03

Anfängerfragen zum Programmieren mit PureBasic.
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: 2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03

Beitrag von Diogenes »

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.
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: 2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03

Beitrag von Diogenes »

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.
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: 2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03

Beitrag von SMaag »

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.
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: 2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03

Beitrag von SMaag »

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

Code: Alles auswählen

   Repeat
      taste$=""
      ExamineKeyboard()
      taste$=KeyboardInkey()
   Until taste$<>""
Etwa so in die Richtung!

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

Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: 2D-Drawing Unterschiede zwischen 5.72 LTS und 6.03

Beitrag von Diogenes »

@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.

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 

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.
Antworten