"TEXT"e verschwinden nach gewisser Zeit

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Eyes_Only

Betreff: "TEXT"e verschwinden nach gewisser Zeit

BeitragDi, Jan 29, 2013 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community,

ich habe ein großes Problem. Shocked

In meinem Spiel läuft eine for-each Type Abfrage die ganze Zeit durch und im Anschluss kommt eine Zeichenroutine, welche die Namen der Spielobjekte ausgibt:

BlitzBasic: [AUSKLAPPEN]
Repeat
Cls
For obj.TObj = Each TObj
zaehler=zaehler+1 ;Types durchzaehlen
objzeichnen() ;Gegenstände zeichnen
klickobj() ;Linksklickroutine
moveobj() ;Objekte nach Klick bewegen
deleteobj() ;Objekte außerhalb des Bildschirms löschen
Next

;Zeichenroutine
For obj.TObj = Each TObj
If obj\ID=0 Then
Text 150,20,obj\name
ElseIf obj\ID=1 Then
Text 300,20,obj\name
...
EndIf
Next

WaitTimer (frameTimer)
Flip 0

Until KeyHit(1)


Mein Problem ist nun, dass wenn das Spiel 1:19min. im Leerlauf läuft, alles Texte nach Ablauf dieser Zeit verschwinden und das Spiel sich aufhängt.
Wenn man Aktionen vornimmt und ein bisschen spielt, verschiebt sich dieser Zeitraum etwas nach hinten, tritt aber immer wieder auf.

Hat jmd. eine Idee, woran das liegen könnte? Confused

BladeRunner

Moderator

BeitragDi, Jan 29, 2013 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Vermutung ist dass Du zuviele Objekte erstellst und irgendwann der Speicher voll ist.
Lässt sich anhand dieses Stückerls Code allerdings nicht verifizieren.
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
 

Eyes_Only

BeitragDi, Jan 29, 2013 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, eigentlich nicht, sind immer bloß 10 Objekte pro Level, aber ich hab's hier mal hochgeladen:

[erledigt]

Zip-Datei mit Code & Bildern

Danke
  • Zuletzt bearbeitet von Eyes_Only am Di, Jan 29, 2013 21:10, insgesamt einmal bearbeitet

Holzchopf

Meisterpacker

BeitragDi, Jan 29, 2013 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine erste Vermutung hat sich beim durchstöbern deines Quelltextes direkt bestätigt: Du lädst Medien in der Hauptschleife Shocked Und zwar mittels LoadFont, was gleich zwei mal in der Funktion zeichnen() aufgerufen wird. Lade Fonts - genau wie alle anderen Medien - nur einmal zu Beginn der Programmausführung.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Eyes_Only

BeitragDi, Jan 29, 2013 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh Klasse, sehr cool, das war's. Tausend Dank Holzchopf!!! Cool

Dass ich die Dateien nicht in der Hauptschleife laden sollte muss ich mir unbedingt merken.

Smile

PSY

BeitragDi, Jan 29, 2013 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

wurde hier https://www.blitzforum.de/foru...highlight= bereits erwaehnt Wink
Punkt 5 bei konstruktiver Kritik.

10 Print "Ich darf keine boesen Fonts in der Mainloop laden";
20 Goto 10
RUN

Laughing


PSY
PSY LABS Games
Coders don't die, they just gosub without return
 

Eyes_Only

BeitragDi, Jan 29, 2013 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh man, ich bin ja doof...
Habe damals nach deiner konstruktiven Kritik den Font auch oben geladen.
Dann habe ich aber den Coder geändert und einen zweiten font hinzugefügt und habe dann wieder alles verschoben, weiß der Geier warum... Confused

Aber danke! Very Happy

Dass ich nicht in der Mainloop laden soll, gilt das auch für Bilder und Sounds?

PSY

BeitragDi, Jan 29, 2013 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

klar, erst Recht fuer Bilder und Sounds.

Die werden 1x geladen, danach sind sie im Speicher und koennen ueber ihr Handle angesprochen werden.


PSY
PSY LABS Games
Coders don't die, they just gosub without return

Holzchopf

Meisterpacker

BeitragDi, Jan 29, 2013 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt mehrere gute Gründe, wieso man nur einmal lädt:


  • Laden (von Bildern, Sounds und Schriftarten) ist mit Von-der-HD-Lesen verbunden und dementsprechend langsam
  • Die zu ladenden Medien müssen unter Umständen Dekodiert werden, so dass die Hardware /die Treiber damit was anfangen können - auch das ist langsam
  • Geladene Medien nehmen Arbeitsspeicher (RAM) in Anspruch. Immer wieder das selbe zu laden, müllt nur den RAM unnötig zu. Was passiert, wenn dein Programm keinen zusätzlichen Speicher vom Betriebssystem kriegt, weisst du ja jetzt Wink
  • Geladene Medien bleiben im Arbeitsspeicher und können mehrmals benutzt (gezeichnet, abgespielt oder wasauchimmer werden), mit Ausnahme von Grafiken im Vollbildmodus gehen die auch nicht einfach so mal verloren


Das ist wohl so das wichtigste.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

PSY

BeitragMi, Jan 30, 2013 8:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Holzchopf hat Folgendes geschrieben:
mit Ausnahme von Grafiken im Vollbildmodus gehen die auch nicht einfach so mal verloren


Verschwinden Grafiken im Vollbildmode ab und an?

PSY
PSY LABS Games
Coders don't die, they just gosub without return

DAK

BeitragMi, Jan 30, 2013 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, allerdings nur dann, wenn z.B. rausgetabbt wird, also nicht ganz von allein. Das liegt daran, dass im Vollbildmodus die Grafikkarte quasi alleine deinem Programm gehört, und beim Raustabben sie dann mit allen offenen Programmen geteilt wird (das ist auch der Grund, warum Spiele im Vollbildmodus viel schneller rennen, als im Fenstermodus). Bei dem Umschalten von "gehört nur mir" auf "gehört allen" wird dabei üblicherweise der Grafikspeicher geleert. Das heißt, dass du beim wieder reintabben entweder gar nix oder nutzloses Hintergrundrauschen (falsch interpretierte Überreste von anderen Programmen im Grafikspeicher) in den gespeicherten Grafiken hast. Ergebniss: dein Spiel schaut zum Kotzen aus.

Damit man nicht dauernd die Grafiken neu laden muss, hat BB die nette Funktion GraphicsLost. Gibt die eine 1 zurück, muss man alles neu laden. Was darum ganz gescheit ist, ist dass man alle Graphiken in einer Funktion lädt, die ein Mal am Anfang und immer dann, wenn GraphicsLost 1 zurück gibt, aufruft.

BlitzBasic: [AUSKLAPPEN]


loadGraphics()
While (gameIsRunning)
If (GraphicsLost()) Then loadGraphics()
... ;Rest der Hauptschleife
Wend

Function loadGraphics()
a = LoadImage("pfadA")
b = LoadImage("pfadB")
... ;Rest der zu ladenden Bilder.
End Function
Gewinner der 6. und der 68. BlitzCodeCompo
  • Zuletzt bearbeitet von DAK am Do, Jan 31, 2013 13:18, insgesamt einmal bearbeitet

ZEVS

BeitragMi, Jan 30, 2013 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
BlitzBasic: [AUSKLAPPEN]

If (GraphicsLost) Then loadGraphics()

Ist falsch. Ehe noch ein Thread zu diesem Thema aufgemacht wird, man muss GraphicsLost auch aufrufen und nicht nur den Funktionspointer überprüfen:
BlitzBasic: [AUSKLAPPEN]
If (GraphicsLost()) Then loadGraphics()


ZEVS
 

PacMani

BeitragMi, Jan 30, 2013 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum ist so etwas gruseliges wie Funktionsaufrufe ohne Klammernpaar in BB überhaupt möglich? In anderen Sprachen ist das der Einheitlich- und Lesbarkeit zu Recht ein widerlicher Syntaxfehler.

PSY

BeitragMi, Jan 30, 2013 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,

achso, das wusste ich. Ich dachte es gibt da noch irgendwelche anderen Bugs.

Bei Get The Gems (Blitz3D, benutzt aber nur 2D) mach ich das so:
Drueckt der Spieler TAB, ALT oder ne Windowstaste, geht das Spiel automatisch in Pausenmodus und markiert den Imagebuffer als dirty:

Code: [AUSKLAPPEN]
If KeyHit(56) Or KeyHit(15) Or KeyHit(220) Or KeyHit(219) Then bufferdirty ImageBuffer(screengrab)


Wenn ich dann zuruecktabbe sind alle Grafiken ok (Ich zeichne nur Bewegungen im imagebuffer. Wenn ich ohne bufferdirty arbeite, sieht man quasi nur sich nicht bewegende Hintergrundgrafiken, der Rest ist weg).

Falls aus irgendeinem Grund Windows den Focus auf das Game verliert, kann man den Buffer durch 2xESC (Pausenmodus und wieder zurueck) auch von Hand wieder fixen.

Bin damit eigentlich ganz gut gefahren...


PSY

(edit) aber Graphicslost und neu laden test ich auch mal aus. Falls man naemlich waehrend einer Fadingroutine ins Game tabbed, funzt bufferdirty nicht, da man ins Faden bei 2D nicht eingreifen kann und somit kein Bufferdirty an der richtigen Stelle absetzen kann.
Danke fuern Tip DAK!
PSY LABS Games
Coders don't die, they just gosub without return

Jamagin

BeitragMi, Jan 30, 2013 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Am besten die Blitz3D IDE V1.85 und Linker V1.85 zurückupdaten! Bis zu dieser Version gibt es keine Probleme mit verschwindenden Grafiken falls man das Programm auf die Taskleiste legt! (Vollbildmodus)!

Ab Version 1.86 verschwinden die Grafiken im Vollbildmodus!


lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

PSY

BeitragMi, Jan 30, 2013 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Was echt?

Muss ich mal austesten. Dafuer hab ich dann wahrscheinlich aber andere Probleme (die aber wohl nur 3D betreffen). Muss mich mal durch die ganzen Patchlogs lesen.

Danke fuer den Tip!


PSY
PSY LABS Games
Coders don't die, they just gosub without return
 

PacMani

BeitragMi, Jan 30, 2013 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist mir alles neu was du sagst, jamagin.
 

BBPro2

BeitragDo, Jan 31, 2013 2:44
Antworten mit Zitat
Benutzer-Profile anzeigen
PacMani hat Folgendes geschrieben:
Das ist mir alles neu was du sagst, jamagin.


same
ich nehme an das war schlichtweg zufall bei jamagin (so wie es eh "zufall" ist ob die grafiken gelöscht werden)
fakt ist: das problem kann auch bei älteren versionen auftreten - genauso wie es bei neueren nicht auftreten kann.
hängt halt von anderen faktoren ab

Jamagin

BeitragDo, Jan 31, 2013 8:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Glaub ich nicht das das Zufall ist! Ich habe das auch nur von einem Programmiererfreund erfahren! Es ist tatsächlich so!

Versuch ein Vollbildmodus (Spiel) mit der letztgütligen IDE V1.06 glaub ich und LINKER, dann auf die Version V1.85 runtergestuft und den gleichen Test machen!

Wenn das Zufall ist, dann wäre die ganze Spieleprogrammierung ein Zufall und die Frage lautet nur mehr: Geht es oder geht es doch nicht...!

ha ha (ironisch)


lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte
 

Eyes_Only

BeitragDo, Jan 31, 2013 9:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Wir sind mittlerweile zwar etwas off-topic, aber das ist wohl kein Problem.

Ich bedanke mich ganz doll bei allen für ihr Feedback und die Hilfe!

Very Happy

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group