2008-12-11 9 views
35

Ich möchte eine Bibliothek für Signale/Slots in einem Projekt verwenden, das QT nicht verwendet. Ich habe ziemlich grundlegende Anforderungen:Welche C++ - Signal-/Slots-Bibliothek soll ich wählen?

  1. Verbinden Sie zwei Funktionen mit einer beliebigen Anzahl von Parametern.
  2. Signale können an mehrere Steckplätze angeschlossen werden.
  3. Manuelle Trennung der Signal-/Steckplatzverbindung.
  4. Anständige Leistung - die Anwendung ist Frame-basiert (d. H. Nicht ereignisbasiert) und ich möchte die Verbindungen in jedem Rahmen verwenden.

Ich habe eine comparison between libsigc++ and Boost.Signals gelesen. Ich habe auch gelesen, dass Boost.Signals an schlechter Leistung leidet. Ich weiß jedoch, dass es andere Bibliotheken gibt und ich bin mir immer noch nicht sicher, welche Bibliothek ich wählen sollte.

Gibt es Empfehlungen für eine Signal/Slots-Bibliothek?

+0

sind einige der Lösungen nur Header-Implementierungen? Kennen Sie eine Implementierung, die nur Standardbibliotheksfunktionen/-typen verwendet? Wir benutzen boost :: signals, wollen aber diese ziemlich große Abhängigkeit loswerden. – nietras

+0

Link ist tot ... – ManuelSchneid3r

+0

@ ManuelSchneid3r vielen Dank, zum Glück ist es noch verfügbar von archive.org – kshahar

Antwort

17

Zuerst, versuchen Sie mit boost :: Signal trotzdem. Nehmen Sie nicht an, es wird nicht schnell genug sein, bis Sie in Ihrem speziellen Fall versuchen, dass Ihre Anwendung ist

Wenn es nicht effizient genug ist, vielleicht etwas wie FastDelegate wird Ihren Bedürfnissen entsprechen? (Ich habe es nicht versucht, aber es war eine gute Lösung in einigen Fällen, in denen boost :: signal nicht passt).

Wie auch immer, wenn in Ihrer Anwendung das Signal für jeden Frame verwendet wird, kann es sich lohnen, das Signalsystem durch etwas Einfacheres zu ersetzen, wie einen Container, der Objekte/Funktoren enthält, die in jedem Frame aufgerufen werden. Das Signal wird mehr dazu verwendet, ein sofortiges "Ereignis" -Management zu ermöglichen, als einen Schleifenzyklus dynamisch zu machen (was es erlaubt, die Funktionen, die in jedem Rahmen genannt werden, zu ändern). (Ich habe my own solution (UPDATE: es ist sehr alt und archaisch jetzt), dass ich stark in einem Spiel verwende und zum Beispiel habe ich kein Problem mit der Leistung, also vielleicht etwas ähnliches könnte helfen).

+0

Der Google Code Link ist tot für Ihre Lösung. – RegularlyScheduledProgramming

+0

@RegularlyScheduledProgramming Danke, ich habe den Link mit dem Umstieg auf GitHub aktualisiert, aber es ist jetzt ein bisschen archaisch. Ich benutze etwas moderneres, aber es ist weder Open Source, noch ist es so konzipiert, dass es generisch ist, es ist spezifisch für das Spiel, an dem ich arbeite. – Klaim

3

Ich habe libsigC++ zuvor verwendet, und es war ziemlich einfach. Ich denke nicht, dass es viel Leistungspraktiken hätte, und in der Tat habe ich gelernt, Slots anstelle von Funktionszeigern an einigen Stellen zu benutzen.

Eine Sache zu beachten war, dass bei der letzten Zeit, die ich es (vor 2 Jahren) verwendet wurde, es auf maximal sechs Parameter beschränkt wurde, die durch die Verbindungen geleitet wurden.

Ich habe keine Erfahrung mit der Boost-Bibliothek, so kann ich Ihnen nicht helfen.

5

Die beiden, die Sie aufgelistet haben, sind die einzigen, die ich kenne. Alles, was ich gesehen habe, hat gezeigt, dass libsigC++ zu Höchstleistungen aufsteigt. Wie Sie im Vergleich gesehen haben, gibt es einige Fälle, in denen die Boost-Syntax ein wenig hübscher ist, aber nur ein bisschen.

Ich habe persönlich libsigC++ benutzt und bin damit zufrieden. LibsigC++ scheint von weitaus mehr Projekten verwendet zu werden. Ein kurzer Blick in meinen Paketmanager listet mehr als 100 Projekte auf, die von libsigC++ 2 abhängig sind. Das allein reicht meiner Meinung nach aus, um das Gleichgewicht zu balancieren, insbesondere unter Berücksichtigung des Leistungsvorteils und des Fehlens anderer signifikanter Unterschiede.

Ich sage libsigC++ 2.

+0

Ein Zusatz. Es gibt ein extra Projekt für 'libsigC++' welches threadsicher ist: [libSigC++ Extras] (http://libsigcx.sourceforge.net/) –

13

Very, very fast event library auf Gamedev.Netto-Formen

Wenn einige Codes Profilierungs würde ich vor kurzem gearbeitet worden, ich war überrascht, und bestürzt zu sehen boost :: Signale Funktionen nach oben schweben. Für diejenigen, die nicht bewusst sind, boost :: Signale ist eine wunderbar nützliche Signal/Slot-Bibliothek, die neben Boost verwendet werden kann :: bind für Delegaten-basierte Event-Handling wie eine in C# sieht. Es ist robust, Feature und flexibel. Es ist auch, Ich habe gelernt, unglaublich, erschreckend langsam. Für viele Leute wer Boost :: Signale verwenden ist das in Ordnung , weil sie Ereignisse sehr selten nennen. Ich rief mehrere Ereignisse pro Frame pro Objekt, mit vorhersehbaren Ergebnissen.

Also schrieb ich meine eigenen. Etwas weniger flexibel und funktional. Es ist optimiert für wie jeder tatsächlich Ereignisse verwendet. Und Ereignis Aufruf ist fünfzehn bis achtzig mal schneller als boost :: Signale.

siehe Link

+4

Hier ist ein fester Link für zukünftige Zuschauer. http://www.gamedev.net/topic/456646-very-very-fast-event-library/ –

1

Ich habe Libsig nicht verwendet ++, aber ich habe auf sie nachlesen. Meine bisherigen Erfahrungen mit Signalen und Slots stammen von Qt und ein wenig von Boost. Wenn Sie keine von beiden zur Verfügung haben, können Sie meine eigene Signal- und Slots-Bibliothek (ksignals) ausprobieren, die sowohl für eingebetteten Code (keine dynamische Speicherzuweisung) als auch für "normalen" C++ - Code (dynamische Speicherzuweisung beim Verbinden) existiert.

Sie können es unter: www.kjellkod.cc/signalandslots

Auf der Seite, die Sie auch einen Vergleich finden: KSignals Vs-Boost-Signale.

Speed ​​Vise Ksignale ist sehr schnell und extrem leicht Code. Es sollte sehr einfach zu verwenden, zu verstehen und wenn nötig zu ändern.

Viel Glück Grüße Kjell H

4

ich für Sigslots stimmen würde, habe ich ein paar der anderen Alternativen ausprobiert (Boost, Libsig ++, FastDelegates) und keiner schien zu tun nur, was ich wollte: binding Funktionen zusammen in anonymisierter Form mit automatischem on-Objekt -Zerstörung trennen.

Sigslots war großartig für uns, denn es ist perfekt lesbar C++, es ist schnell, einfach und macht den Job, ohne in die Quere kommen. Eine kleine Sache, wenn man es aus mehreren Bibliotheken verwenden möchten können Sie hinzufügen müssen:

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>; 

zu vermeiden, bereits definierte objektbezogene Verknüpfung Fragen.

+1

Ich bevorzuge diese auch. Um es mit Clang und libC++ funktionieren zu lassen, musste ich einige Patches in den Sourceforge-Foren installieren und selbst einige Anpassungen vornehmen: https://github.com/catnapgames/SigSlot –

+1

Und wie ich auf der Sourceforge-Seite sehe, ist es auch threadsicher ! –

+0

es scheint, dass dieses Speicherleck haben. – Jichao

3

Ich habe Boost Signal2-Bibliothek verwendet, und es ist sehr langsam. Beim Aufbau eines Objekts mit Boost-Signalen werden 99% der vom Boost-Signal-Stack verbrauchten Prozessorzeit verbraucht. On-Signale emittieren mit einzelnen Simle-Slot auch hatte es sehr große Overhead. Ich versuche libsigC++ und es ist deutlich schneller. LibsigC++ scheint mit 9 Boost-Signale und 9 libsigC++ Signale sehr schnell und flexibel Schaffung von 40.000 Objekten zu sein:

5

kürzlich ein Projekt geerbt, wo connect wurde für unsere Projektziele zu viel Aufwand zu erzeugen. Das Profiling hat gezeigt, dass im Signal ein Mutex verwendet wurde, der bei unserer Signalverwendung nicht benötigt wurde. Ersetzt mit einem Dummy-Mutex nach dem documentation mit Erfolg. Der Mutex ist "drastisch langsamer", also stellen Sie sicher, dass Sie ihn brauchen. Dies kann für andere nützlich sein, die diesen Beitrag lesen.

Original- typedef boost::signals2::signal_type<void()>::type signal_type;

New typedef boost::signals2::signal_type<void(), boost::signals2::keywords::mutex_type<boost::signals2::dummy_mutex> >::type signal_type;

0

Eine weitere Option kann YSignalSlot sein. Ich benutzte es. Ich denke, es ist ziemlich gut.