Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

21

06.06.2013, 14:10

Na aber das kann man mit nem Profiler doch dann ganz gut erkennen. Besser kann ein Entwickler doch eigentlich nicht erzogen werden, als dass er sich früh mit Profilern und Debuggern auseinander setzt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

22

06.06.2013, 14:53

Sehe ich auch so. Und die zentrale Frage wurde ja auch beantwortet: da ist grob was faul im Programm, Multithreading würde bestenfalls die Symtome etwas lindern.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

23

06.06.2013, 17:33

Oke erstmal danke das ihr mir hier alle so tatkräftig helft.

Das mit den Profilern hab ich jetzt nicht so ganz hinbekommen, ich hab mir gDebugger und CodeXl von AMD runtergeladen. Von der aufmachung her sind die ja sehr ähnlich nur hab ich nicht ganz kapiert was ich da jetzt machen muss.

Andererseits hab ich mal ein bisschen auskommentiert um vielleicht zu sehen wo der Hund begraben liegt. Was mir da aufgefallen ist:

Um Kollisionen und die Richtung der AI zu berechnen übergebe ich in der Updatefunktion einen Vektor->

C-/C++-Quelltext

1
2
                     // window brauch ich um zu rendern, plr ist der player und den Vector auf die Objekte
void update( sf::RenderWindow &window, player plr, std::vector<objekt> &obj );



So das heißt doch theoretisch kopiere ich jeden Frame den Vektor? Aber ich brauche den Vektor eben um die Bewegungen der AI und die Kollision der AI und des Players zu berechnen.
Also es liegt 100% an dem Vektor sobald ich keinen Vektor übergebe kann ich den Player updaten und das spiel läuft flüssig.


Edit: ich hab jetzt einfach außerhalb mal einen Zeiger auf den Vector gespeichert und übergebe den jedesmal Türme lassen sich damit jetzt mehr bauen und ich kann 10 Gegner spawnen und bin noch bei 15 FPS bei den ersten 3 merkt man gar nichts

Edit²: Alles was ich jetzt per Reference übergeben habe habe ich jetzt per Pointer übergeben und siehe da ich kann alles wunderbar bauen spawnen usw. und bleibe bei einer konstanten Framerate

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Dreat« (06.06.2013, 18:05)


rnlf

Frischling

Beiträge: 85

Beruf: Softwareingenieur Raumfahrt

  • Private Nachricht senden

24

06.06.2013, 18:05

Am Übergeben des Vektors liegt es nicht, eher an dem, was du damit tust. Du übergibst eine Referenz, da wird kaum was kopiert.

Gib doch nicht so schnell mit dem Profiler auf. Willst du was lernen oder nicht?

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

25

06.06.2013, 18:09

Erstmal ein riesen Dankeschön übrigens an alle die mitgeholfen haben, ich werde jetzt Gas geben das ihr auch sehen könnt wozu das gedient hat und mal eine Demo spielen könnt.

Das mit den Profilern werde ich mir auf jedenfall anschauen nur hab ich jetzt das Problem gesehen und zum Glück auch behoben. Es lag aber komischerweiße doch an den Referenzparametern ich hab die jetzt alle rausgenommen und ich hab eine konstante Framerate
?(

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

26

06.06.2013, 18:18

Nein, daran liegt es definitiv nicht. Du übergibst den vector per Referenz, das kostet keine Rechenzeit. Das selbe gilt ja auch für das sf::RenderWindow - auch per Referenz übergeben. Wenn das kopiert würde, würde das richtig dick Zeit kosten.

Du übergibst aber den Player als Kopie. Ist das Absicht? Und hat der Player irgendwelche Ressourcen, die teuer zu kopieren sind? Texturen z.B.. Außerdem: weist Du in der Funktion vielleicht wieder so leichtsinnig zu wie in Deinem letzten Beispiel?
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Dreat

Frischling

  • »Dreat« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

27

06.06.2013, 18:25

Hmm oke,

bei dem Player ist der &-Operator verloren gegangen...aber kann es sein, da ich den kompletten Vector in dem die Türme gespeichert sind( Texture, Sprite, alle Variablen ) übergebe das die Texture, Sprite und Varibalen kopiert werden oder wird da gar nichts kopiert?

MGBeginner

Frischling

Beiträge: 81

Wohnort: Limburg

  • Private Nachricht senden

28

06.06.2013, 18:38

Nein an dieser Stelle wird nichts (außer Player) kopiert. Poste doch mal die komplette Definition von update.

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

29

06.06.2013, 20:51

Man prügle mich für Mikro-Optimierungen, aber Umrechnungen von Radiant zu Grad und andersrum sind echt überflüssig. Rechne Winkel einfach durchgehend in Radiant. Spart dir lästige Skalierungen, die besonders dann blöd werden, wenn man sie mal vergisst. Weiterhin kann man sich viel Arbeit ersparen, indem man nur mit quadrierten Distanzen rechnet, bis die eigentlichen wirklich zwingend von Nöten sein werden.

Nun aber zum eigentlichen Problem:
Lerne, Profiler zu nutzen und mache damit einen Testlauf. Er wird dir ausführlich anzeigen, welche Aufrufe wie start was ausbremsen. Weiterhin habe ich das Gefühl, als hättest du Referenzen nicht verstanden. Zumindest kann ich mir nicht anders erklären, wieso du zum Bleistift den Spieler als Kopie übergibst. Mehr folgt bei Nachreichung des Codes, sofern nicht andere viel schneller sind.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

Werbeanzeige