Performanceprobleme durch Types

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Pakzor

Betreff: Performanceprobleme durch Types

BeitragSa, Aug 29, 2009 2:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo blitzbasic portal Forum,

ich habe mich hier soeben angemeldet weil ich durch die Suche nicht fündig geworden bin.

Da ich mal wieder nicht schlafen konnte, hab ich mich an mein erstes richtiges Spiel gesetzt.
Ich bin momentan dabei einen Weltraumshooter zu programmieren und lagere momentan
mehrere Dinge in Funktionen aus und stelle manche Sachen auf Types um.

Ich beschäftige mich momentan viel mit diesem Tut von Dottakopf

Da sind wir auch schon bei meinem Problem, wenn ich folgende Funktion aufrufe,
welche meine Gegner auf den Bildschirm zeichnen soll, dann geht mein Rechner nach ca.
2 Sekunden ziemlich in die Knie. Es liegt ziemlich eindeutig an dieser Funktion, denn wenn
ich sie nicht aufrufe, läuft alles flüssig.

Ich verwende übrigens das "normale" Blitz(3D).

Code: [AUSKLAPPEN]

Function DrawEnemies()
   For E1 = Each Enemy
      If E1\Existence >= 1 Then
      DrawImage Gegnerbild, E1\X, E1\Y
      EndIf
   Next
End Function


Nun würde ich gerne von euch wissen, was ich anders machen muss, damit mein Spiel
wieder flüssig läuft?

Des Weiteren würde ich gerne wissen, ob es Sinn macht einen bzw. zwei Spieler in
einem Type anzulegen?

PS: E1 steht für den Gegnertyp 1, die Hinweise mit IDs aus diesem Thema https://www.blitzforum.de/foru...6a6657f848
konnte ich jetzt noch nicht umsetzen.

MFG
Pakzor

Xeres

Moderator

BeitragSa, Aug 29, 2009 2:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie viele Einträge zählt den der Enemy-Type?

Edit:
Bzw. an was für einem Rechner entwickelst du denn? Wenn es nur am zeichnen liegt, muss dass ja eine ordentliche Menge sein...
Etwas mehr Code bezüglich Erstellung/Verwaltung wäre vll. ganz nützlich.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Eingeproggt

BeitragSa, Aug 29, 2009 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn deine Map größer ist als die Graphics-Auflösung würde es sicher etwas Geschwindigkeit bringen, manuell zu überprüfen ob ein Gegner überhaupt im sichtbaren Bereich ist und nur dann DrawImage ausführen.

Aber zu allererst mal Xeres' Punkte abklären Smile

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Pakzor

Betreff: Ergänzung

BeitragSa, Aug 29, 2009 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

momentan sind es eigentlich nur 21 Gegner, hatte das bisher auch in einer For-Next-Schleife
gemacht mit Erzeugung und Zeichnen (ohne Types) da hatte ich auch keinerlei Probleme.

Hier mal der aktuelle Code für die Gegner Erzeugung:

Code: [AUSKLAPPEN]
Function CreateEnemies()
   If Stage = 1 And EnemiesCreated = 0 Then

      For I = 1 To 7
         EX = EX + 90
         If EX >= 720 Then EX = 90
         
         E1 = New Enemy
            E1\Existence = 80
            E1\X = EX
            E1\Y = 20
            E1\Energy = 20
      Next
      
      For I = 8 To 14
         EX = EX + 90
         If EX >= 720 Then EX = 90
         
         E1 = New Enemy
            E1\Existence = 80
            E1\X = EX
            E1\Y = 70
            E1\Energy = 20
      Next
      
      For I = 16 To 22
         EX = EX + 90
         If EX >= 720 Then EX = 90
         
         E1 = New Enemy
            E1\Existence = 80
            E1\X = EX
            E1\Y = 120
            E1\Energy = 20
      Next
      
      EnemiesCreated = 1
   EndIf


Mehr wird momentan nicht mit den Gegner gemacht, die Code Umstellung von DIM auf Types wollte
ich einfach Schritt für Schritt machen, damit ich Fehler leichter finde Wink

Ich entwickel momentan an einem 1 Jahr altem Notebook, was nicht ganz schlecht ist, daran
sollte es nicht liegen, da es ja mit DIM noch alles wunderbar ging.

MFG
Pakzor

Xeres

Moderator

BeitragSa, Aug 29, 2009 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Verursacht die Draw Funktion von Anfang an diese Lags?

Wenn nein, tippe ich darauf, dass du die Enemys aus irgendeinem Grund nicht wieder löschst. Eine globale Zählvariable macht sich zum Debuggen manchmal nicht schlecht.
Wenn ja... bin ich ziemlich überfragt Confused
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Pakzor

BeitragSa, Aug 29, 2009 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, die Verzögerung tritt erst nach ca. 2 Sekunden ein.

Ich lösche die Gegner momentan noch nicht, weil nichts mit Ihnen passiert.
Die explodieren nicht, bewegen sich nicht und sonst passiert auch nichts.
Werden nur erzeugt und angezeigt.

Bei meinen Schüsen mache ich es so:

Code: [AUSKLAPPEN]

Function MovePlayerShot()
   For PShot = Each Shot
      If PShot\Existence = 1 Then
         DrawImage laserbild, PShot\X, PShot\Y
         PShot\Y = PShot\Y - 10
         If PShot\Y <= -26 Then Delete PShot
      EndIf
   Next
End Function


Aber es gibt momentan keinen Grund die Gegner zu löschen, wollte ja
einfach nur mal testen ob es mit dem anzeigen klappt.

MFG
Pakzor

Xeres

Moderator

BeitragSa, Aug 29, 2009 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde bei der for...each Schleife mal mitzählen wie viele Gegner tatsächlich existieren... manchmal macht man einfach kleine Logikfehler oder benutzt Lokale statt Globale Variablen und es werden tausende von Enemys übereinander gezeichnet.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Pakzor

BeitragSa, Aug 29, 2009 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Xeres,

das ist tatsächlich das Problem.

Aber wie behebe ich das jetzt?

E1 wurde folgendermaßen angelegt:
Code: [AUSKLAPPEN]
Global E1.Enemy


Kannst du mir bitte nochmal helfen?

MFG
Pakzor

mpmxyz

BeitragSa, Aug 29, 2009 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute mal, dass er eher die Variable "EnemiesCreated" meint.
Wenn die nicht Global ist, dann kannst du deren Wert in der Funktion nicht ändern.
->Jeden Frame werden 21 Gegner erstellt und irgendwann sind es so viele, dass man merkt, dass das Programm langsam läuft.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Pakzor

BeitragSa, Aug 29, 2009 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen herzlichen Dank an euch beide,

der Hinweis von "mpmxyz" auf die Variable "EnemiesCreated" hat den entscheidenden
Erfolg gebracht. Diese war, wie vermutet, nicht global.

Dankeschön.

Schönes Wochenende noch.

MFG
Pakzor

Xeres

Moderator

BeitragSa, Aug 29, 2009 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du statt der Standart IDE z.B. IDEal verwendest, kannst du Lokale, Globale und nicht deklarierte Variablen unterschiedlich anzeigen lassen, das hilft ungemein beim Entwickeln Wink
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Pakzor

BeitragSa, Aug 29, 2009 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Die schaut echt fein aus, auf den ersten Blick zwar etwas kompliziert,
aber allein diese ausklapp-Funktion für die Funktionen (wie in den
Visual Studios) find ich extrem schick.

Danke dir.

Gruß
Pakzor

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group