Spiel wird sehr sehr sehr langsam (<=6 FPS) [GELÖST]
Übersicht

![]() |
M0rgensternBetreff: Spiel wird sehr sehr sehr langsam (<=6 FPS) [GELÖST] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute,
Eigentlich wollte ich heute eine Demo-Version zu dem Survivalmodus von Space Fighter (Im Worklog) veröffentlich. Habe es heute morgen spielbar gemacht und direkt einige male getestet. Leider muss ich sagen, dass mir etwas sehr unangenehmes aufgefallen ist: Bei ungefähr 20 oder mehr Gegnern, die dann auch schießen (also bei ungefähr 60 oder mehr Schüssen) wird das Spiel unspielbar langsam. Die FPS brechen bis auf 6 FPS ein. Ich vermute den Fehler in den Listen die ich benutze, obwohl mir noch nie aufgefallen ist, dass die bei so wenigen Einträgen schon so extram langsam wären. Also, ich verwende folgende Listen, die in jedem Durchlauf der Hauptschleife mindestens 1-2mal durchgegangen werden: Eine Liste mit den SChüssen vom Spieler. Eine Liste mit den Schüssen von den Gegnern. Eine Liste mit den Gegnern. Die Listen mit den Gegnern und den Schüssen gehe ich beide noch ein zweites mal durch, ineinander verschachtelt für die Kollisionsabfrage. Kann das wirklich daran liegen, dass zu viel in den Listen drin steckt? (Weniger als 100 EInträge halte ich persönlich aber nicht für sehr viel) Oder liegt das wahrscheinlich eher nicht daran? (Dann erwarte ich keine Ferndiagnose, es geht eher darum, zu wissen ob es an den Listen liegen kann oder nicht. Wenn nein muss ich mir was einfallen lassen). Wer sich das ganze mal anschauen will: https://www.blitzforum.de/upload/file.php?id=10596 Ansonsten wäre ich wirklich froh, wenn ihr mir die Fragen zu den Listen beantworten könntet. Lg, m0rgenstern |
||
- Zuletzt bearbeitet von M0rgenstern am Sa, Mai 14, 2011 20:37, insgesamt einmal bearbeitet
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Listen sind kein generelles Problem.
Entweder du hast irgendwo ein Memory Leak oder machst mehr als nötig wäre. Edit: Läuft bei mir erst mal problemlos bei 62 FPS. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey Xeres, erstmal danke fürs Testen.
Drei Fragen hab ich aber noch: 1) Mit Memory-Leak meinst du, dass kein Destruktor aufgerufen wird, oder was genau? Der Garbage Collector müsste ja die Objekte abfangen, auf die nicht mehr zugegriffen wird. Wenn irgendwas nicht mehr gebraucht wird (Schüsse, Gegner) dann werden diese Dinge einfach aus den Listen entfernt, die Zugriff drauf haben. Danach müssten die INstanzen doch vom GC gefressen werden, oder? 2) Wie weit hast dus denn ausprobiert? Bei mir ist das immer so ab der 2. bzw. 3. Mission passiert. 3) Was wäre denn zum Beispiel mehr als nötig? Lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ab der zweiten Mission sehe ich jetzt auch den Einbruch...
Bei so vielen geschossen liegt es vermutlich am ImagesCollide - Staffel die Kollisionsüberprüfungen, erst simple Rechtecke, dann erst (wenn überhaupt nötig) Pixel-genaue. Zeichne nichts, was komplett außerhalb des Bildschirms liegt. Lass dir mit liste.count() die Objektzahlen ausgeben und achte drauf, ob sie korrekt wieder kleiner wird. Aus den Listen (bzw. alle Objekt-Referenzen) entfernen reicht - sofern das richtig funktioniert. Aber einmal AND und OR verwechselt und es kann nie zum löschen kommen - stell also sicher, dass immer alles wieder verschwindet. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Memory Leaks kanns aber nicht geben, wenn ich Instanzen in Funktionen übergebe, oder?
Also,um die Gegner zu bewegen übergebe ich immer jeweils eine komplette Gegnerinstanz an die entsprechende Funktion, damit diese Funktion die entsprechenden Werte ändern kann. Werde das mit den Listen noch genau überprüfen und das mit dem Imagescollide noch abändern. Ist Imagescollide wirklich so langsam? Lg, M0rgenstern |
||
Jumper |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
An 3 Listen mit jeweils bis zu 100 Einträge liegt es ganz bestimmt nicht.
Erst kürzlich habe ich 1.000 Einträge mit rotierenden und von A nach B bewegten Objekten getestet. Dann ständig Einträge gelöscht und wieder neue erstellt. Dabei hatte ich 320 bis 340 FPS, auch nach mehreren Minuten brach die Geschwindigkeit nicht ein. Da würde ich mal von einem Fehler in Deinem Programm ausgehen. Durchsuche mal Deine Hauptschleife nach rechnenintensiven Teilen. Was mir so einfällt: 1. Eine Datei (Grafik, Sound) wird in der Hauptschleife geladen 2. Du benutzt die BMax Textbefehle (Bei mehreren Zeilen Text geht bei mir die FPS gewaltig in den Keller - da sind Bitmap Fonts um ein vielfaches schneller) Da kommen natürlich noch viele andere Fehler in Frage. Da hilft nur suchen. Vielleicht mal die ein oder andere Funktion, wie Kollisionsprüfung abschalten, und sehen wobei es zu einem deutlichen Geschwindigkeitsschub kommt. Aber an den Listen wird es nicht liegen, wenn die Zahl der Einträge wirklich nur im 3stelligen Bereich liegt. Mfg Jumper |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Solange du keine Objekte explizit kopierst (und dazu eine spezielle Funktion aufrufst) wirst du das Objekt nur Referenzieren - und diese Referenz wird dann als Lokale Variable wieder verworfen - also sollte es absolut nichts ausmachen.
Kommentiere / Ersetzte ImagesCollide und sieh zu, was passiert... |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo.
Nachdem ich jetzt endlich dazu kam, das ganze mal abzuändern kann ich ein Ergebnis präsentieren: Es lag wirklich an dem Imagescollide. Ich habe eine Funktion geschrieben, die überprüft, ob zwei Rechtecke sich berühren/überschneiden o.ä. und erst wenn diese Funktion TRUE zurückliefert, wird nochmal mit Imagescollide nochmal pixelgenau geprüft. Es läuft jetzt selbst mit doppelt so vielen Objekten total flüssig. Vielen Dank, mir war wirklich nicht bewusst, dass Imagescollide so langsam ist. Lg, M0rgenstern |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group