FlipBuffers(): [ERROR] Invalid Memory Access.

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

FlipBuffers(): [ERROR] Invalid Memory Access.

Beitrag von Vermilion »

Mein Code ist in ungefähr so aufgebaut:

Code: Alles auswählen

Repeat

  If IsScreenActive()
  
    ; Programmcode
  
  EndIf

  FlipBuffers()

ForEver
Wenn ich nun den Screen minimiere und wieder maximiere stürzt das Programm ab.

Wodran kann es liegen, dass FlipBuffers() einen Invalid Memory Access erzeugt? Als fertiges Executable heißt es nur wieder "Dingsda.exe" hat ein Problem festgestellt, und muss beendet werden."
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

mal ganz spontan ohne testen:

FlipBuffers() würde ich nur probieren, wenn der screen aktiv ist, also mit in das IF reinsetzen....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

IsScreenActive()

Beitrag von Vermilion »

In der Hilfe stand ja, dass der IsScreenActive() Befehl von FlipBuffers() verwaltet wird. Ich will ja die Anwendung anhalten wenn der Bildschirm minimiert ist. Und ob der Bildschirm immer noch minimiert ist, finde ich nur mit FlipBuffers() heraus. Bzw. IsScreenActive(), aber dazu muss ich ja FlipBuffers() ausführen.

Mir würde es auch reichen, wenn das Programm normal minimiert weiterlaufen würde, nur meldet mir dann der Compiler dass z.B. bei 2D Drawing Optionen der ScreenOutput ungültig wäre.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

1.) Entweder FlipBuffers() in die If-Abfrage reinpacken
2.) While Not IsScreenActive() : Wend - Hält die Programmausführung an, bis man wieder einsteigt, dies kommt einer Pause-Funktion gleich

//Edit: Wir haben gleichzeitig eine Nachricht geschrieben, deshalb konnte ich das vorher nicht wissen:
> Ich möchte das Programm solange anhalten
Dann nimm Variante 2!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Das geht ja auch nicht, dann maximiert er nicht mehr, da durch FlipBuffers() nicht mehr überprüft wird, ob der Screen wieder maximiert wird. Zumindest kommt des Prog dann net mehr aus der Taskleiste hoch... :cry:
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

hmm also der code stürzt bei mir nicht ab, wenn ich min+max. :?

Code: Alles auswählen

If InitSprite() And OpenScreen(800, 600, 16, "Test")
  Repeat
    If IsScreenActive()
      ClearScreen(RGB(128, 0, 0))
    EndIf
    FlipBuffers()
  Until GetAsyncKeyState_(#VK_ESCAPE)
EndIf : End
c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

Bau dir nen Minimal Loop für sowas.

jedoch verstehe ich nicht ganz warum du ein Flipbuffers brauchst ( welches ja für die Anzeige gedacht ist ) wenn dein Fenster minimiert ist ? ;)

Klar du willst das dein Spiel weiterläuft - aber überleg dir mal was du dazu brauchst ... ;)

Kleiner Tip:

In der Regel verwendet man mindestens 2 Loops ( Klar geht auch mit einem aber das ganze aufzusplitten macht schon sinn )

1: - Mainloop
2: - Drawingloop
3: - Input / Processingloop

Entweder verwendest du dafür Threads ( diese können auch unterschiedlich schnell durchlaufen , sind aber schwerer zu Handhaben ).
Oder du baust dir eine kleine Art Eventsystem welches merkt wenn das Fenster minimiert ist und dann währenddessen nicht versucht alles neuzuzeichnen .. macht eh keinen sinn... ;) und zb im Hintergrund deine Sprites bewegt, game pausiert, daten updated ..was auch immer...

Generell solltest du alle Eingaben respektive Rückgaben solcher Funktionen überprüfen um a. ein stabiles Programm schreiben zu können und b. zum leichter Debuggen.

zb.

Code: Alles auswählen

if openscreen() ..... etc.
Als Tip : Dort wo du Variablen überprüfen musst reicht ein :

Code: Alles auswählen

IF var 
...
ENDIF
anstelle eines

Code: Alles auswählen

IF var = 0
...
ENDIF
Die erste methode ist einiges shcneller zb. da nurnoch Boolisch geprüft wird und keine AND / Expression Operation mehr gemacht wird. geht natürlich nicht überall, jedoch bei Funktionen die du oft in einem Loop aufrufst solltest du drauf achten möglichst effektiv mit den ressourcen umzugehen.

Thalius
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

@nco2k
Dein Code würde auch nicht ohne IsScreenActive() abstürzen, die Gefahr besteht erst, wenn man StartDrawing() verwendet, nichteinmal, wenn man Sprites benutzt. Hab hier auch mal ein Beispiel:

Code: Alles auswählen

If InitSprite() And InitKeyboard()
  If OpenScreen(640, 480, 32, "")
    CreateSprite(0, 128, 128)
    StartDrawing(SpriteOutput(0))
      DrawText(0, 0, "Sprite", $FFFFFF, $000000)
    StopDrawing()
  Else
    MessageRequester("Fehler Screen", "Vollbild kann nicht dargestellt werden."): End
  EndIf
Else
  MessageRequester("Fehler Screen", "DirectX nicht aktuell."): End  
EndIf

Repeat
  FlipBuffers()
  
  If IsScreenActive()
    ExamineKeyboard()
    If Left(KeyboardInkey(), 1) = Chr(27)
      End
    EndIf
    
    ClearScreen($000000)
    
    DisplaySprite(0, 200, 200)
    StartDrawing(ScreenOutput())
      DrawText(200, 100, "Kein Sprite", $FFFFFF, $000000)
    StopDrawing()
  Else
    Delay(1)
  EndIf  
ForEver
Benutzeravatar
Kai
Beiträge: 264
Registriert: 29.09.2005 20:58
Computerausstattung: iMac 2019
Wohnort: Hannover
Kontaktdaten:

Beitrag von Kai »

Nen IMA kommt nur wenn du Sprites mit #PB_Any lädst,
hab das Problemm schon mal irgendwo gepostet.

EDIT: http://www.purebasic.fr/german/viewtopi ... highlight=
Meine Homepage - Aktuelle Projekte - Launcher
Letzte PB-Version - Window 7 x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Kai hat geschrieben:Nen IMA kommt nur wenn du Sprites mit #PB_Any lädst,
hab das Problemm schon mal irgendwo gepostet.
Kann ich nicht nachvollziehen, jedenfalls nicht mit der aktuellen Version!

PS: Laut Signatur benutzt Du PB 4.2, die Version hätte ich auch gerne :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten