Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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?