PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 10 Sekunden Ladezeit -> "Script is hanging"



FoxClaw
26.02.2010, 09:08
Hallo COmmunity, ich entwickele schon seit geraumiger Zeit ein MegaMan Action spiel, bei dem es vor allem schnell zur Sache geht und Animationen auf Animationen geballert werden.

Anfangs hatte ich das Problem, dass mit zunehmender Ani-Zahl, diese immer langsamer geladen und das Spiel immer ruckeliger wurde.

Dann habe ich die Lösung gefunden: Den "Animations "Entruckler""-Script von Monsta(?), der beim laden des Spiels schon alle Anis vorausläd und somit das Spiel ruckelfrei läuft!

Das neue problem ist nun (was auch nur bei etwas älteren/langsameren Rechnern der Fall ist), dass die Ladezeit der Animationen durch ihre hohe Anzahl (noch < 999, aber bald...) ziemlich lang dauert und der Maker, was ich aus anderen Foren rausgelesen hatte, nach etwa 10 Sekunden Ladezeit, den Script abbricht, das Spiel abstürzt und es die Fehlermeldung "Script is haging" ausgibt -.-


Meine Frage lautet nun: weis jemand, wie ich diese Prüffunktion mit den 10 Sekunden bzw. den "Script is hanging"-Error abschalten kann?

Ich bin für jede Hilfe dankbar.

mfg
euer Fox

Shining Advances
26.02.2010, 13:33
abschalten lässt sich die funktin zwar nicht, aber man kann sie austricksen.

eine zeile bevor das entruckler script aufgerufen wird musst du das einfügen:

thread = Thread.new{loop do Graphics.update;sleep(9);end}
und eine zeile darunter diesen code:

Thread.kill(thread)

threads werden parallel ausgeführt. so kann man also alle 9 sekunden Graphics.update aufrufen.

FoxClaw
26.02.2010, 14:38
also etwa so?



thread = Thread.new{loop do Graphics.update;sleep(9);end}
$game_animations = Game_Animations.new
Thread.kill(thread)


oder direkt vor/hinter dem ganzen script?

ich versuchs mal, thx

-KD-
26.02.2010, 15:48
Du kannst es auch in eine Methode auslagern:

def long_running_process
thread = Thread.new do
loop do
sleep(5.0)
Graphics.update
end
end
result = yield
thread.kill
result
end

Das in den Scripteditor schreiben. Danach kannst du

long_running_process do
$game_animations = Game_Animations.new
end
um ein Aufhängen zu verhindern.

FoxClaw
01.03.2010, 18:21
also...

@Shining Advances

das lief gut was den "Script is hanging" angeht aber mein Betatester mit dem älteren PC meinte, die Version würde ingame langsamer sein als die letzte und auch mehr zuckeln.

trotzdem schonmal danke.

@-KD-

deins versuche ich als nächstes, vergleiche dann und nehme die bessere Lösung, Dank auch an dich

gebe euch beiden einen Credit im Endprodukt ;)

mfg
Fox

-KD-
01.03.2010, 19:52
Sind eigentlich beides die selben Lösungen xD

FoxClaw
19.03.2010, 12:55
okay hab ein Ergebnis erzielt, und zwar nehme ich das von -KD-.

beides geht, jedoch ist das von -KD- nochmal stabiler laut meinen Betatestern aus USA :P

also nochmals thx und Credits sein euch spendiert. ;)

mfg
Fox

-KD-
22.03.2010, 12:14
Wenn du es stabil haben willst, wäre evtl. sogar ein

def long_running_process
thread = Thread.new do
loop do
sleep(5.0)
Graphics.update
end
end
yield
ensure
thread.kill
end

zu überlegen. Macht dasselbe, bricht den Thread aber auch beim Wurf einer Exception korrekt ab. In der Praxis ist das aber wahrscheinlich egal, da 99,9% aller Exceptions eh zum kompletten Absturz des Spiels führen.

FoxClaw
22.03.2010, 15:37
öhm okay, jetzt wirds mir dann doch zu hoch :P

trotzdem thx, läuft nu ja alles.

ausser du magt hier noch kurz und bündig erklären, was eine "Exception" ist ^^

mfg
Fox

-KD-
22.03.2010, 21:02
Wenn irgendein Fehler im Programm auftritt, z.B. eine Musik-Datei nicht gefunden werden kann, wird eine Exception geworfen. Das kannst du dir wie 'ne Art interne Nachricht vorstellen, auf der der Fehler beschrieben wird. Das Programm gibt diese Nachricht jetzt an verschiedene Ebenen weiter bis irgendwann jemand die Nachricht abfängt und den Fehler behandelt, z.B. in dem er einfach festlegt das eine andere Musik stattdessen gespielt werden soll. In der allerletzten, obersten Ebene wird die Exception immer abgefangen, eine Fehlermeldung ausgegeben und das Spiel beendet.
Wenn jetzt innerhalb des Animationsladens irgendein Fehler auftritt, der außerhalb des Animationsladens aber behandelt wird, dann bleibt der long_running_process-Thread trotzdem am Leben. Dieser Prozess, sorgt aber im Hintergrund dafür, dass das Spiel nicht abstürzt. Wenn das Animationsladen zuende ist, soll er aber beendet werden, sonst verbraucht er nur unnütze Ressourcen. In der jetzigen Variante wird der Thread korrekt beendet, wenn eine Exception geschmissen wird.
Man ist aber selten in der Lage eine Exception zu behandeln, und normalerweise macht man das auch sehr frühzeitig (z.B. direkt nach dem Laden der Musikdatei und nicht erst etliche Ebenen darüber). Daher ist das eher ein theoretisches Problem, was in der Praxis wohl selten auftauchen sollte.

FoxClaw
22.03.2010, 21:56
wow, sehr detailiert, habs auch mit verstanden.

nochmal thx -KD-

erm naja, jetzt ist aber echt mal schluss mit diesem thread xD
habs ja immerhin hin bekommen ^^

mfg
Fox