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

1

28.04.2014, 09:29

Ingame-Event-Manager für C++ - Fragen zur effizienten Umsetzung

Hallo zusammen,

für ein in C++ geschriebenes rundenbasierendes Programm baue ich gerade einen Manager für Ingame-Events. Diese Events sollen modifizierbar sein, also z.B. aus XML-Dateien eingelesen werden. Ich habe Bedenken hinsichtlich der Effizienz, wenn irgendwann einmal sehr viele Events existieren. Die Struktur dabei ist:
  • WENN (conditions) DANN (event)
Beispiel:
  • WENN ((Runden_Anzahl > x1) UND (Material_im_Lager < x2) UND (x3 % Wahrscheinlichkeit)) DANN {Material_im_Lager +1; Nachricht ausgeben;}
Bestehende Beispiele sind z.B. die Paradox-Spiele Hearts of Iron oder Europa Universalis, oder die modifizierbare X-Serie von Egosoft. Ich möchte gerne noch bis ca. 50.000 Events bei einer akzeptablen Laufzeit sein, jeweils mit 1 bis 8 Bedingungen.

Frage: Wie lässt sie so ein Event-Manager effizient umsetzen? Ich kann natürlich bei Programmstart alle Events einlesen und dann in den Speicher laden, der dann zu Beginn einer neuen Runde alle Bedingungen nacheinander abfragt. Oder ich kann die Events mit IDs versehen und nur Bedingungen und IDs einlesen - und bei positivem Treffer über die ID das Ingame-Event einlesen und einleiten. Oder ich lade bei Rundenwechsel alle Events ein, prüfe sie und gebe dann den Speicher wieder frei... Wie handhabe ich das ab sinnvollsten? Irgendwelche Ideen und Erfahrungen eurerseits?

- Corak

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

28.04.2014, 10:26

Bevor du etwas optimierst, musst du schauen, wo es überhaupt lange dauert. Wenn du noch nichts implementiert hast, wirst du darüber keine Aussage treffen können. Ich würde erstmal mit deinem ersten Ansatz vorangehen, also alle Events in den Speicher laden und abarbeiten. Ich denke wenn du so mehrere 1000 Events hast wird das erst verzögert geladen. Wenn du dann Performanceprobleme hast, kann man diese analysieren und beheben.

Was ich dir damit sagen will: Du hast ja noch kein Problem, also nimm erstmal eine einfache und gut zu wartende Lösung. Optimieren kannst du nach Bedarf immer!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

28.04.2014, 10:39

Und bitte im Release-Mode testen, der kann nämlich nur 1/100 der Zeit beanspruchen, den der Debug-Mode fordert. ;)
Das haben wir bei RR ganz gut gemerkt. Laden eines Level-Files 2-5 Sekunden Dauer im Debug. Lösung -> Lade-Bildschirm. Im Release-Mode taucht er aber nur für einen Sekundenbruchteil auf, dann ist das File geladen.
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]

4

28.04.2014, 14:23

Vielen Dank!

@TrommlBomml
Vielen Dank, dass mich auf den Boden der heutigen Tatsachen zurückgeholt hast. Ich habe den Großteil meiner Programmiererfahrungen in den 90ern gemacht (und damit mehrmals den Hauptspeicher gesprengt) - da zählte Rechenzeit bei Schleifen etc. noch mehr als heute.
Ich habe halt etwas Bammel davor, so etwas wie Civ5 zu programmieren, was dann pro Runde mehrere Minuten Rechenzeit kosten kann :) Aber Du hast Recht - ich bin ja meines eigenen Codes Schmied und kann später immernoch Programmierzeit in die Optimierung sinnvoller Codefragmente investieren.

@BlueCobold
Danke für den Tipp mit dem Debug-Modus, das leuchtet ein - aber ich wäre so ohne weiteres sicherlich nicht darauf gekommen.

Werbeanzeige