39

我想在不使用 QT 的项目中使用信号/插槽库。我有非常基本的要求:

  1. 用任意数量的参数连接两个函数。
  2. 信号可以连接到多个插槽。
  3. 手动断开信号/插槽连接。
  4. 体面的性能 - 应用程序是基于框架的(即不是基于事件的),我想在每个框架中使用连接。

我读过libsigc++ 和 Boost.Signals 之间的比较。我还读到 Boost.Signals 性能不佳。但是,我知道还有其他库,但我仍然不确定应该选择哪个库。

对信号/插槽库有什么建议吗?

4

11 回答 11

18

首先,无论如何都尝试使用 boost::signal 。在您尝试您的应用程序的特定情况之前,不要认为它不够快

如果它不够高效,也许像FastDelegate这样的东西会满足您的需求?(我没有尝试过,但听说在 boost::signal 似乎不适合的某些情况下这是一个不错的解决方案)。

无论如何,如果在您的应用程序中每帧都使用信号,则可能值得用更简单的东西替换信号系统,例如保存将在每帧调用的对象/函子的容器。信号更多地允许即时“事件”管理,而不是使循环周期动态化(允许更改调用每个帧的函数)。(我有自己的解决方案(更新:它现在非常古老且过时),我在游戏中大量使用,例如我对性能没有问题,所以也许类似的东西可能会有所帮助)。

于 2008-12-13T21:07:08.383 回答
15

Gamedev.net 表单上非常非常快速的事件库

在分析我最近一直在处理的一些代码时,看到 boost::signals 函数浮动到顶部,我感到惊讶和沮丧。对于那些不知道的人,boost::signals 是一个非常有用的信号/槽库,它可以与 boost::bind 一起用于基于委托的事件处理,例如在 C# 中看到的。它健壮、功能丰富且灵活。它也是,我了解到,令人难以置信的,可怕的缓慢。对于很多使用 boost::signals 的人来说,这很好,因为他们很少调用事件。我在每个对象的每帧调用几个事件,结果可预测。

所以我自己写了。灵活性和功能性稍差。它针对每个人实际使用事件的方式进行了优化。而且事件调用比 boost::signals 快十五到八十倍。

见链接

于 2009-09-11T22:34:11.277 回答
5

你列出的两个是我所知道的唯一两个值得的。我所看到的一切都表明 libsigc++ 在性能方面表现出色。正如您在比较中看到的那样,在某些情况下 boost 的语法更漂亮一些,但只是一点点。

我个人使用过 libsigc++ 并且对它很满意。Libsigc++ 似乎被更多的项目使用。快速浏览一下我的包管理器,列出了 100 多个依赖于 libsigc++2 的项目。在我看来,仅这一点就足以使平衡倾斜,特别是考虑到性能优势和缺乏其他显着差异。

我说 libsigc++2。

于 2009-09-11T22:30:07.563 回答
5

最近继承了一个项目,该项目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;

于 2014-08-28T16:54:31.757 回答
4

我会投票给Sigslots,我尝试了其他几个替代方案(boost、libsig++、Fas​​tDelegates),但似乎没有一个能做到想要的:以匿名方式将函数绑定在一起,并自动断开对象销毁。

Sigslots 对我们来说很棒,因为它是完全可读的 C++,它快速、简单,并且可以在不妨碍工作的情况下完成工作。一件小事,如果您想从多个库中使用它,您可能需要添加:

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

以避免与已定义对象相关的链接问题。

于 2010-12-30T09:39:14.427 回答
3

我以前使用过 libsigc++,它非常简单。我认为它不会对性能造成太大影响,而且实际上我学会了喜欢在一些地方使用插槽而不是函数指针。

需要注意的一件事是,截至我上次使用它时(2 多年前),它被限制为最多六个参数通过连接传递。

我对 boost 库没有任何经验,所以我无法帮助你。

于 2008-12-11T16:57:07.247 回答
3

我使用了 boost signals2 库,它非常慢。在构造带有升压信号的对象时,升压信号堆栈消耗了 99% 的处理器时间。在使用单个simle slot 发出的信号上,它也有非常大的开销。我尝试了 libsigc++,它明显更快。Libsigc++ 似乎非常快速和灵活地创建 40000 个对象,具有 9 个升压信号和 9 个 libsigc++ 信号:

于 2013-12-08T04:43:39.650 回答
1

我没有使用 libsig++,但我已经阅读了它。我之前对信号和插槽的经验来自 Qt,还有一点来自 Boost。如果您没有可用的任何一个,那么您可以尝试我自己的信号和插槽库(ksignals),它既适用于嵌入式代码(无动态内存分配),也适用于“普通”c++ 代码(连接时的动态内存分配)。

您可以在以下网址找到它:www.kjellkod.cc/signalandslots

在该页面上,您还可以找到一个比较:KSignals Vs Boost 信号。

速度虎钳 ksignals 非常快速且非常轻量级的代码。它应该非常易于使用、理解,并在需要时对其进行修改。

祝你好运 问候 Kjell H

于 2010-01-07T14:48:02.237 回答
1

要考虑的另一种 sig-slot 实现:

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

它不假装是最好的,但仍然是另一个有权存在的人。

于 2010-03-11T13:32:45.193 回答
0

另一个选项可以是YSignalSlot。我用过。我觉得还不错。

于 2014-09-04T21:56:53.897 回答
0

这个看起来不错的替代实现怎么样:http: //endl.ch/content/fastsig

于 2014-11-26T17:08:59.940 回答