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
Virtuelle Funktionen verursachen von sich aus keine nennenswert messbaren Verluste.
fast jedem Videospiel und in fast jeder Programmiersprache.
Warum speicherst du denn noch mal Eigenschaften wenn die Komponenten diese bereits abbilden können?
![]() |
C-/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
struct MoveData { float velocity; }; struct CollisionData { Rect bounding_box; }; struct FocusData { ObjectID focus; }; struct PhysicsData { Vector pos, face_direction; // optionale Daten je nach Objekt-Typ (oder halt mit unique_ptr) MoveData* move; CollisionData* coll; FocusData* focus; }; |
Der Punkt mit dem schlecht leserlich bleibt (imo).
![]() |
C-/C++-Quelltext |
1 2 3 |
if (data.move != nullptr) { // interpoliere Bewegung } |
![]() |
C-/C++-Quelltext |
1 |
if ((chest & types::Collideable) && !(chest & types::Lighted)) { |
Wir reden aneinander vorbei.
Weil das stellst du mit Hilfe der Komponenten über das != nullptr doch schon dar, oder nicht?
Und sollte sie es doch, was spricht gegen eine leere Komponente die du dann nullptr setzen kannst?
Nö ich hatte dein Problem nur falsch verstanden
Ich hatte da noch Bezug zum ECS Thread. Jetzt passt es, weitermachen![]()
Zitat von »Evrey«
Da hast du dann Mist gemessen. Virtuelle Funktionen verursachen von sich aus keine nennenswert messbaren Verluste. Verluste erreichst du durch grottenschlechte Aufteilung der Objekte im Hauptspeicher. Sie werden immer und überall genutzt, von Compilern und Betriebssystemen, über OpenAL Soft, bis rauf zu fast jedem Videospiel und in fast jeder Programmiersprache. Im zuvor verlinkten Buch werden auch Strategien genannt, Cache-Misses stark zu reduzieren.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Spiele Programmierer« (26.01.2015, 18:40)
Für etwas Stupides wie einen Getter braucht man keine Virtuals, da schießt man sich selbstverständlich ins Knie. Bei großen Funktionen fällt es weniger ins Gewicht, da dort Inlining eh' fast immer flach fällt. Die Pipeline leert sich auch, wenn die BPU einen bedingten Sprung falsch vorhersagt, was in größeren Funktionen eh' fast unvermeidlich ist. Das einzige Problem ist der potenzielle Cache-Miss, wenn man die V-Table oder die entsprechenden Funktionen lädt. Die halten sich in Schleifen allerdings ziemlich gut in Grenzen, wenn Instanzen der selben Klassen häufig auftreten, und können weiter reduziert werden, wenn der Compiler das Code-Segment clever anordnet.
Zitat
Mach eine einfache Operation in einer virtuellen Funktion
![]() |
C-/C++-Quelltext |
1 2 3 4 |
int main(int _argc, char** _argv) noexcept { asm volatile("lock cmpxchg8b %eax"); return 0; } // ::main |
Werbeanzeige