Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 08:13

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jul 20, 2009 10:10 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
Hi^^

Ich wusste nicht genau, wie ich nach einem ähnlichen Thema suchen soll, deswegen bitte ich um einen kleinen Hinweis wenn es dieses Thema schon gibt, und schwups schau ich mich nochmal um^^

Ich bastel momentan an einem kleinen Shooter über den ich bereits in meinem Vorstellugsthreat berichtet habe. In früheren Versionen davon habe ich für jedes Geschoss, das ein Spieler oder ein NPC schießt, ein Objekt erschaffen (zb TBullet). Nun wird im Partikeltutorial empfohlen, nicht für jeden Effekt ein eigenes Objekt zu erschaffen, sondern aus Speichergründen einen Record zu erstellen (ich bitte um Verzeihung sollte dies nicht der Fachbegriff sein, und um Korrektur^^) und die Effekte in einer Schleife abzulaufen und zu verwalten. Meine Frage nun: Ist es sinvoll, das mit allem möglichen zu tun? Wie groß ist der Vorteil? Es gibt in meinem Spiel sehr viele verschiedene Aten von Geschossen, die nicht alle linear fliegen, die verschiedene optische Effekte haben, explodieren oder nicht, etc, sodass ich entweder für verschiedene Arten verschiedene Listen erstellen müsste oder einen sehr vollgestopften Record erschaffen müsste.

Lohnt sich das, oder mache ich mir damit nur unnötige Probleme?

Gruß, Robin

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 20, 2009 10:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich würde für jede Instanz einer Waffe im Spiel eine Instanz für die Geschosse dieser Waffe verwenden. Diese Instanz verwaltet dann also alle Geschosse die von dieser Waffe geschossen werden. Bei einer Minigun hättest du dann 100 gleichartige Geschosse (Records) die alle von einer Geschoss-Klasse verwaltet werden.

Zitat:
Meine Frage nun: Ist es sinvoll, das mit allem möglichen zu tun? Wie groß ist der Vorteil?

Es geht darum Methodenaufrufe und auch Speicher zu sparen. Eine Klasse braucht immer noch ein wenig zusätzlichen Speicher für die Polymorphie. Bei 10.000 Partikeln sparst du natürlich wesentlich mehr...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 20, 2009 11:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Um den Rechenaufwand ein bischen zu redusieren würde ich erstmal ein array beim start vor initialisieren.
Ob es nun ein Record oder Klasse ist macht nun nicht mehr viel aus, der Konstrukturor und Destruktor werden ja nun nicht mehr aufgerufen und das zusätzliche push Argument beim aufrufen von Klassenmethoden ist nicht wirklich bemerkbar(bei 32Bit in Delphi 4Byte stack push und bei c++ mit & als Parameter auch). Es gibt unterschiedliche Projektielarten, einige sind schneller andere langsamer und einige sehr schnell. Einige Spiele machen für schnelle Projektiele einfach nur ein Raycast Intersection und setzen am ersten Kollisionspunkt ein Partikelemitter mit entsprechendem Reflektionswinkel. Andere Games haben langsamere Geschosse, welche noch sichtbar sind und ein hellen streifen hinter sich her ziehen -_- Filmindustrie sei dank. Das größte Problem bei Projektielen sind die Geschwindigkeit und Häufigkeit, erstens kann wenn man die falsche implementierung nutzt schnell Fehler verursachen und zweitens kann auf die Performance schlagen, wenn man es falsch macht.

Ich würde eine Klasse für Projektiele anlegen.
Code:
  1. class TBullet
  2. {
  3.   protected:
  4.     TVector m_Position;//aktuelle Position
  5.     TVector m_Direction;//in welche Richtung zeigt die Kugel aktuell
  6.     float m_fSpeed;
  7.     bool m_bActive;
  8.     ...//Handler für Physiksystem, wenn genutzt
  9.   public:
  10.      //static in klassen sorgt dafür, dass es in den Klassendaten und nicht in den Instanzdaten gespeichert wird.
  11.      //Der Unterschied sind bei 100 Instanzen, 396Byte weniger Speicherverbrauch, da das Float nur einmal im Speicher liegt egal wieviele Instanzen erzeugt werden.
  12.     static float Speedreduction;//vereinfache Gewicht und Luftwiederstand zu einer konstanten Geschwindigkeitsabnahme
  13.     void Show();//aktiviert das Geschoss
  14.     void Hide();//deaktiviert das Geschoss
  15.     void SetType();
  16.     bool Active();
  17. };
  18.  
  19. class TBulletManager
  20. {
  21.   protected:
  22.     TBullet* m_BulletArray;
  23.     vector<unsigned int> m_FragmentedBulletSlots;//Index auf freie nicht zusammenhängende Bulletslots. Beim erstellen einfach den ersten Eintrag nehmen, entfernen und als neue Instanz zurück geben.
  24.     unsigned int m_uiBulletcount;//aktuell verwendete Anzahl
  25.     unsigned int m_uiBulletCreateIntervall;//Stückzahl, um die der Array erweitert wird, wenn nicht genug da sind.
  26.     unsigned int m_uiBulletReservedCount;//wirkliche Arraygröße
  27.     vector<TRessource*> m_Res;
  28.   public:
  29.     TBullet& GetInstance();//gibt ein freien Slot raus
  30.     void RemoveInstance(TBullet& Object);//gibt ein Slot frei
  31.     void Update();//Verarbeitet alle aktiven Kugeln
  32.     void Draw();//Zeichne alle aktiven und sichtbaren Kugeln
  33.     void BindRessource(TRessource& Res);
  34.     void UnbindRessource(TRessource& Res);
  35. };


Das wäre eine Lösung die ein Puffern erstellt und in größeren Intervallen weitere Slots erstellt.
So werden zur Laufzeit keine Konstruktoren,Destruktoren,Getter,Setter,new und free Funktionen aufgerufen(macht klassen langsam in massen).
Die Kugel weiß alles, was sie wissen muss und lässt die die Möglichkeiten von Klassen.
Der Manager schuppst die Projektile rum(egal ob über Physiksystem oder einer kleinen eigenen Routine) und durch die Ressourcen(Model,Sound,Partikelemitter) und dem Projektiltyp kann er fest stellen, welchen Partikelemitter er aktivieren muss und welcher Sound abgespielt werden soll.
Draw und Update sind mit Absicht getrennt, da man Projektile auch verarbeiten muss, wenn man sie nicht sieht bzw. auch verarbeiten muss, wenn die Grafikkarte zu langsam ist.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 21, 2009 17:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
danke für die antworten :)

das mit mehreren schusstypen und entsprechend vielen records hab ich mir auch schon überlegt, hab mich jetzt aber für eine liste mit einem umfangreichen typen entschieden. das ist weniger schreibarbeit (dafür komplizierter) und sehr variabel, wenn ich das fertig hab, ist es noch leichter als eh schon, neue waffen bzw angriffe zu entwerfen.

ich danke trozdem auch für den vorschlag einfach keine creates, frees etc zu verwenden, diese methode hab ich mir nie angeschaut aber werd überlegen ob das an anderer stelle sin macht. ich denke ich hab also was gelernt^^

gruß, robin

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 16 Queries | GZIP : On ]