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

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

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

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

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

11.12.2008 16:18:22
какие-либо из решений только заголовок реализации? Вы знаете о реализации, использующей только стандартные библиотечные функции / типы? Мы используем boost :: сигналы, но хотим избавиться от этой довольно большой зависимости.
nietras 9.07.2015 08:35:08
Ссылка мертва ...
ManuelSchneid3r 3.10.2016 18:31:59
@ ManuelSchneid3r спасибо, к счастью, он все еще доступен на archive.org
kshahar 4.10.2016 11:44:29
11 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

18
30.11.2016 10:20:34
Ссылка Google Code недействительна для вашего решения.
RegularlyScheduledProgramming 28.11.2016 16:56:05
@RegularlyScheduledProgramming Спасибо, я обновил ссылку с переходом на github, но теперь это немного архаично. Я использую что-то более современное, но оно не с открытым исходным кодом и не предназначено для того, чтобы быть универсальным, оно специфично для игры, над которой я работаю.
Klaim 30.11.2016 10:22:58

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

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

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

3
11.12.2008 16:57:07

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

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

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

5
21.09.2009 15:40:14
Дополнение. Существует дополнительный проект, для libsigc++которого потокобезопасен: libSigC ++ Extras
Adri C.S. 26.04.2013 09:56:56

Очень, очень быстрая библиотека событий на формах Gamedev.net

При профилировании некоторого кода, над которым я недавно работал, я был удивлен и встревожен, увидев, что функции boost :: signal всплывают наверх. Для тех из вас, кто не знает, boost :: signal является удивительно полезной библиотекой сигналов / слотов, которую можно использовать вместе с boost :: bind для обработки событий на основе делегатов, например, в C #. Это надежный, многофункциональный и гибкий. Я также узнал, что это невероятно, ужасающе медленно. Для многих людей, использующих сигналы boost ::, это хорошо, потому что они вызывают события очень редко. Я вызывал несколько событий на кадр на объект с предсказуемыми результатами.

Поэтому я написал свой. Чуть менее гибкий и функциональный. Он оптимизирован для того, чтобы каждый действительно использовал события. И вызов события в пятнадцать-восемьдесят раз быстрее, чем boost :: сигналы.

см ссылку

15
20.05.2011 12:42:28
Вот фиксированная ссылка для будущих зрителей. gamedev.net/topic/456646-very-very-fast-event-library
Joel Verhagen 3.04.2011 14:50:23

Я не использовал libsig ++, но я прочитал об этом. Мой предыдущий опыт с сигналами и слотами был от Qt и немного от Boost. Если у вас нет ни одного из них, вы можете попробовать мою собственную библиотеку сигналов и слотов (ksignals), которая существует как для встроенного кода (без динамического выделения памяти), так и для «нормального» кода C ++ (динамическое распределение памяти при подключении).

Вы можете найти его по адресу: www.kjellkod.cc/signalandslots

На странице вы также можете найти сравнение: KSignals Vs Boost сигналы.

Speed ​​vise ksignals - очень быстрый и очень легкий код. Он должен быть очень простым в использовании, понимании и при необходимости его модифицировать.

Удачи С уважением Kjell H

1
7.01.2010 14:48:02

Еще одна реализация sig-slot для рассмотрения:

http://code.google.com/p/ting/wiki/SignalSlotUsage

Он не претендует на звание лучшего, но, тем не менее, другого, который имеет право на существование.

1
11.03.2010 13:32:45

Я бы голосовать за Sigslots , я попробовал несколько других альтернатив (импульс, libsig ++, FastDelegates) , и никто , казалось , не делать только то , что я хотел: связывание функции вместе анонимно с автоматическим отключением по-объекта уничтожения.

Sigslots были отличными для нас, потому что это отлично читаемый C ++, он быстрый, простой и выполняет свою работу, не мешая. Одна небольшая вещь, если вы хотите использовать его из нескольких библиотек, вам может потребоваться добавить:

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

чтобы избежать уже связанных с объектами проблем со связыванием.

4
30.12.2010 09:49:38
Я тоже предпочитаю это. Чтобы заставить его работать с Clang и libc ++, мне пришлось применить некоторые исправления, найденные на форумах Sourceforge, и внести некоторые изменения самостоятельно: github.com/catnapgames/SigSlot
Tomas Andrle 13.12.2012 15:25:10
Кажется, у этого есть утечка памяти.
Jichao 1.11.2013 08:27:33

Я использовал библиотеку boost сигналов2, и она очень медленная. На строительство объекта с сигналами буста, 99% процессорного времени расходуется стеком сигналов буста. На сигналах, излучаемых одним слотом simle, также были очень большие издержки. Я пытаюсь libsigc ++, и это значительно быстрее. Libsigc ++ кажется очень быстрым и гибким. Создание 40000 объектов с 9 сигналами повышения и 9 сигналами libsigc ++:

3
8.12.2013 04:43:39

Недавно унаследовал проект, 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;

5
28.08.2014 16:54:31

Другим вариантом может быть YSignalSlot . Я использовал это. Я думаю, что это довольно хорошо.

0
4.09.2014 21:56:53

Как насчет этой альтернативной реализации, которая выглядит хорошо: http://endl.ch/content/fastsig ?

0
26.11.2014 17:08:59