我应该选择哪个C ++信号/插槽库?

时间:2008-12-11 16:18:22

标签: c++ boost signals-slots

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

  1. 使用任意数量的参数连接两个函数。
  2. 信号可以连接到多个插槽。
  3. 手动断开信号/插槽连接。
  4. 体面的表现 - 应用程序是基于帧的(即不是基于事件的),我想在每个帧中使用连接。
  5. 我读过comparison between libsigc++ and Boost.Signals。我还读到Boost.Signals的性能不佳。但是,我知道还有其他库,我仍然不确定应该选择哪个库。

    是否有关于信号/插槽库的建议?

11 个答案:

答案 0 :(得分:17)

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

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

无论如何,如果在你的应用程序中每帧都使用信号,那么用一些更简单的东西替换信号系统可能是值得的,比如一个容纳对象/仿函数的容器,它们将被称为每帧。信号更多地允许立即“事件”管理,而不是使循环周期动态化(允许改变称为每个帧的函数)。 (我有my own solution(更新:它现在非常古老而且陈旧)我在游戏中大量使用,例如我对性能没有任何问题,所以也许类似的东西可以帮助。)

答案 1 :(得分:14)

Gamedev.net表单上的

Very, very fast event library

  

在分析某些代码时,我一直都是   最近工作,我很惊讶   并惊愕地看到boost :: signals   浮动到顶部的函数。对于   那些不知道的人,   boost :: signals非常有用   信号/插槽库可以使用   与boost :: bind一起使用   基于代理的事件处理,如   一看到C#。它很健壮,   功能强大,灵活多变。也是,   我不可思议地学到了   非常慢。对很多人来说   谁使用boost :: signals这很好   因为他们很少调用事件。   我每帧调用几个事件   每个对象,具有可预测的结果。

     

所以我写了自己的。稍微少一些   灵活而有特色。它的   优化每个人的趋势   实际上使用事件。和事件   调用是十五到八十次   比boost :: signals更快。

见链接

答案 2 :(得分:5)

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

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

我说libsigc ++ 2。

答案 3 :(得分:5)

最近继承了一个项目,其中connect为我们的项目目标产生了太多的开销。分析显示在信号中使用了互斥,考虑到我们的信号使用,这是不需要的。用documentation成功替换为虚拟互斥锁。互斥体的速度要快得多,因此请确保您需要它。这可能对其他人浏览这篇文章很有用。

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;

答案 4 :(得分:4)

我会投票给Sigslots,我尝试过其他几种选择(boost,libsig ++,FastDelegates),似乎没有人只是我想要的东西:将函数绑定在一起一种匿名方式,具有自动对象破坏断开连接。

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

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

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

答案 5 :(得分:3)

之前我使用过libsigc ++,而且非常简单。我认为它不会对性能损失产生太大影响,事实上我学会了在一些地方使用插槽而不是函数指针。

有一点需要注意的是,自从我上次使用它(2年前)以来,它被限制为通过连接传递最多六个参数。

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

答案 6 :(得分:3)

我使用过boost signals2库,速度非常慢。在具有升压信号的物体的构造上,升压信号堆栈消耗99%的处理器时间。在具有单个simle插槽的信号发射时,它也具有非常大的开销。我尝试使用libsigc ++,它的速度要快得多。 Libsigc ++似乎非常快速和灵活 用9个增强信号和9个libsigc ++信号创建40000个对象:

答案 7 :(得分:1)

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

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

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

Speed vise ksignals非常快速且代码非常轻巧。它应该非常易于使用,理解并在需要时进行修改。

祝你好运 问候 Kjell H

答案 8 :(得分:1)

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

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

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

答案 9 :(得分:0)

另一个选项可以是YSignalSlot。我用过它。我认为这很不错。

答案 10 :(得分:0)

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