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

Fischkralle

Frischling

Beiträge: 24

Wohnort: Köln

Beruf: Softwarearchitekt

  • Private Nachricht senden

11

07.02.2017, 07:42

Na toll,
dank David und dem Colbold ist mir ein Licht bezüglich meines eigenen
Codes aufgegangen.
Eigentlich nicht schlecht, doch saß ich gestern Abend schon 3 Stunden
am umschreiben und fertig bin ich noch lange nicht.
Die Performance dankt euch und der Fischkralle hat wieder ordentlich
zu tun.
Geschriebene Sachen können Spuren von eigener Meinung und/oder Sarkasmus enthalten.

Jar

Treue Seele

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

12

07.02.2017, 08:34

Ich würde dir Empfehlen dich mit Entity Component Systems zu beschäftigen. Dann würdest du die Frage nach einer Klasse gar nicht erst haben.
In einem ECS hast du nur eine Entity Klasse und diese kann bestimmte Komponenten haben.

Zum Beispiel eine Spieler Klasse würde dann so aussehen. (Wobei es die Klasse Spieler gar nicht gibt.. da es ja keine konkreten Klassen gibt :) )

Entity : {
PositionComponent,
SizeComponent,
MoveSpeedComponent,
StrenghComponent,
StaminaComponent,
RenderComponent,
InventoryComponent
}

Ein EntityMovementSystem würde dann anhand deiner Position-, Size- und MoveSpeedComponent die Bewegung deiner Entity berechnen.

Durch das Entfernen einer bestimmten Komponente kannst du so auch Zaubereffekte wie zum Beispiel "Einfrieren" realisieren. Ein Einfrier Zauber könnte dann einfach die MoveSpeedComponent temporär entfernen und du müsstest keine Extra Logik irgendwo erstellen, die sich darum kümmert.
Dein EntityMovementSystem würde dann einfach nicht mehr deine Entity behandelt, weil sie keine MoveSpeedComponent mehr hat.

Ich kann nur jedem empfehlen sich mit ECS auseinander zu setzten, zwar braucht man am Anfang etwas Gehirnschmalz um sich an das neue System zu gewöhnen, jedoch überwiegen die Vorteile eines ECS gegenüber der gewöhnlichen objektorientierten Programmierung.

Hier sogar ein deutscher Link, der das ECS erklärt:
https://www.heise.de/developer/artikel/C…en-2262126.html

Zu deinem Angriffs Problem...

Fernkampf Angriffe werden wahrscheinlich nicht gemeint sein oder?
Hier würde eine einfache Kollisionabfrage ausreichen.

Bei Spielen übers Netzwerk würdest du dir eine EventQueue bauen, die Abfragen speichert und nacheinander abarbeitet.
Das ganze würde der Server dann natürlich speichern und die Ergebnisse wieder an alle Clienten (Spieler) zurückschicken.


Natürlich ist es jedem selbst überlassen ob ECS oder OOP, dein Vorhaben geht wahrscheinlich auch mit traditioneller OOP aber erfahrungsmäßig führt das zu schlechten Code, welche dem DRY (Don't repeat yourself) Prinzip widerspricht.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Jar« (07.02.2017, 08:42)


Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

13

07.02.2017, 08:50

Das ECS gefällt mir irgendwie. Werde mir das mal näher ansehen, danke für den Hinweis :)

Fischkralle

Frischling

Beiträge: 24

Wohnort: Köln

Beruf: Softwarearchitekt

  • Private Nachricht senden

14

07.02.2017, 10:37

Auf der Seite deines Links habe ich gelesen, dass durch
das System mit Entities / loser Kopplung eine hervorragende
Performance der CPU erreicht wird.

Doch ist eine Vererbung nicht im RunTime schneller?
Geschriebene Sachen können Spuren von eigener Meinung und/oder Sarkasmus enthalten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

07.02.2017, 11:02

Na ja, lose Kopplung erzielt nicht automatische bessere Performance. Vererbung ist allerdings ebenfalls nicht schnell, weil durch den vtable und mehrfache Indirektion ein Call verlangsamt wird.
Bessere Performance lässt sich mit einem ECS nur dann erreichen, wenn ein strikter data-oriented Ansatz verfolgt und die Daten auch linear bearbeitet werden können, bedingt durch Cache-Lokalität. Genau das wird meist allerdings nicht gemacht und trotzdem wird ein ECS als performanter verkauft - was natürlich Käse ist und was ein sauberes Profiling auch belegen würde. Allerdings werfen manche Artikel eben lieber mit Schlagworten und Behauptungen als mit handfesten Argumenten und konkreten Messungen um sich. Du hast bei einem ECS auch ziemliche Einbußen, wenn alle Elemente der Entity nur optional sind und über den Heap verteilt an die Entities getackert werden. Da hat man auch bloß eine zusätzliche Indirektion (gegenüber non-optionalen Ansätzen) und zusätzlich keinerlei Cache-Lokalität. Sämtliche Vorteile sind also nur noch rein konzeptioneller Natur und haben mit Performance dann nichts mehr am Hut.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

16

07.02.2017, 11:04

Intuitiv ist Vererbung von Grund auf langsamer, weil du ja noch die Basisklasse beibehältst, überschriebene (virtuelle) Methoden usw.
Bei gleicher Komplexität sollte Composition also eigentlich schneller sein, weil du nur das hast, was du tatsächlich brauchst.

Aber gemessen habe ich das jetzt nicht.

EDIT:
Hab den Post von BlueCobold nicht gesehen. Hör lieber auf ihn statt auf mich! :D

EDIT2:

Zitat

Du hast bei einem ECS auch ziemliche Einbußen, wenn alle Elemente der Entity nur optional sind


Aber ist der Sinn nicht gerade, dass die Elemente *nicht* optional sind und in der Lage ist, unnötig Elemente direkt rauszunehmen?
WIP Website: kevinheese.de

Werbeanzeige