FlipBuffers() verursacht Invalid Memory Access

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich hab IsScreenActive() noch nie verstanden, funktioniert dieser befehl seit pb4 denn nun wirklich?
ich würde den so verwenden:

Code: Alles auswählen

Repeat
  While IsScreenActive()=0
    Delay(80)
  Wend
  DrawStuff()
  FlipBuffers()
Until 0
oder so:

Code: Alles auswählen

Repeat
  If IsScreenActive()
    DrawStuff()
    FlipBuffers()
  EndIf
Until 0
aber in beiden fällen kann ich den deaktivierten task vom desktop aus nicht mehr aktivieren. jedenfalls bekomme ich den fullscreen nicht mehr geöffnet.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

...
pb-hilfe (IsScreenActive) hat geschrieben:Dieser Befehl muss nach einem FlipBuffers() aufgerufen werden, da die Ereignisse innerhalb von FlipBuffers() verwaltet werden.
und das hier funktioniert auch in beiden varianten

Code: Alles auswählen

InitSprite()
OpenScreen(1024,768, 32, "pmmmpffff")

Procedure drawstuff()
  ClearScreen(0)
  StartDrawing( ScreenOutput() )
    Circle(200,200,Random(50), $00ff00 )
  StopDrawing()
EndProcedure

If 0

  Repeat
    FlipBuffers()
    While IsScreenActive()=0
      Delay(80)
      FlipBuffers()
    Wend
    DrawStuff()
  Until 0

Else
  
  Repeat
    FlipBuffers()
    If IsScreenActive()
      DrawStuff()
    EndIf
  Until 0

EndIf
aber mit deinem code (blbltheworm) geht's trotzdem nich
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

#NULL hat geschrieben:...
pb-hilfe (IsScreenActive) hat geschrieben:Dieser Befehl muss nach einem FlipBuffers() aufgerufen werden, da die Ereignisse innerhalb von FlipBuffers() verwaltet werden.
na doll.. is das neu oder mit perwoll gewaschen?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

steht sowohl in der hilfe zu 3.94, als auch in der zu 4.
aber das heißt ja eh nur, dass IsScreenActive() einen wert zurückgibt, welcher im letzten flippbuffers aktualisiert wurde.
"muss nach einem FlipBuffers() aufgerufen werden" ist ja auch erfüllt, wenn der letzte flippbuffers-aufruf einen schleifendurchgang zuvor stattfand.
also

Code: Alles auswählen

  Repeat
    If IsScreenActive()
      DrawStuff()
    EndIf
    FlipBuffers()
  Until 0
funktioniert auch.
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> "muss nach einem FlipBuffers() aufgerufen werden" ist ja auch erfüllt, wenn der letzte flippbuffers-aufruf einen schleifendurchgang zuvor stattfand.

so kenn ichs auch funktionierend aus dem beispiel.

also liefer IsScreenActive() kein fehler beim ersten aufruf nach dem OpenScreen(), vor dem ersten FlipBuffers().

und längere zeit nach dem letzten FlipBuffers() ist er wohl auch sinnlos...

dann ist die aussage der help etwas verwirrend, weil z.b. KeyboardPushed() ohne vorheriges ExamineKeyboard() tatsächlich einen fehler liefert, da ist die formulierung "muss vorher bzw. nachher aufgerufen werden" passender.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

--> WasScreenActive() :lol:

..also IsScreenActive() gibt nach OpenScreen() immer 1 zurück, auch wenn man überhaupt kein FlippBuffers() verwendet, aber dann eben auch weiterhin, wenn der screen nicht mehr aktiv ist. änderungen nach einem OpenScreen() werden für IsActiveScreen() halt nur durch Flippbuffers() erkennbar.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

blbltheworm's problem scheint ein pb-bug zu sein.
nach dem wechsel vom fullscreen zum desktop mit Alt-Tab, erhält man bei der rückkehr zum vollbildschirm einen "invalid memory access" bei FlippBuffers(), insofern zuvor LoadSprite() oder CreateSprite() mit #PB_ANY benutzt wurde, unabhängig davon, ob das sprite später angezeigt wird oder nicht. ohne #PB_ANY, also mit Konstanten, funktioniert alles. wobei LoadImage() sowohl mit Konstanten, als auch mit #PB_ANY funktioniert.

Code: Alles auswählen

Global picBG.l
InitSprite()
OpenScreen(1024,768,32,"fllscrn")

file$="data\ding.bmp"

Select 3
  Case 1 :picBG=LoadSprite(  #PB_Any,file$)   ;  <-- funktioniert nicht
  Case 2 :picBG=CreateSprite(#PB_Any, 80,50)  ;  <-- funktioniert nicht


  Case 3 :LoadSprite(0,file$)
  Case 4 :CreateSprite(0, 80,50)
  
  Case 5 :picBG=LoadImage(   #PB_Any,file$)
  Case 6 :LoadImage( 0,file$)
EndSelect

; Procedure drawstuff()
;   StartDrawing( ScreenOutput() )
;     Circle(200,200,Random(50), $00ff00 )
;   StopDrawing()
;   DisplaySprite(picBG,100,100)
; EndProcedure

Repeat
  If IsScreenActive()
    ClearScreen(100<<16)
    ;drawstuff()
  EndIf
  FlipBuffers() ; <---------------------- "invalid memory access" in fall 1 und 2
  Delay(10)
Until 0
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich würde zumindest gern wissen ob jemand dieses verhalten (nicht) bestätigen kann, bzw ob das problem schon bekannt ist.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
blbltheworm
Beiträge: 217
Registriert: 22.09.2004 19:36
Wohnort: Auf der schönen Schwäbischen Alb

Beitrag von blbltheworm »

Ich hab es jetzt mal entsprechend umgeschrieben (also ohne #PB_Any) und siehe da es funktioniert.

Trotzdem sollte der Bug schnellst möglich beseitigt werden, denn es macht das ganze sehr kompliziert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich finds interessant, dass der Bug noch nicht vorher bemerkt wurde, ist der neu?

davon ab, für die art wie ich konzeptioniere, wäre es eher unpraktisch, meine sprites mit PB_Any zu erzeugen anstatt mit fest zugewiesenen Nummern.
mag sein, dass es viele so halten, und deshalb der Bug noch nicht bemerkt wurde.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten