Какую библиотеку сигналов/слотов С++ я должен выбрать?
Я хочу использовать библиотеку сигналов/слотов в проекте, который не использует QT. У меня довольно простые требования:
- Соединить две функции с любым количеством параметров.
- Сигналы могут быть подключены к нескольким слотам.
- Ручное отключение соединения сигнала/слота.
- Достойная производительность - приложение основано на фреймах (т.е. не основано на событиях), и я хочу использовать соединения в каждом фрейме.
Я прочитал сравнение между libsigС++ и Boost.Signals. Я также читал, что Boost.Signals страдает от низкой производительности. Тем не менее, я знаю, что есть другие библиотеки, и я все еще не уверен, какую библиотеку я должен выбрать.
Есть ли рекомендации для библиотеки сигналов/слотов?
Ответы
Ответ 1
Во-первых, попробуйте с boost:: signal. Не предполагайте, что он не будет достаточно быстрым, пока вы не попробуете в своем конкретном случае, которое является вашим приложением.
Если он недостаточно эффективен, возможно, что-то вроде FastDelegate будет соответствовать вашим потребностям? (я не пробовал, но слышал, что это было приятное решение в некоторых случаях, когда boost:: signal, похоже, не подходит).
В любом случае, если в вашем приложении использовать сигнал для каждого кадра, может быть стоит заменить сигнальную систему чем-то более простым, например, контейнером, в котором хранятся объекты/функторы, которые будут называться каждым фреймом. Сигнал больше сделан для обеспечения немедленного управления "событиями", чем для циклического цикла цикла (позволяющего изменять функции, называемые каждым фреймом).
(Я мое собственное решение (UPDATE: он очень старый и архаичный), который я сильно использую в игре, и, например, у меня нет проблема с производительностью, возможно, что-то подобное может помочь).
Ответ 2
Очень, очень быстрая библиотека событий на формах Gamedev.net
При профилировании некоторого кода я был работая в последнее время, я был удивлен и с тревогой увидели сигналы boost:: функции, плавающие в верхней части. Для те из вас, кто не знает, boost:: сигналы - замечательно полезный библиотеку сигналов/слотов, которые можно использовать наряду с boost:: bind для обработка на основе делегатов, такая как один видит в С#. Это надежный, функциональный и гибкий. Это также, Я узнал, невероятно, ужасно медленно. Для многих людей которые используют boost:: сигналы, это прекрасно потому что они называют события очень редко. Я вызывал несколько событий за кадр на объект, с предсказуемыми результатами.
Итак, я написал свое. Немного меньше гибкий и функциональный. Это оптимизированы для того, как все стремятся на самом деле использовать события. И событие вызов - пятнадцать-восемьдесят раз быстрее, чем boost:: сигналы.
см. ссылку
Ответ 3
Два, которые вы указали, являются единственными, стоит того, о чем я знаю. Все, что я видел, показало, что libsigС++ выходит на первое место. Как вы видели в сравнении, есть некоторые примеры, когда синтаксис boost немного красивее, но немного.
Я лично использовал libsigС++ и доволен этим. LibsigС++, похоже, используется гораздо большим количеством проектов. Быстрый просмотр в моем менеджере пакетов содержит более 100 проектов, зависящих от libsigС++ 2. На мой взгляд, это достаточно, чтобы отклонить баланс, особенно учитывая преимущество производительности и отсутствие других существенных различий.
Я говорю libsigС++ 2.
Ответ 4
Недавно унаследовал проект, в котором connect
создавал слишком много накладных расходов для наших целей проекта. Профилирование показало использование мьютекса в сигнале, который был ненужным, учитывая использование нашего сигнала. Заменено с помощью фиктивных мьютексов на документация с успехом. Мьютекс "значительно медленнее", поэтому убедитесь, что он вам нужен. Это может быть полезно для других, снимающих этот пост.
Оригинал
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;
Ответ 5
Я проголосовал бы за Sigslots, я пробовал пару других альтернатив (boost, libsig++, FastDelegates), и никто, казалось, не делал ничего что я хотел: связывать функции вместе анонимным способом с автоматическим отключением объекта-разрушения.
Sigslots был отличным для нас, потому что он отлично читается на С++, он быстрый, простой и делает работу, не мешая. Одна незначительная вещь, если вы хотите использовать ее из нескольких библиотек, вам может потребоваться добавить:
COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;
чтобы избежать проблем с привязкой к уже определенным объектам.
Ответ 6
Я раньше использовал libsigС++, и это было довольно просто. Я не думаю, что у него было бы много шансов на производительность, и я действительно научился использовать слоты вместо указателей на объекты в нескольких местах.
Одна вещь, о которой нужно было знать, это то, что с последнего раза я использовал ее (2+ года назад), она была ограничена максимум шестью параметрами, проходящими через соединения.
У меня нет опыта работы с библиотекой boost, поэтому я не могу вам помочь.
Ответ 7
Я использовал библиотеку boost signal2, и она очень медленная. При построении объекта с сигналами повышения, 99% процессорного времени потребляется стеком сигнальных сигналов. На сигнальных выходах с одним слотом simle он также имел очень большие накладные расходы. Я пробую libsigС++ и это значительно быстрее. LibsigС++ кажется очень быстрым и гибким
Создание 40000 объектов с 9 сигналами повышения и 9 сигналами libsigС++:
![]()
Ответ 8
Я не использовал libsig++, но я его прочитал. Мой предыдущий опыт работы с сигналами и слотами - от Qt и немного от Boost. Если у вас нет ни одного из них, вы можете опробовать мою собственную библиотеку сигналов и слотов (ksignals), которые существуют как для встроенного кода (без динамического распределения памяти), так и для "нормального" кода С++ (распределение динамической памяти при подключении).
Вы можете найти его по адресу: www.kjellkod.cc/signalandslots
На странице вы также можете найти сравнение: сигналы KSignals Vs Boost.
Скорость vise ksignals - очень быстрый и очень легкий код. Он должен быть очень простым в использовании, понимать и, если необходимо, модифицировать его.
Удачи
С уважением
Kjell H
Ответ 9
Еще одна реализация сиг-слота для рассмотрения:
http://code.google.com/p/ting/wiki/SignalSlotUsage
Он не претендует на то, чтобы быть лучшим, но, тем не менее, другой, который имеет право на существование.
Ответ 10
Другой вариант может быть YSignalSlot. Я использовал его. Я думаю, что это очень хорошо.
Ответ 11
Как насчет этой альтернативной реализации, которая выглядит хорошо: http://endl.ch/content/fastsig?