Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Spiele-/Grafikprogrammierung ::  Verweise auf andere Entities  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Nexus
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.05.2006
Beiträge: 10301
Beitrag Nexus Mitglied 14:05:57 05.08.2012   Titel:              Zitieren

Mechanics schrieb:
Die KI könnte vielleicht intern auf das Blackboard Pattern setzen und eine Komponente müsste über Events benachrichtigt werden. Hier würde sich schon ein Observer anbieten.
Ja, generell bietet einem Observer recht viele Möglichkeiten als Event-System. Vielleicht kann man die Löschung von Verweisen gerade als speziellen Event modellieren... Vorläufig werde ich wohl diesen Ansatz ausprobieren, eventuell melde ich mich wieder.

Mechanics schrieb:
Was hat das alles für einen Sinn? Zufallszahlen sollte man ganz sicher nicht brauchen und auch nicht verwenden.
Ich finde die Idee gar nicht so schlecht, allerdings könnte man fortlaufende Ganzzahlen statt Zufallszahlen verwenden, um Kollisionen zu vermeiden.

Und bitte verwendet nicht gleich Full-Quotes, besonders wenn der zitierte Beitrag gerade darüber steht ;)

nwp3 schrieb:
Zuerst würde ich Objekte nicht sofort löschen. Zwischen "Einheit stirbt" und "Einheit verschwindet" vergeht ja einige Zeit (Sterbeanimation).
Ja, bisher hatte ich auch meist ein Flag gesetzt und in regelmässigen Abständen alle markierten Objekte entfernt. Eigentlich können die Verweise schon zum Todeszeitpunkt (vor dem Löschzeitpunkt) entfernt werden, falls keine Interaktion mit toten Objekten mehr stattfindet.

nwp3 schrieb:
Die Einheiten können außerdem einen Referenzzähler bekommen. Jedes Objekt, dass ein anderes Objekt referenziert, erhöht den Referenzzähler dieses Objekts und verringert ihn wieder sobald die Referenz weggenommen wird. Das letzte Objekt, dass die Referenz löscht, löscht auch das Objekt (mit einem Weltobjekt, dass Referenzen auf alle nicht toten Objekte hat um ihre Löschung zu verhindern).
Das wäre im Prinzip der std::shared_ptr-Ansatz, nur von Hand programmiert.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16050
Beitrag hustbaer Mitglied 21:51:31 05.08.2012   Titel:              Zitieren

Nexus schrieb:
nwp3 schrieb:
Die Einheiten können außerdem einen Referenzzähler bekommen. (...)
Das wäre im Prinzip der std::shared_ptr-Ansatz, nur von Hand programmiert.

Das wäre der intrusive_ptr Ansatz. Und der hat u.A. den Vorteil dass man nicht für die Thread-Safety bezahlt (InterlockedIncrement) die man gar nicht braucht.

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
Nexus
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.05.2006
Beiträge: 10301
Beitrag Nexus Mitglied 22:02:15 06.08.2012   Titel:              Zitieren

Stimmt, an boost::intrusive_ptr habe ich gar nicht gedacht, danke für den Hinweis.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16050
Beitrag hustbaer Mitglied 00:44:22 07.08.2012   Titel:              Zitieren

Wobei das (Ref-Counting/intrusive_ptr) mMn. den Nachteil hat, dass man u.U. Objekte am Leben erhält die eigentlich schon weg sein sollten.

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
TyRoXx
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.06.2009
Beiträge: 1034
Beitrag TyRoXx Mitglied 01:32:58 07.08.2012   Titel:              Zitieren

Ich habe bisher gute Erfahrungen mit boost::signal und dem Verzicht auf shared ownership gemacht. Signal ist die Implementation des Observation Pattern in C++ und es gibt keine guten Argumente dagegen. Den resultierenden, verständlichen Code bezahle ich gerne mit einem leicht höheren Ressourcenbedarf.

Shared ownership wie mit shared_ptr oder intrusive_ptr ist meistens ein Designfehler, der zu zyklischen Abhängigkeiten und seltsamen Bugs führt (man verliert leicht den Überblick über die gerade vorhandenen Zeiger).
weak_ptr sollte nicht missbraucht werden, um zerstörte Objekte irgendwann irgendwo auszutragen. Das ist ein unlogischer Hack.

Außerdem trenne ich das inhaltliche Verschwinden eines Spielobjektes von der Zerstörung des C++-Objektes. Das gehört schließlich zum normalen Verhalten des Objektes und nicht zur Ressourcenverwaltung. RAII ist nicht das geeignete Mittel, um andere Objekte zu benachrichtigen. Was tun mit einer Ausnahme im Destruktor? Es gibt keine Möglichkeit, die weiterzureichen. Wie verhindern, dass sich das Programm beim Beenden unnötig mit Benachrichtigungen aufhält oder dass unerwünschte Seiteneffekte auftreten?

Wenn ein Objekt in der Spielwelt ungültig wird, ruft es ein Signal auf, bei dem sich zuvor alle Beobachter des Objektes eingetragen haben. Die können sofort angemessen reagieren. Ein Beobachter muss sich nur an die einfache Regel halten, dass das beobachtete Objekt nach dem abgeschlossenen Aufruf des Signals nicht mehr benutzt werden darf. Wer das beobachtete Objekt besitzt, kann dem Beobachter egal sein. Zwei Objekte können sich problemlos gegenseitig beobachten, das hat keinen Einfluss auf die Lebenszeiten.

Aus solchen einfachen Überlegungen ergibt sich fast von selbst das gesamte Design. Ganz ohne shared_ptr oder andere Hacks.

shared_ptr hat durchaus seine Anwendungen, siehe Completion Handler in Boost Asio. Da braucht man Wertsemantik und Thread-Sicherheit -> shared_ptr. Bei Beobachtern und Beobachteten hat der aber nichts zu suchen.

_________________
.. aber dann wäre C++ uneinheitlich und nicht mehr so anfängergerecht.


Zuletzt bearbeitet von TyRoXx am 18:55:58 07.08.2012, insgesamt 1-mal bearbeitet
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16050
Beitrag hustbaer Mitglied 18:53:26 07.08.2012   Titel:              Zitieren

TyRoXx schrieb:
Ich habe bisher gute Erfahrungen mit boost::signal und dem Verzicht und shared ownership gemacht. Signal ist die Implementation des Observation Pattern in C++ und es gibt keine guten Argumente dagegen.

Doch, dass es nicht threadsafe ist. In diesem Fall egal, in anderen nicht.

Und genau da kommt auch schon der Fall daher wo man doch weak_ptr beim Observer-Pattern braucht: wenn die Löschung von Objekten gleichzeitig mit dem Feuern von Events in unterschiedlichen Threads passieren kann.
Dann muss man beim Auslösen des Events nämlich ca. sowas machen:
C++:
for (auto entry : blah)
    if (shared_ptr<Observer> o = entry.weakObserver.lock())
        o->Notify();


Wobei es natürlich vorteilhaft wäre den Fall (gleichzeitiges Löschen und Feuern von Events) ganz zu vermeiden. Was vermutlich in den meisten Fällen auch (sinnvoll) möglich ist.

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
TyRoXx
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.06.2009
Beiträge: 1034
Beitrag TyRoXx Mitglied 19:06:50 07.08.2012   Titel:              Zitieren

hustbaer schrieb:

Und genau da kommt auch schon der Fall daher wo man doch weak_ptr beim Observer-Pattern braucht: wenn die Löschung von Objekten gleichzeitig mit dem Feuern von Events in unterschiedlichen Threads passieren kann.
Dann muss man beim Auslösen des Events nämlich ca. sowas machen:
C++:
for (auto entry : blah)
    if (shared_ptr<Observer> o = entry.weakObserver.lock())
        o->Notify();


Boost.Signals2 sollte so etwas erlauben, wenn man es denn braucht.
Dass shared_ptr und weak_ptr bei der Implementation von Signal/2 nützlich sind, will ich gar nicht bestreiten. In der eigentlichen Anwendung haben sie aber selten eine Daseinsberechtigung.

_________________
.. aber dann wäre C++ uneinheitlich und nicht mehr so anfängergerecht.
Nexus
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.05.2006
Beiträge: 10301
Beitrag Nexus Mitglied 22:51:27 07.08.2012   Titel:              Zitieren

Boost.Signals2 ist auch ein gutes Stichwort. Ich habe nur vor langer Zeit einmal Signals1 verwendet, müsste mich wieder genau einlesen.

hustbaer, wurde Signals2 nicht vor allem mit der Motivation entwickelt, threadsicher zu sein?
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16050
Beitrag hustbaer Mitglied 23:08:26 07.08.2012   Titel:              Zitieren

Nexus schrieb:
Boost.Signals2 ist auch ein gutes Stichwort. Ich habe nur vor langer Zeit einmal Signals1 verwendet, müsste mich wieder genau einlesen.

hustbaer, wurde Signals2 nicht vor allem mit der Motivation entwickelt, threadsicher zu sein?

Soweit ich das in Erinnerung habe: ja.
Es was aber die Rede von "signals" (=signals1) ;)

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
c++.de :: Spiele-/Grafikprogrammierung ::  Verweise auf andere Entities  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.