Warum stürzt dieser Code ab ?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Dirk Knoop

Betreff: Warum stürzt dieser Code ab ?

BeitragDi, Mai 09, 2006 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

wenn ich folgendes Programm ausführe, läuft ca. 1 Stunde lang alles bestens.
Danach stürzt das Programm ab.

Wo liegt hier der Fehler ?

Gruß,

Dirk Knoop

Code: [AUSKLAPPEN]

Graphics 1024,768,32,1

SetBuffer BackBuffer()



start=AvailVidMem()
start1=TotalVidMem()

.schleife

aktuell=AvailVidMem()
aktuell1=TotalVidMem()


Cls
Text 10,10,"Uhrzeit: "+CurrentTime$()
Text 10,50,"Start: "+start
Text 10,70,"Jetzt: "+aktuell
Text 10,100,"Start: "+start1
Text 10,120,"Jetzt: "+aktuell1
Text 10,200,"Wie oft geladen: "+anzahl

Flip




If ChannelPlaying(ChannelID) = False
   FreeSound lied1:lied1=0
   lied1=LoadSound("Musik/Lieder/lied1.mp3")
   ChannelID=PlaySound(lied1)
EndIf


If KeyHit(1)=1 Then End

anzahl=anzahl+1


klickkurz=LoadSound ("Musik/Effekte/klickkurz.wav")
sound_nachricht=LoadSound ("Musik/Effekte/nachricht.mp3")
ereignis_ok_an=LoadImage("Bilder/Sonstiges/ereignisokan.png"):MaskImage ereignis_ok_an,1,125,255
ereignis_ja_an=LoadImage("Bilder/Sonstiges/ereignisjaan.png"):MaskImage ereignis_ja_an,1,125,255

PlaySound klickkurz


Delay 1000

FreeSound klickkurz:klickkurz=0
FreeSound sound_nachricht_ok:sound_nachricht_ok=0

FreeImage ereignis_ok_an:ereignis_ok_an=0
FreeImage ereignis_ja_an:ereignis_ja_an=0



Goto schleife
www.kostenloser-fussballmanager.de
www.discaim.de - weil Spaß kein Zufall ist
www.torchance.de - ein etwas anderer Fußball-Manager

Artemis

BeitragDi, Mai 09, 2006 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, vielleicht ist der RAM nach so vielem Laden und Löschen derart fragmentiert, dass das Programm nichts mehr richtig reinschreiben kann und abstürtz?

Hubsi

BeitragDi, Mai 09, 2006 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
sound_nachricht=LoadSound ("Musik/Effekte/nachricht.mp3")

FreeSound sound_nachricht_ok
Ok? Very Happy

Wundert mich sowieso etwas das es überhaupt eine Stunde durchhält Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Dreamora

BeitragDi, Mai 09, 2006 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Hauptfehler besteht darin, dass du überhaupt etwas in der Schleife lädst (von Goto abgesehen, dass man tunlichst meiden sollte. While / Repeat sind mit wenigen Ausnahmen vorzuziehen).

Media muss man vor der Hauptschleife laden und dann in der Hauptschleife nur noch abspielen / zeichnen. das laden in der schleife sorgt dafür, dass das ganze ruckelt (das programm bleibt stehen solange geladen wird) und füllt den ram bis dieser überfüllt ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Dirk Knoop

BeitragMi, Mai 10, 2006 5:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Der obrige Code ist sehr stark gekürzt. Insgesamt besteht mein Code aus 12000 Zeilen Code.

Ich habe hier nur vereinfacht das Problem dargestellt.

Insgesamt benötige ich für mein Spiel mehrere hundert Grafiken. Diese kann ich nicht auf einmal in den Speicher laden, da das insgesamt ca. 50 MB png.Dateien sind.

Wenn ich die alle zu Spielbeginn lade, habe ich einen freien Grafikkartenspeicher von 10 Byte.

Ich muss also innerhalb des Spiels Grafiken und Sounds nachladen und nicht mehr benötigte freigeben (mittels FreeImage und FreeSound).

Was kann ich also machen ?

Gruß,

Dirk Knoop
www.kostenloser-fussballmanager.de
www.discaim.de - weil Spaß kein Zufall ist
www.torchance.de - ein etwas anderer Fußball-Manager

theotheoderich

BeitragMi, Mai 10, 2006 7:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schon gesagt wurde, ist das nachladen von Dateien zur Laufzeit keine gute Idee. Bei einem rundenbasiertem Strategiespiel geht es noch, bei einem schnellen Actionspiel bremst es stark.

Verwende einfach kleinere Dateien.
Ich weiss, es sagt sich so leicht.
Aber nicht jede Hintergrundtextur muss 512x512 pix gross sein und in den Grafikkartenspeicher geladen werden.
Bilder als JPG mit grösserer Kompression verwenden.
Kleinere Bilder verwenden.
Keine stundenlangen Musikloops verwenden.

Mehr fällt mir jetzt auch nicht ein
Very Happy
Gruß
TheoTheoderich
--
The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer.

SoNenTyp

BeitragMi, Mai 10, 2006 7:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst einfach die Bilder nicht nicht ganz so schnell gezeichnet werden müssen (Pause-Bildschierm usw.) . In den RAM anstadt VRAM laden. Das geht mit dem "Modus" Parameter.
Gruss Der Typ.

User posted image

Hubsi

BeitragMi, Mai 10, 2006 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
theotheoderich hat Folgendes geschrieben:
Bilder als JPG mit grösserer Kompression verwenden.
Im Grafikkartenspeicher zählt das nicht mehr Wink

SoNenTyp hat Folgendes geschrieben:
Du kannst einfach die Bilder nicht nicht ganz so schnell gezeichnet werden müssen (Pause-Bildschierm usw.) . In den RAM anstadt VRAM laden. Das geht mit dem "Modus" Parameter.
Sofern er denn BlitzPlus benutzt Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Dreamora

BeitragMi, Mai 10, 2006 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Dirk: Wenn das eine stark gekürzte variante des richtigen Codes ist und der genau so katastrophal strukturiert ist mit Laden und goto jumps, dann würde ich dir dringend empfehlen, ihn zu restrukturieren ... denn wenn er denn so strukturiert wäre, könnte der Fehler theoretisch überall sein ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

SoNenTyp

BeitragMi, Mai 10, 2006 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hubsi hat Folgendes geschrieben:
...Sofern er denn BlitzPlus benutzt Very Happy

Ai. Hast recht! Sorry mein Fehler.
Gruss Der Typ.

User posted image

DerHase

BeitragMi, Mai 10, 2006 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach doch verschiedene Welten, die jeweil ein Set Grafiken haben. Am Ende eines Levels entfernst Du alle geladenen Levelgrafiken und lädst die für das nächste Level benötigten.
 

Dirk Knoop

BeitragMi, Mai 10, 2006 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich konnte das Problem auf folgenden Code verkürzen:

Code: [AUSKLAPPEN]

Graphics 1024,768,32,1
SetBuffer BackBuffer()

Repeat

If KeyHit(1)=1 Then End

c=c+1
Cls
Text 10,10,c
Flip

picture=LoadImage("picture.png")
FreeImage picture

Forever


Das Spiel ist ein Strategiespiel.
Ich benöte die Hälfte der Grafiken zu einem bestimmten Zeitpunkt.
Die andere Hälfte zu einem anderen Zeitpunkt.

Und dieses immer abwechselnd für jeweils ca. 60 Sekunden.
Und das ganze eigentlich endlos. Sagen wir mal für ca. 5 Stunden.

Naja, ich habe evtl. den Fehler gefunden. Es lag an Blitz 3D. Ich hatte noch die Version 1.94, habe jetzt auf Version 1.96 updatet.
Werde den o.g. Code mal über Nacht laufen lassen und mal sehen, ob er in 15 Stunden noch läuft, ohne abzustürzen (bekam den Hinweis auf die Version im englischen Forum).

Trotzdem Danke für Eure Hinweise und Tipps.

Am Rande: Ich programmiere seit über 20 Jahren mit GOTOs und GOSUBs.

Alle Spiele unter www.Discaim.de verwenden diese. Und die Spiele laufen, glaubt es mir!

Gruß,

Dirk Knoop
www.kostenloser-fussballmanager.de
www.discaim.de - weil Spaß kein Zufall ist
www.torchance.de - ein etwas anderer Fußball-Manager
 

Dreamora

BeitragMi, Mai 10, 2006 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke wir sollten dringend noch einmal auf etwas wichtiges hinweisen:

LADE KEINE BILDER/SOUND/MUSIK IN EINER SCHLEIFE! (nicht böse gemeint, aber scheint in den letzten Postings untergegangen zu sein oder du hast es in der Eile überlesen)


Laden von Multimedia muss vor der Hauptschleife erfolgen oder du kannst prinzipiell davon ausgehen, das es crashen wird.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Hellfront

BeitragMi, Mai 10, 2006 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Niemand hat behauptet, dass sie nciht laufen aber es gib tmehere Gründe warum, man Goto nicht mehr verwenden sollte. Natürlich kann das jeder für sich bestimmen und die funktion soll nciht in frage gestellt werden, aber gotos sind überholt und machen den code nur unnötig unsauber. Frührer war es vllt gang und gebe aber heute sind sie einfach nur hässlich und in den Programmiersürachen nur noich ein überbleibsel.
Gosubs sind meiner Meinung nach besser, aber ich verwend sie trotzdem nie. Ansonsten solltest du beherzigen, was Dreamora dir gesagt hat.

D2006

Administrator

BeitragMi, Mai 10, 2006 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
boing boing... bei Dirk Knoop würde ich, trotz meiner Enttäuschung, nicht mehr versuchen ihn zu überreden. Er programmiert halt so und er hat keinen Grund daran was zu ändern. Er programmiert für sich und wird von keinem gezwungen OOP zu verwenden oder sowas. Also lasst ihn doch.

@Dirk Knoop:
Sag bitte bescheid, ob es an der veralteten Version lag!

MfG
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Jan_

Ehemaliger Admin

BeitragDo, Mai 11, 2006 10:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin Dirk, schön dich mal wieder Hier zu sehen, in deinen Forum.

Also, bitte sage, ob es darran lag.
ansonsten, würde ich nciht alle Grafiken, jede schleife wechseln sondern nur wenn andere Gebraucht werden.
--> werden keine 1000 Ladevorgänge in einer Stunde sondern in 48 Stunden gemacht.
Andere Idee, Variablen dannach auf 0 setzten.

Was für Hardware hast du?
between angels and insects
 

Dirk Knoop

BeitragDo, Mai 11, 2006 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe jetzt auf Blitz-3D V1.96 updatet.
Heute Nacht habe ich den unten stehenden Code laufen lassen.

Nach ca. 14 Stunden brach ich den Versuch ab.
c hatte einen Wert von 264.000 !!!!!

Ich werde jetzt noch mal den ganz oben aufgeführten Code für ca. 10 Stunden ausprobieren und bin sehr gespannt.

Meines Achtens ist es auch egal, ob ein Bild in einer Schleife geladen wird oder nicht.
Wenn ich mittels LoadImage ein Bild lade, wird es irgendeinen Teil des Speichers belegen.
Wenn ich FreeImage benutze, ist doch eigentlich zu erwarten, daß dieser Speicher auch sauber wieder freigegeben wird.

Wie könnte sonst mein "Internet-PC" seit ca. 1 Jahr ohne Neustart ununterbrochen 24 Stunden am Tag laufen. Dort wird immer wieder etwas in den Speicher geladen und demnach auch immer wieder sauber freigegeben.

Ich werde morgen noch einmal Bescheid geben, ob der ganz oben genannte Code den "Dauertest" bestanden hat.

Gruß,

Dirk Knoop


Code: [AUSKLAPPEN]
Graphics 1024,768,32,1
SetBuffer BackBuffer()

Repeat

If KeyHit(1)=1 Then End
picture=LoadImage("Bilder/Intro/discaim.png") ;1024*768 Pixel !!!!

c=c+1
Cls
DrawImage picture,0,0
Text 10,10,c
Flip

file=WriteFile("test.txt")
WriteLine file,c
CloseFile file



FreeImage picture

Forever
www.kostenloser-fussballmanager.de
www.discaim.de - weil Spaß kein Zufall ist
www.torchance.de - ein etwas anderer Fußball-Manager

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group