Bei Debugger(Off) läuft das Programm nicht richtig.Warum ?
Übersicht

![]() |
LordArtusBetreff: Bei Debugger(Off) läuft das Programm nicht richtig.Warum ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habe folgendes Problem und komme nicht auf die Lösung:
Bei eingeschalteten Debugger läuft das Programm richtig (d.h. bei mir ca. mit 340 FPS und Kollisionsabfrage).Ist der Debugger ausgeschaltet läuft das Programm falsch ab (d.h. 85FPS (gleich der Wiederholfrequenz meines Monitors in der Auflösung) und keine Kollisionsabfrage). Würde gerne wissen ob es sich um ein Bug vom Blitzbasic handelt oder muss ich etwas in mein Programm extra einbauen damit es richtig läuft ? (aber komisch , dass es mit aktivierten Debugger richtig läuft) Würde mich sehr freuen , wenn mir jemand helfen könnte. Danke im Vorraus. Hier das Listing: Code: [AUSKLAPPEN] Graphics 1280,1024
;ShowPointer SeedRnd MilliSecs() ;Wieviele Punkte sollen gezeichnet werden (anz=Anzahl+1) anz=1000 ;Feld anlegen Dim tx#(anz),ty#(anz),txz#(anz),tyz#(anz),rgb1(anz) ;Startposition der Punkte (Zufällig) For a=0 To anz tx#(a)=Rand(6,1272) ty#(a)=Rand(6,1016) ;Geschwindigkeit und Richtung der Punkte (Zufällig) txz#(a)=Rnd#(0.01,2) tyz#(a)=Rnd#(0.01,2) ;Pixelfarbe (am Anfang Weiss) rgb1(a)=$ffffff Next ;Textfarbe Color 0,255,255 ;Variablen für FPS-Berechnung z=MilliSecs() zi=0 zii=0 ;Hauptschleife While Not KeyHit(1) ;FPS berechnen zi=zi+1 timer=MilliSecs() If (timer-z)>999 Then zii=zi zi=0 z=MilliSecs() EndIf ;----------------- Cls ;Punkte zeichnen LockBuffer BackBuffer() For a=0 To anz If tx#(a)>1272 Or tx#(a)<6 Then txz#(a)=-txz#(a) EndIf If ty#(a)>1016 Or ty#(a)<6 Then tyz#(a)=-tyz#(a) EndIf tx#(a)=tx#(a)+txz#(a) ty#(a)=ty#(a)+tyz#(a) WritePixelFast Int(tx#(a)),Int(ty#(a)),rgb1(a) Next UnlockBuffer BackBuffer() ;FPS Ausgeben Text MouseX(),MouseY(),"Punkteanzahl: "+anz Text 0,0,"FPS: "+zii ;Wenn Kollision (mit ReadPixelFast) , dann Richtung und Farbe ändern LockBuffer BackBuffer() For b=0 To anz rgbr1=ReadPixelFast(Int(tx#(b)+txz#(b)),Int(ty#(b)+tyz#(b))) If rgbr1=$ffffff Or rgbr1=$ff2222 Then ;Wenn Pixel Weiss , dann in Rot ändern If rgbr1=$ffffff Then rgb1(b)=$ff2222 EndIf ;Wenn Pixel Rot , dann in Weiss ändern If rgbr1=$ff2222 Then rgb1(b)=$ffffff EndIf ;Richtung ändern If txz#(b)<0 Then txz#(b)=Rnd#(0.01,2) Else txz#(b)=-(Rnd#(0.01,2)) EndIf If tyz#(b)<0 Then tyz#(b)=Rnd#(0.01,2) Else tyz#(b)=-(Rnd#(0.01,2)) EndIf EndIf Next UnlockBuffer BackBuffer() ;--------------------------------------------------------------------- Flip Wend End |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das nennt sich VSync und ist durchaus sinnvoll, da sonst häßliche Verzehr Effekte entstehen können.
Aber um es abzuschalten benutz "Flip 0" anstatt einfach nur "Flip". Das schaltet VSync ab, allerdings würd ich dir empfhelen, es an zu lassen, wo ist denn das Problem dabei? Das mit der Kollision ist allerdings seltsam, da hab ich keine Ahnung, denn eigentlich hat das nix mit der FPS-Rate zu tun(Es sei denn, man hat sehr unsauberes zeug gemacht). |
||
![]() |
LordArtus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es geht nicht um die FPS sondern um die Kollisionsabfrage und ob die was mit dem VSync zu tun haben könnte. | ||
![]() |
LordArtusBetreff: Re: Bei Debugger(Off) läuft das Programm nicht richtig.Warum |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also nochmal , mit eingeschalteten Debugger läuft das Programm richtig , sonst aber nicht. | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenns im Debugger geht und sonst nicht, so würde ich drauf tippen, dass du versuchst mit den Pixelbefehlen ausserhalb der Buffergrösse zu malen, die von 0 - graphicswidth()-1 und 0 - graphicsheight()-1 geht (nicht bis graphicsheight() / width() wie häufig fälschlich angenommen wird)
Der Debugger lässt das zu und würde bei einem fehler abbrechen (allerdings läuft er so langsam, dass er wohl nicht soweit kommt). in retail wird der debugger das allerdings nicht mehr akzeptieren. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
LordArtus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habs überprüft , das Zeichnen der Pixel kommt nicht aus den Grenzen raus (das ist mir bekannt , dass es auch überhaupt nicht läuft).
Das Programm läuft bei ausgeschaltetem Debugger schon,bloss es findet keine Kollision statt (d.h. die Pixel prallen nicht von einander ab und es ändert sich die Farbe auch nicht) das ist der ausschnitt der bei ausgeschalteten Debugger nicht ausgeführt wird. Code: [AUSKLAPPEN] ;Wenn Kollision (mit ReadPixelFast) , dann Richtung und Farbe ändern
LockBuffer BackBuffer() For b=0 To anz rgbr1=ReadPixelFast(Int(tx#(b)+txz#(b)),Int(ty#(b)+tyz#(b))) If rgbr1=$ffffff Or rgbr1=$ff2222 Then ;Wenn Pixel Weiss , dann in Rot ändern If rgbr1=$ffffff Then rgb1(b)=$ff2222 EndIf ;Wenn Pixel Rot , dann in Weiss ändern If rgbr1=$ff2222 Then rgb1(b)=$ffffff EndIf ;Richtung ändern If txz#(b)<0 Then txz#(b)=Rnd#(0.01,2) Else txz#(b)=-(Rnd#(0.01,2)) EndIf If tyz#(b)<0 Then tyz#(b)=Rnd#(0.01,2) Else tyz#(b)=-(Rnd#(0.01,2)) EndIf EndIf Next UnlockBuffer BackBuffer() ;--------------------------------------------------------------------- das wollte ich auch wissen , warum es nicht ausgeführt wird. |
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das erste was bei mir passiert, wenn ich deinen Code starte ist ein MAV.
Der wird nur verhindert, wenn ich sowohl ql:Readpixelfast als auch ql:Writepixelfast auskommentiere. Das deutet doch massiv darauf hin, daß etwas mit deiner Koordinatenberechnung nicht stimmen kann. Leider ist der Fehler den Dreamora beschrieb nicht bei jedem gleich. Nicht jeder Rechner verursacht einen MAV, wenn man außerhalb des Bildschirms versucht Pixel zu setzen. Dieses Phenomen hatte ich selbst häufig genug. Bei mir lief es einwandfrei und andere beschwerten sich über Abstürze. Ein weiterer Tip von mir : Speichere dir doch bitte die Auflösung in Variablen und benutze diese für deine Dimensionierungen. Mußte doch viel ändern um meinen Rechner, der deine Auflösung nicht unterstützt, vorm Tod durch Bildschirmauflösung zu bewahren. cheers |
||
![]() |
LordArtus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke sehr , dass Du Dir den Code genau angeschaut hast.
Zu dem Tip gebe ich Dir 100% Recht , aber hatte das Programm eigentlich ziemlich schnell geschrieben , weil wollte nur die Geschwindigkeit vom BlitzBasic testen. MAV (weiss nicht was es heisst,aber weiss was du meinst ![]() Also zu der Berechnung der Koordinaten bin ich ziemlich sicher , dass die keine Grenzbereichsverletzung aufweisen.(Könnte natürlich sein , dass die Grenzen auf verschiedenen Grafikkarten etwas anders sind,ist mir aber nicht bekannt) Man kann es austesten in dem man bei "Startposition der Punkte (Zufällig)" die Werte ändert: tx#(a)=Rand(6,1272) auf zb. Rand(10,1268) und ty#(a)=Rand(6,1016) auf zb. Rand(10,1012) und in der For Schleife , die Zuständig ist für das zeichnen der Pixel ist: LockBuffer BackBuffer() For a=0 To anz If tx#(a)>1272 Or tx#(a)<6 Then ;ändern in If tx#(a)>1268 Or tx#(a)<10 Then txz#(a)=-txz#(a) EndIf If ty#(a)>1016 Or ty#(a)<6 Then ;ändern in If ty#(a)>1012 Or ty#(a)<10 Then tyz#(a)=-tyz#(a) EndIf tx#(a)=tx#(a)+txz#(a) ty#(a)=ty#(a)+tyz#(a) WritePixelFast Int(tx#(a)),Int(ty#(a)),rgb1(a) Next UnlockBuffer BackBuffer() bloss bei mir kommt kein MAV sowohl in Debugger Modus wie auch im Normalen Modus.Der Unterschied ist nur wie schon oben erwähnt: im Debugger Modus läuft alles richtig ab im Normalen Modus wird VSync eingeschaltet und die Kollisionsabfrage wird umgangen. Und das ist ziemlich komisch meiner Meinung nach. Kann es wirklich an der Koordinatenberechnung liegen ??????????? |
||
![]() |
LordArtus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wegen den MAV:
Es sei denn natürlich auch (habe schon etwas im Forum darüber gelesen), dass etwas mit "Rand" nicht stimmt. |
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also erstmal zum Thema MAV : MAV = Memory Access Violation
So, jetzt muß ich mal kurz den Moderator raus hängen lassen ... *räusper* ... Es wäre nett, wenn du nicht immer doppelt posten würdest, sondern den netten kleinen Edit-Button ( ![]() Ansonsten fällt mir für dein Problem leider keine Lösung ein. cheers |
||
![]() |
LordArtus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bemühe mich auf jeden Fall , die Regeln im Forum einzuhalten , war keine Absicht mit dem doppelten Eintrag (Danke für den Hinweis mit dem Edit-Button , werde mich dran halten.)
Eine Frage hätte ich noch , was macht das Programm genau bei Euch (natürlich , wenn kein MAV kommt ) ? Vielleicht komme ich dann selber auf die Lösung und wenns jemanden interresieren würde , würde ich es auch posten. Meine Vermutung liegt an bestimmten Grafikkarteneinstellungen , die man mit BlitzBasic nicht ändern kann. hier nochmal ne Übersichtlichere Version: Code: [AUSKLAPPEN] ;Auflösung setzen (wegen Übersichtlichkeit)
x=1280 y=1024 Graphics x,y ;MAXGeschwindigkeit der Pixel geschw=2 ;Ränder setzen (bitte nicht kleiner als MAXGeschwindigkeit*2 "zur Sicherheit *3") x1=6 y1=6 SeedRnd MilliSecs() ;Wieviele Punkte sollen gezeichnet werden (anz=Anzahl+1) anz=10000 ;Feld anlegen Dim tx#(anz),ty#(anz),txz#(anz),tyz#(anz),rgb1(anz) ;Startposition der Punkte (Zufällig) For a=0 To anz tx#(a)=Rand(x1,x-x1-1) ty#(a)=Rand(x1,y-y1-1) ;Geschwindigkeit und Richtung der Punkte (Zufällig) txz#(a)=Rnd#(0.01,geschw) tyz#(a)=Rnd#(0.01,geschw) ;Pixelfarbe (am Anfang Weiss) rgb1(a)=$ffffff Next ;Textfarbe Color 0,255,255 ;Variablen für FPS-Berechnung z=MilliSecs() zi=0 zii=0 ;Hauptschleife While Not KeyHit(1) ;FPS berechnen zi=zi+1 timer=MilliSecs() If (timer-z)>999 Then zii=zi zi=0 z=MilliSecs() EndIf ;----------------- Cls ;Punkte zeichnen LockBuffer BackBuffer() For a=0 To anz If tx#(a)>(x-x1-1) Or tx#(a)<x1 Then txz#(a)=-txz#(a) EndIf If ty#(a)>(y-y1-1) Or ty#(a)<y1 Then tyz#(a)=-tyz#(a) EndIf tx#(a)=tx#(a)+txz#(a) ty#(a)=ty#(a)+tyz#(a) WritePixelFast Int(tx#(a)),Int(ty#(a)),rgb1(a) Next UnlockBuffer BackBuffer() ;FPS Ausgeben Text MouseX(),MouseY(),"Punkteanzahl: "+anz Text 0,0,"FPS: "+zii ;Wenn Kollision (mit ReadPixelFast) , dann Richtung und Farbe ändern LockBuffer BackBuffer() For b=0 To anz rgbr1=ReadPixelFast(Int(tx#(b)+txz#(b)),Int(ty#(b)+tyz#(b))) If rgbr1=$ffffff Or rgbr1=$ff2222 Then ;Wenn Pixel Weiss , dann in Rot ändern If rgbr1=$ffffff Then rgb1(b)=$ff2222 EndIf ;Wenn Pixel Rot , dann in Weiss ändern If rgbr1=$ff2222 Then rgb1(b)=$ffffff EndIf ;Richtung ändern If txz#(b)<0 Then txz#(b)=Rnd#(0.01,geschw) Else txz#(b)=-(Rnd#(0.01,geschw)) EndIf If tyz#(b)<0 Then tyz#(b)=Rnd#(0.01,geschw) Else tyz#(b)=-(Rnd#(0.01,geschw)) EndIf EndIf Next UnlockBuffer BackBuffer() ;--------------------------------------------------------------------- Flip 0 Wend End |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm. Bei mir gabs immer einen MAV.
Fehler den ich entdecken konnte: Du initialisierst mit Graphics, sperrst dann den Backbuffer - aber da kein setbuffer backbuffer() in Deinem Code ist, versucht er mit Writepixelfast auf den Frontbuffer zu schreiben. Nach einfügen des Setbuffer backbuffer() lief das problem bei mir rund, zeichnete 10000 Punkte ein und lief mit immerhin 39 FPS bei flip 0, für die Masse an Read und Write nicht übel. Hope it helps. EDIT: ohne Debug sogar 80 FPS. Nur von Rotfärbung sah ich nirgends was. |
||
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 |
![]() |
LordArtus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm , bei mir läufts ohne Setbuffer Backbuffer().
Genau um die Rotfärbung geht es mir. Ist bei Dir die Rotfärbung im Debugger Modus da ? |
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jawoll, ich habs gefunden...
Was BladeRunner sagte stimmt durchaus. Du benutzt wahrscheinlich BlitzPlus, da brauchst du den Backbuffer nicht mehr manuell zu setzen. Bei B3D muß man dies allerdings noch machen. Hatte ich eben garnicht dran gedacht. Jetzt zu den roten bzw. weißen Pixeln. füge mal vor all deinen Farbabfragen ein zusätzliches ff ein. Code: [AUSKLAPPEN] ; ...
; ... ; ... ;Pixelfarbe (am Anfang Weiss) rgb1(a)=$ffffffff ; ... ; ... ; ... rgbr1=ReadPixelFast(Int(tx#(b)+txz#(b)),Int(ty#(b)+tyz#(b))) If rgbr1=$ffffffff Or rgbr1=$ffff2222 Then ;Wenn Pixel Weiss , dann in Rot ändern If rgbr1=$ffffffff Then rgb1(b)=$ffff2222 EndIf ;Wenn Pixel Rot , dann in Weiss ändern If rgbr1=$ffff2222 Then rgb1(b)=$ffffffff EndIf ; ... ; ... ; ... Jetzt sollte es eigentlich funktionieren. Seit ein paar Versionen liefert ql:ReadPixelFast auch den Alphawert mit zurück. Also besteht eine mit ql:ReadPixelfast ausgelesene Farbe nicht nur aus RGB, sondern aus ARGB ! Ich sollte mich dringend mal wieder mit den antiquierten BB Versionen beschäftigen. Das hätte mir alles viel früher auffallen müssen. BMax hat mich total verweichlicht ![]() cheers |
||
![]() |
LordArtus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Super !!!, jetzt gehts d-bug , allerdings mussman noch dazu Graphics x,y auf Graphics x,y,32,1 ändern , dann läufts einwandfrei.
Dankeeeeeeeeeeeeeeeeeeeeeee euch !!! , ihr seid echt Spitze. *freu sehr* Läuft aber jetzt viel langsamer (vorher 520FPS jetzt 79FPS) also bitte vielleicht Pixelanzahl auf 1000 reduzieren ![]() p.s. benutze nur die demoversion , war auch mein fehler , dass ich es nicht angesprochen habe ![]() Und hätte noch ne Frage , weil es gibt Blitz2d , Blitz3d , BlitzMax und BlitzPlus , welche ist die beste Version von Allen eurer Meinung nach ? |
||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das kommt stark darauf an, welche Erfahrungen du schon hast, oder was du eigentlich machen willst...
Lies am besten erstmal diese Beschreibungen durch und entscheide dich dann. Wie du schnell erkennen wirst ist Blitz2D dort nicht mehr aufgeführt, denn es wird weder weiterentwickelt noch offiziell von BRL vertrieben. Ist also sozusagen eine tote Sprache. cheers |
||
![]() |
LordArtus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke sehr.
Habe mir alles durchgelesen,denke BlitzMAX wird wohl das beste sein ![]() Hier nochmal das funktionierende Programm: Code: [AUSKLAPPEN] ;Auflösung setzen
x=1280 y=1024 Graphics x,y,32,1 ;Buffer setzen SetBuffer BackBuffer() ;VSync 0=Aus 1=Ein vsync=0 ;MAXGeschwindigkeit der Pixel geschw=2 ;Ränder setzen (bitte nicht kleiner als MAXGeschwindigkeit*2 ( zur Sicherheit *3 ) ) x1=geschw*3 y1=geschw*3 ;Wieviele Punkte sollen gezeichnet werden anz=10000 ;Felder für Variablen anlegen Dim tx#(anz),ty#(anz),txz#(anz),tyz#(anz),rgb1(anz) ;Nach jedem Start neue Zufallswerte SeedRnd MilliSecs() ;Startposition der Punkte (Zufällig) For a=0 To anz-1 tx#(a)=Rand(x1,x-x1-1) ty#(a)=Rand(x1,y-y1-1) ;Geschwindigkeit und Richtung der Punkte (Zufällig) txz#(a)=Rnd#(0.01,geschw) tyz#(a)=Rnd#(0.01,geschw) ;Pixelfarbe (am Anfang Weiss) rgb1(a)=$ffffffff Next ;Textfarbe (Cyan) Color 0,255,255 ;Variablen für FPS-Berechnung z=MilliSecs() zi=0 zii=0 ;Hauptschleife While Not KeyHit(1) ;FPS berechnen zi=zi+1 timer=MilliSecs() If (timer-z)>999 Then zii=zi zi=0 z=MilliSecs() EndIf ;----------------- Cls ;Punkte zeichnen LockBuffer BackBuffer() For a=0 To anz-1 If tx#(a)>(x-x1-1) Or tx#(a)<x1 Then txz#(a)=-txz#(a) EndIf If ty#(a)>(y-y1-1) Or ty#(a)<y1 Then tyz#(a)=-tyz#(a) EndIf tx#(a)=tx#(a)+txz#(a) ty#(a)=ty#(a)+tyz#(a) WritePixelFast Int(tx#(a)),Int(ty#(a)),rgb1(a) Next UnlockBuffer BackBuffer() ;FPS Ausgeben Text MouseX(),MouseY(),"Punkteanzahl: "+anz Text 0,0,"FPS: "+zii ;Wenn Kollision (mit ReadPixelFast) , dann Richtung und Farbe ändern LockBuffer BackBuffer() For b=0 To anz-1 rgbr1=ReadPixelFast(Int(tx#(b)+txz#(b)),Int(ty#(b)+tyz#(b))) If rgbr1=$ffffffff Or rgbr1=$ffff2222 Then ;Wenn Pixel Weiss , dann in Rot ändern If rgbr1=$ffffffff Then rgb1(b)=$ffff2222 EndIf ;Wenn Pixel Rot , dann in Weiss ändern If rgbr1=$ffff2222 Then rgb1(b)=$ffffffff EndIf ;Richtung ändern If txz#(b)<0 Then txz#(b)=Rnd#(0.01,geschw) Else txz#(b)=-(Rnd#(0.01,geschw)) EndIf If tyz#(b)<0 Then tyz#(b)=Rnd#(0.01,geschw) Else tyz#(b)=-(Rnd#(0.01,geschw)) EndIf EndIf Next UnlockBuffer BackBuffer() ;--------------------------------------------------------------------- Flip vsync Wend End |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group