Allokationen Vermeiden

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
foofel
Beiträge: 10
Registriert: 03.03.2014, 12:34

Allokationen Vermeiden

Beitrag von foofel »

Hey,

es heißt ja immer man soll wenn möglich alle allokationen während des spiels vermeiden und alles vorher anlegen. Bei vielen sachen klappt das auch, aber es gibt dann doch einige sachen wo das den aufwand um einiges erhöhren würde. Z.B. für geschosse, ich könnte jetzt eine bestimmte anzahl vorher anlegen, und nur neue anlegen wenn ich über die anzahl der vorher erzeugten objekte komm etc. aber ist das den aufwand wirklich wert? Einige sachen wie gegner spawnen ja auch recht unregelmäßig und dann dafür nen pool anlegen... Wir handhabt ihr das und habt ihr da schon performance probleme bekommen? Bisher läuft das nämlich mit dem direkt erzeugen ziemlich super, aber man hört das halt immer wieder :)
Benutzeravatar
Schrompf
Moderator
Beiträge: 5045
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Allokationen Vermeiden

Beitrag von Schrompf »

Programmiersprache?

In C++: Allokationen kosten etwas Rechenzeit, vielleicht so im Bereich von ein paar Hundert Nanosekunden auf aktuellen Desktoprechnern. Deallokationen kosten u.U. das Vielfache, aber immernoch im Bereich <1µs. Das ist kein Problem, wenn man pro Frame ein paar Hundert Objekte anlegt, aber im Renderer mit potentiell vielen tausend Objekten pro Frame würde ich evtl. Umwege suchen.

In Java/C#: Allokationen kosten quasi nix, aber wenn Du fröhlich losallokierst, kommt irgendwann der Garbage Collector und Dein Spiel steht für ~5s. Es gibt Leute, die damit Spiele auf Steam veröffentlichen, also scheint es den normalen Spieler wenig zu kümmern, aber *mich* nervt sowas. Und der einzige Weg drumrum ist halt, Allokationen zu vermeiden. Das macht man üblicherweise mit Objekt Pools.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Allokationen Vermeiden

Beitrag von TGGC »

Pack deine Geschosse einfach in einen std::vector, der regelt den Rest. Wenn du willst, kannst du spaeter als Optimierung noch ein reserve aufrufen.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4273
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Allokationen Vermeiden

Beitrag von Chromanoid »

Schrompf hat geschrieben:In Java/C#: Allokationen kosten quasi nix, aber wenn Du fröhlich losallokierst, kommt irgendwann der Garbage Collector und Dein Spiel steht für ~5s. Es gibt Leute, die damit Spiele auf Steam veröffentlichen, also scheint es den normalen Spieler wenig zu kümmern, aber *mich* nervt sowas. Und der einzige Weg drumrum ist halt, Allokationen zu vermeiden. Das macht man üblicherweise mit Objekt Pools.
Wobei diese Empfehlung mit Vorsicht zu genießen ist. Je nach JVM und GC-Einstellungen ist es mittlerweile häufig auch besser auf Pools zu verzichten. Die Oracle-Hotspot-VM macht beispielsweise Escape-Analyse um festzustellen ob überhaupt auf dem Heap alloziert werden soll. Allerdings ist das alles alles andere als deterministisch vorhersehbar und wenn man mit diesen Sprachen programmiert, sollte man sich so gut wie möglich einfach damit abfinden, dass der GC mal aktiv wird und kurz das Spiel anhält. Ansonsten kämpft man ja doch nur gegen die Konzepte der Sprache. Eine interessante Antwort dazu im Rahmen der Android-Spieleentwicklung auf Stackoverflow: http://stackoverflow.com/questions/1709 ... e-collecto
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Allokationen Vermeiden

Beitrag von Krishty »

TGGC hat geschrieben:Pack deine Geschosse einfach in einen std::vector, der regelt den Rest. Wenn du willst, kannst du spaeter als Optimierung noch ein reserve aufrufen.
Genau, denn sowohl der Container als auch das Betriebssystem reservieren Überhang, damit Vergrößerungen möglichst selten zu tatsächlichen Reallokationen führen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
foofel
Beiträge: 10
Registriert: 03.03.2014, 12:34

Re: Allokationen Vermeiden

Beitrag von foofel »

Danke für die antworten, ich werd dann erstmal alles so lassen wie es ist und bei bedarf umbauen, bisher läufts ja :D
Antworten