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

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

21

15.04.2011, 16:45

Schorsch:

Geht es um sowas wie hier beschrieben, klingt zumindest von der Beschreibung her genau wie sowas.

http://msdn.microsoft.com/en-us/library/…andp.20%29.aspx

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

22

15.04.2011, 17:27

Zero, ich glaube Du redest da total an mir vorbei.
Gerade das Event/Delegate Prinzip in C# macht das ja alles schon von Haus aus und verwaltet eben selbst, wer Events bekommen soll und wer nicht. Ich sehe deshalb da den Zweck eines zentralen Managers für Events eben nicht und die daraus entstehenden Abhängigkeiten finde ich sogar noch weitaus unschöner. Für Action-Logging/Controlling mag das aber durchaus eine gute Idee sein.

Dein Beispiel mit den Sounds läuft bei mir (je nach Prog) auch auf zwei verschiedene Arten:
1) Ein Sound hat schon bei seiner Erstellung eine Referenz auf den Sound-Manager erhalten und ein Schuss einen (oder auch mehr) Sounds. Das Abspielen des Sounds wird zwar dann durch den Schuss ausgelöst, aber die Behandlung läuft über die Manager-Referenz des Sound-Objekts selbst.
2) Ein Sound-Manager registriert sich beim "OnPlay"-Event des Sounds, wenn ein Sound über den Manager erstellt wird. Er wird somit immer per Callback informiert, wenn der Sound abgespielt werden soll und übernimmt das Sampling.

Letzteres finde ich eher unschön, bin daher zu 1) übergegangen.
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]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (15.04.2011, 17:36)


Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

23

15.04.2011, 18:46

Ja Zero du beschreibst quasi genau das System;) Habe mich da vielleicht etwas ungünstig ausgedrückt. Ob man jetzt von Aktionen oder Events sprechen möchte, darüber lässt sich sicherlich streiten, wobei ich den Begriff Event ganz passend finde, da es eigentlich mehr beinhaltet als reine Aktionen. Warum das Konzept gegen den Sinn der Objektorientierung gehen soll ist mir nicht ganz klar. Warum soll nicht eine zentrale Schnittstelle vorhanden sein? Es gibt ja auch Entwurfsmuster die genau auf so eine Schnittstelle setzen. Naja aber davon mal abgesehen. Ich versuche wie gesagt das Umzusetzen, was Zero beschreibt. Dabei baue ich jedoch nicht auf das Eventsystem von C# auf. Habe damit relativ wenig Erfahrung und wüsste nicht genau wie ich damit in dem Fall umgehen sollte.
2) Ein Sound-Manager registriert sich beim "OnPlay"-Event des Sounds, wenn ein Sound über den Manager erstellt wird. Er wird somit immer per Callback informiert, wenn der Sound abgespielt werden soll und übernimmt das Sampling.
Das ist ja in etwa das was passieren soll. Nur wie du schon sagst ist es relativ "unschön", und aus dem Grund habe ich eine Klasse die alles verwaltet. Dass ich dadurch die Events nicht direkt feuern muss, sondern zuerst speichere, um sie einmal pro Update zu feuern sehe ich auch als Vorteil. Das mit dem Netzwerk war eben nur ein Beispiel. Das System im Netzwerk zum laufen zu bringen ist halb so wild. Das Problem ist vielmehr, dass so ein Eventsystem im Netzwerk sehr unsicher ist. Es sicher umzusetzen ist das Problem;) Aber davon auch mal abgesehen, da es nur ein Beispiel war.
Das Konzept dahinter kommt größtenteils aus dem Buch "Game Coding Complete" von Mike McShaffry. Vielleicht kennt ja jemand das Buch. Das Design ist bei mir eh noch in der Planungsphase, weshalb ich mich auch gern von Änderungen überzeugen lasse.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

24

15.04.2011, 18:54

Irgendwie erschließt sich mir nicht, wieso der Aufruf einer Methode zum Speichern eines "Events" und das nachträgliche feuern des Events ein Vorteil gegenüber einem direkten Event per Callback ist.
Aber egal. Das war letztendlich ja nicht Deine eigentliche Frage. Ist die denn jetzt eigentlich geklärt?
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]

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

25

15.04.2011, 19:15

Ist auch relativ egal;) Nein. Über Callbacks würde ich das Problem halt umgehen. Habe heute aber auch nochmal bei der Arbeit mit ein paar Kollegen gesprochen und die wussten auch keine wirklich schöne Alternative. Habe es mal testweise mit den casts umgesetzt. Funktionieren tuts. Werde mal eine Variante mit Callbacks schreiben und danach entscheiden welche mir nun besser gefällt. Trotzdem danke an alle;)

Edit: Naja und den Vorteil den die Queue mit sich bringt, ist dass Events dann zum einen gepackt werden könnten um sie über das Netzwerk zu versenden, und zum anderen müsste man natürlich nicht alle Events pro Update auch behandeln. Wenn Update mal zu lange braucht könnte man erstmal nur wichtige Events bearbeiten. Wäre mit einer PriorityQueue relativ simpel umgesetzt und man könnte sich ein bisschen Zeit sparen. Dabei muss natürlich gewährleistet sein, dass die Events natürlich alle gefeuert werden und einige nicht einfach wegfallen, weil sie eine zu niedrige Priorität haben, aber dafür gibts ja genügend Konzepte. Zusätzlich müsste man dann natürlich gucken welche Events denn nun überhaupt sofort gefeuert werden müssen, und bei welche verzögert kommen dürfen, aber mir gefällt die Freiheit die ich dadurch habe. Naja wie gesagt ist das erste mal das ich mit so etwas arbeite. Hinterher kann ich ja vielleicht mehr dazu sagen;) Gruß
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schorsch« (15.04.2011, 19:23)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

26

15.04.2011, 20:02

Du brauchst doch keine Casts, wenn du statt einer einzelnen Event-Methode mehrere verschiedene nimmst. Also keine "OnEvent(EventArgs)" Methode, sondern "OnMouseMoved(MouseEventArgs)", "OnWeaponFired(WeaponFiredEventArgs)" ... und so weiter.
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]

27

15.04.2011, 20:36

Ja gut ich kenne mich in C# nicht aus und kenne das Eventsystem überhaupt nicht ;)

Ich habe nur beschrieben wie mein Eventsystem in C++ umgesetzt ist. Kann man sich ungefähr so wie das wxWidgets-EventSystem vorstellen.
Und mit den Events sammeln bietet sich zb bei mir sehr gut an, weil ich mein System ja auf multithreading ausgelegt ist und man so nur einmal locken muss und nicht für jedes Event einzeln.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

15.04.2011, 20:42

Und mit den Events sammeln bietet sich zb bei mir sehr gut an, weil ich mein System ja auf multithreading ausgelegt ist und man so nur einmal locken muss und nicht für jedes Event einzeln.

Und du bist dir sicher dass das so eine gute Sache ist? Einmal locken, dafür aber ständig...

Da du so einen globalen Sychronisierungspunkt hast bedeutet das auch dass eigentlich vollkommen Unabhängige Events aufeinander warten müssen und sich Threads so ohne Grund gegenseitig ausbremsen. Oder versteh ich da was falsch!?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (15.04.2011, 20:48)


29

15.04.2011, 20:57

Ich leite das nur an den anderen Thread weiter, der holt die sich dann und liefert sie mit seinen aus.
Ich lasse also nicht aus Thread1 die Events durch Thread1 in Thread2 abarbeiten.
Sonst hast du natürlich recht, es würde wohl ne Weile dauern und wäre sinnlos.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

30

15.04.2011, 21:02

Ok d.h. bei dir braucht jeder Thread seine eigene Eventqueue und eine Hauptschleife die die Events bearbeitet!? Es gibt einen Thread in den erstmal alle Events gepostet werden und der diese Events dann weiter an alle anderen Threads verteilt? Wenn sowieso jeder Thread eine Queue hat, warum können die Events nicht einfach ohne Umweg direkt an alle Threads dispatched werden?

Werbeanzeige