Я хочу использовать библиотеку сигналов / слотов в проекте, который не использует QT. У меня довольно простые требования:
Я прочитал сравнение между libsigC++ и Boost.Signals. Я также читал, что Boost.Signals страдает низкой производительностью. Однако я знаю, что есть и другие библиотеки, и все еще не уверен, какую библиотеку мне выбрать.
Есть ли какие-нибудь рекомендации по библиотеке сигналов / слотов?
Ссылка мертва ...
@ ManuelSchneid3r спасибо, к счастью, он все еще доступен на archive.org





Раньше я использовал libsigC++, и это было довольно просто. Я не думаю, что это сильно повлияет на производительность, и действительно, я научился использовать слоты вместо указателей функций в нескольких местах.
Одна вещь, о которой нужно знать, заключалась в том, что, когда я последний раз использовал его (2+ года назад), он был ограничен максимум шестью параметрами, передаваемыми через соединения.
У меня нет опыта работы с библиотекой ускорения, поэтому я не могу вам помочь.
Во-первых, все равно попробуйте с boost :: signal. Не думайте, что это будет недостаточно быстро, пока вы не попробуете в своем конкретном случае, это ваше приложение.
Если это недостаточно эффективно, может быть, вам подойдет что-то вроде FastDelegate? (я не пробовал, но слышал, что это хорошее решение в некоторых случаях, когда boost :: signal не подходит).
В любом случае, если в вашем приложении используется сигнал для каждого кадра, возможно, стоит заменить сигнальную систему чем-то более простым, например, контейнером, содержащим объекты / функторы, которые будут вызываться в каждом кадре. Сигнал больше предназначен для немедленного управления «событиями», чем для создания динамического цикла цикла (позволяющего изменять функции, вызываемые каждым кадром). (У меня есть мое собственное решение (ОБНОВЛЕНИЕ: сейчас он очень старый и архаичный), который я активно использую в игре, и, например, у меня нет проблем с производительностью, так что, возможно, что-то подобное могло бы помочь).
Ссылка Google Code не подходит для вашего решения.
@RegularlyScheduledProgramming Спасибо, я обновил ссылку переходом на github, но сейчас это немного архаично. Я использую что-то более современное, но оно не с открытым исходным кодом и не является универсальным, оно специфично для игры, над которой я работаю.
Те двое, что вы перечислили, - единственные, о которых я знаю. Все, что я видел, показало, что libsigC++ демонстрирует максимальную производительность. Как вы видели в сравнении, в некоторых случаях синтаксис boost немного красивее, но совсем немного.
Я лично использовал libsigC++ и доволен им. LibsigC++, похоже, используется в гораздо большем количестве проектов. Беглый взгляд в моем диспетчере пакетов показывает более 100 проектов, зависящих от libsigC++ 2. На мой взгляд, одного этого достаточно, чтобы склонить чашу весов, особенно с учетом преимущества в производительности и отсутствия других существенных отличий.
Я говорю libsigC++ 2.
Дополнение. Для libsigc++ есть дополнительный проект, ориентированный на многопотоковое исполнение: libSigC++ Дополнительно
Очень и очень быстрая библиотека событий в формах Gamedev.net
When profiling some code I'd been working on recently, I was surprised and dismayed to see boost::signals functions floating to the top. For those of you who are unaware, boost::signals is a wonderfully useful signal/slot library which can be used alongside boost::bind for delegate-based event handling such as one sees in C#. It is robust, featureful, and flexible. It is also, I have learned, incredibly, terrifyingly slow. For a lot of people who use boost::signals this is fine because they call events very seldom. I was calling several events per frame per object, with predictable results.
So I wrote my own. Slightly less flexible and featureful. It's optimized for how everyone tends to actually use events. And event invocation is fifteen to eighty times faster than boost::signals.
см. ссылку
Вот фиксированная ссылка для будущих зрителей. gamedev.net/topic/456646-very-very-fast-event-library
Я не использовал libsig ++, но читал об этом. Мой предыдущий опыт работы с сигналами и слотами взят из Qt и немного из Boost. Если у вас нет ни одного из них, вы можете попробовать мою собственную библиотеку сигналов и слотов (ksignals), которые существуют как для встроенного кода (без выделения динамической памяти), так и для «обычного» кода C++ (динамическое выделение памяти при подключении).
Вы можете найти его по адресу: www.kjellkod.cc/signalandslots
На странице вы также можете найти сравнение: сигналы KSignals Vs Boost.
Скоростные тиски ksignals очень быстрые и чрезвычайно легкие с точки зрения кода. Он должен быть очень простым в использовании, понимании и, при необходимости, его изменении.
Удачи С Уважением Kjell H
Еще одна реализация sig-слота, которую стоит рассмотреть:
http://code.google.com/p/ting/wiki/SignalSlotUsage
Он не претендует на звание лучшего, но все же еще один, имеющий право на существование.
Я бы проголосовал за Сиглоты, я попробовал несколько других альтернатив (boost, libsig ++, FastDelegates), и ни одна из них, похоже, не сделала просто того, что я хотел: связывание функций анонимным способом с автоматическим отключением при уничтожении объекта.
Sigslots был для нас отличным вариантом, потому что он отлично читается на C++, он быстрый, простой и выполняет свою работу, не мешая. Одна мелочь, если вы хотите использовать его из нескольких библиотек, вам может потребоваться добавить:
COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;
чтобы избежать проблем связывания, связанных с уже определенными объектами.
Я тоже предпочитаю этот. Чтобы заставить его работать с Clang и libC++, мне пришлось применить некоторые патчи, найденные на форумах Sourceforge, и самому внести некоторые изменения: github.com/catnapgames/SigSlot
похоже, у этого есть утечка памяти.
Я использовал библиотеку boost signal2, и она очень медленная. При построении объекта с повышающими сигналами 99% процессорного времени затрачивается на стек повышающих сигналов. На сигналы, излучаемые с помощью одного слота simle, также были очень большие накладные расходы. Я пробую libsigC++, и он намного быстрее. LibsigC++ кажется очень быстрым и гибким
Создание 40000 объектов с 9 сигналами повышения и 9 сигналами libsigC++: 
Недавно унаследовал проект, в котором connect производил слишком много накладных расходов для целей нашего проекта. Профилирование выявило использование мьютекса в сигнале, что было ненужным с учетом нашего использования сигнала. Заменен фиктивным мьютексом на документация с успехом. Мьютекс «значительно медленнее», поэтому убедитесь, что он вам нужен. Это может быть полезно для других, просматривающих этот пост.
Оригинал
typedef boost::signals2::signal_type<void()>::type signal_type;
Новый
typedef boost::signals2::signal_type<void(), boost::signals2::keywords::mutex_type<boost::signals2::dummy_mutex> >::type signal_type;
Другой вариант - YSignalSlot. Я использовал это. Я думаю, это неплохо.
Как насчет этой альтернативной реализации, которая выглядит хорошо: http://endl.ch/content/fastsig?
есть ли какие-либо реализации только в заголовке решений? знаете ли вы о реализации, использующей только стандартные библиотечные функции / типы? Мы используем boost :: signal, но хотим избавиться от этой довольно большой зависимости.