Speicherüberflutung!

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Travis

Betreff: Speicherüberflutung!

BeitragDi, Jun 01, 2004 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Codearchiv gibt's ja neuerdings so ein 2D-Sternenfeld und ich wollte mal meine eigene Version dazustellen. Dafür habe ich sie auf WritePixelfast umgestellt, ein wenig optimiert und einen FPS-Counter eingefügt. Wenn ich das Programm jetzt aber starte, wird sofort der komplette Speicher zugemüllt. Das führt dazu, dass innerhalb von sekunden die Auslagerungsdatei auf 2GB anwächst und das System völlig überlastet wird.

Man kann das Programm dann nur noch über den Taskmanager beenden!
Kann mir das vielleicht einer erklären? Wenn ich die Sterne jetzt versehentlich in der Hauptschleife erstellt hätte, könnte ich's ja verstehen, aber so...

Code: [AUSKLAPPEN]

Global FPSSEC = MilliSecs(), FPS, FRAMES
Graphics 800,600,16,2
SetBuffer BackBuffer()



; --- Sternenhintergrund erstellen ---
Type star
 Field x#, y#, sx#, sy#, layer, col
End Type

For i = 1 To 500
 s.star = New star
 s\x = Rnd (0,800)
 s\y = Rnd (0,600)
 s\layer = Rnd(1,4)
 s\sx# = Cos(180) * s\layer
 s\sy# = Sin(180) * s\layer
 i = s\layer*50
 s\col = a*$1000000 + i*$10000 + i*$100 + i
Next
; --- Sternenhintergrund erstellen ---



; --- Hauptprogramm ---
 Repeat
  Cls
   
  UpdateStars()
  Text 0,0, "FPS: " + fps

  Flip
 Until KeyHit(1)

End
; --- Hauptprogramm ---



; --- Sterne bewegen und anzeigen ---
Function UpdateStars()
 LockBuffer BackBuffer()

  For s.star = Each star
   s\x# = s\x# + s\sx#
   s\y# = s\y# + s\sy#

   If s\x < 0 Then s\x = 800
   If s\x > 800 Then s\x = 0
   If s\y < 0 Then s\y = 600
   If s\y > 600 Then s\y = 0

   WritePixelFast s\x, s\y, s\col
  Next

 UnlockBuffer BackBuffer()
End Function
; --- Sterne bewegen und anzeigen ---



; --- FPS ermitteln ---
Function FPS()

  FRAMES = FRAMES + 1
  If MilliSecs() - FPSSEC => 1000 Then
   FPS = FRAMES
   FRAMES = 0
   FPSSEC = MilliSecs()
  EndIf
 
 Return FPS
End Function
; --- FPS ermitteln ---
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Jan_

Ehemaliger Admin

BeitragDi, Jun 01, 2004 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
i = s\layer*50

i kommt nie auf 500!

<-- unendlich for next schleife!
between angels and insects

Garfield

BeitragDi, Jun 01, 2004 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Die ForNext Variable i wird in der Schleife verändert, das ist extrem gefährlich, vermutlich wolltest du das garnicht andere Variable und es müsste gehen Wink

bei 200 Sternen braucht das Programm 8,5 MB, bei 250 Sternen gehts ins Unendliche...
da liegt der Hase im Pfeffer
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra

Travis

BeitragDi, Jun 01, 2004 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrgh, stimmt. i nehme ich ja immer für Schleifen und das i für die Farbe habe ich als Abkürzung für Intensität gedacht. Danke, das habe ich immer total übersehen. Ein Buchstabe hinzugefügt und schon läufts...
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Gossi

BeitragDi, Jun 01, 2004 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit dem richtigen Einsatz von Local wäre dir das nicht passiert Wink
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind.

Garfield

BeitragDi, Jun 01, 2004 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Die ForNext Variable i wird in der Schleife verändert, das ist extrem gefährlich, vermutlich wolltest du das garnicht andere Variable und es müsste gehen Wink

bei 200 Sternen braucht das Programm 8,5 MB, bei 250 Sternen gehts ins Unendliche...
da liegt der Hase im Pfeffer
BlitzPlus|BMax|BMax-GUI -- Sony VAIO Win7 * MacBookPro Sierra

Travis

BeitragDi, Jun 01, 2004 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist aber echt der Hammer gewesen. Programm gestartet - Nix passiert - beenden geht nicht - Taskmanager auf Speicher: 30 MB - 140 - 500 MB - Auslagerungsdatei 0,5 GB - 1GB - 1,5GB - Resetknopf!
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Hubsi

BeitragDi, Jun 01, 2004 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Gossi hat Folgendes geschrieben:
Mit dem richtigen Einsatz von Local wäre dir das nicht passiert Wink
Question
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Markus2

BeitragDi, Jun 01, 2004 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Und an Pos 800x600 steht der Stern evtl. im Speicher irgendwo ,
hatte ich aber schon im CodeArchiv erwähnt ...

Gossi

BeitragDo, Jun 03, 2004 10:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hubsi hat Folgendes geschrieben:
Gossi hat Folgendes geschrieben:
Mit dem richtigen Einsatz von Local wäre dir das nicht passiert Wink
Question


Code: [AUSKLAPPEN]

;Local i
For i = 1 To 500
 s.star = New star
 s\x = Rnd (0,800)
 s\y = Rnd (0,600)
 s\layer = Rnd(1,4)
 s\sx# = Cos(180) * s\layer
 s\sy# = Sin(180) * s\layer
 i = s\layer*50 ;<<<<< Local  i = s\layer*50 !
 s\col = a*$1000000 + i*$10000 + i*$100 + i
Next


So wäre ihm der Fehler nicht passiert.
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind.

Travis

BeitragDo, Jun 03, 2004 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Das funzt? Ich mag diesen ganzen Global/Local-Kram nicht, das verwirrt mich nur. Da nehme ich in diesem speziellen Fall dann doch lieber einen anderen Variablennamen. Wink

Aber trotzdem interessant zu wissen, das es so geht!
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Dreamora

BeitragDo, Jun 03, 2004 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Local würd da auch net helfen

Local is dazu da, wenn du eine globale Variable A hast, in einer Funktion jedoch ebenfalls eine Variable A, dann kannst du diese per local deklarieren ( also Local A ), dann wird innerhalb beim Aufruf von A die lokale Variable genommen, nicht die globale.


Solche fehler wie dieser in diesem Source können garnicht umgangen werden, deshalb solltest du 1stellige Variablen wirklich nur für schleifendurchläufe nehmen und alles andere mit aussagekräftigen Variablen versehen. Das senkt die Gefahr für derartige Fehler drastisch
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Gossi

BeitragDo, Jun 03, 2004 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@Travis: nein, der Code geht nicht! Darum geht es ja! Wann immer du eine neue Variable benutzt, solltest du diese mit Local deklarieren. Benutzt du dann 2 Variablen (fälschlicherweise für 2 verschiedene Zwecke) würde dich BlitzBasic warnen, da du in einer Funktion 2x Local i benutzt hast. So hättest du den Fehler sofort erkannt.
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group