Какую библиотеку сигналов / слотов C++ мне выбрать?

Я хочу использовать библиотеку сигналов / слотов в проекте, который не использует QT. У меня довольно простые требования:

  1. Соедините две функции с любым количеством параметров.
  2. Сигналы могут быть подключены к нескольким слотам.
  3. Ручное отключение подключения сигнала / слота.
  4. Достойная производительность - приложение основано на кадрах (т.е. не на событиях), и я хочу использовать соединения в каждом кадре.

Я прочитал сравнение между libsigC++ и Boost.Signals. Я также читал, что Boost.Signals страдает низкой производительностью. Однако я знаю, что есть и другие библиотеки, и все еще не уверен, какую библиотеку мне выбрать.

Есть ли какие-нибудь рекомендации по библиотеке сигналов / слотов?

есть ли какие-либо реализации только в заголовке решений? знаете ли вы о реализации, использующей только стандартные библиотечные функции / типы? Мы используем boost :: signal, но хотим избавиться от этой довольно большой зависимости.

nietras 09.07.2015 11:35

Ссылка мертва ...

ManuelSchneid3r 03.10.2016 21:31

@ ManuelSchneid3r спасибо, к счастью, он все еще доступен на archive.org

kshahar 04.10.2016 14:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
38
3
24 161
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Раньше я использовал libsigC++, и это было довольно просто. Я не думаю, что это сильно повлияет на производительность, и действительно, я научился использовать слоты вместо указателей функций в нескольких местах.

Одна вещь, о которой нужно знать, заключалась в том, что, когда я последний раз использовал его (2+ года назад), он был ограничен максимум шестью параметрами, передаваемыми через соединения.

У меня нет опыта работы с библиотекой ускорения, поэтому я не могу вам помочь.

Ответ принят как подходящий

Во-первых, все равно попробуйте с boost :: signal. Не думайте, что это будет недостаточно быстро, пока вы не попробуете в своем конкретном случае, это ваше приложение.

Если это недостаточно эффективно, может быть, вам подойдет что-то вроде FastDelegate? (я не пробовал, но слышал, что это хорошее решение в некоторых случаях, когда boost :: signal не подходит).

В любом случае, если в вашем приложении используется сигнал для каждого кадра, возможно, стоит заменить сигнальную систему чем-то более простым, например, контейнером, содержащим объекты / функторы, которые будут вызываться в каждом кадре. Сигнал больше предназначен для немедленного управления «событиями», чем для создания динамического цикла цикла (позволяющего изменять функции, вызываемые каждым кадром). (У меня есть мое собственное решение (ОБНОВЛЕНИЕ: сейчас он очень старый и архаичный), который я активно использую в игре, и, например, у меня нет проблем с производительностью, так что, возможно, что-то подобное могло бы помочь).

Ссылка Google Code не подходит для вашего решения.

RegularlyScheduledProgramming 28.11.2016 19:56

@RegularlyScheduledProgramming Спасибо, я обновил ссылку переходом на github, но сейчас это немного архаично. Я использую что-то более современное, но оно не с открытым исходным кодом и не является универсальным, оно специфично для игры, над которой я работаю.

Klaim 30.11.2016 13:22

Те двое, что вы перечислили, - единственные, о которых я знаю. Все, что я видел, показало, что libsigC++ демонстрирует максимальную производительность. Как вы видели в сравнении, в некоторых случаях синтаксис boost немного красивее, но совсем немного.

Я лично использовал libsigC++ и доволен им. LibsigC++, похоже, используется в гораздо большем количестве проектов. Беглый взгляд в моем диспетчере пакетов показывает более 100 проектов, зависящих от libsigC++ 2. На мой взгляд, одного этого достаточно, чтобы склонить чашу весов, особенно с учетом преимущества в производительности и отсутствия других существенных отличий.

Я говорю libsigC++ 2.

Дополнение. Для libsigc++ есть дополнительный проект, ориентированный на многопотоковое исполнение: libSigC++ Дополнительно

Adri C.S. 26.04.2013 13:56

Очень и очень быстрая библиотека событий в формах 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

Joel Verhagen 03.04.2011 18:50

Я не использовал 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

Tomas Andrle 13.12.2012 19:25

похоже, у этого есть утечка памяти.

Jichao 01.11.2013 12:27

Я использовал библиотеку 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?

Другие вопросы по теме