我想在不使用QT的项目中使用信号/插槽库。我有很基本的要求:
我读过comparison between libsigc++ and Boost.Signals。我还读到Boost.Signals的性能不佳。但是,我知道还有其他库,我仍然不确定应该选择哪个库。
是否有关于信号/插槽库的建议?
答案 0 :(得分:17)
首先,尝试使用boost :: signal。在您尝试应用您的特定情况之前,不要认为它不够快
如果它不够有效,那么像FastDelegate这样的东西会满足你的需求吗? (我没试过,但听说在某些情况下这是一个不错的解决方案,其中boost :: signal似乎不适合)。
无论如何,如果在你的应用程序中每帧都使用信号,那么用一些更简单的东西替换信号系统可能是值得的,比如一个容纳对象/仿函数的容器,它们将被称为每帧。信号更多地允许立即“事件”管理,而不是使循环周期动态化(允许改变称为每个帧的函数)。 (我有my own solution(更新:它现在非常古老而且陈旧)我在游戏中大量使用,例如我对性能没有任何问题,所以也许类似的东西可以帮助。)
答案 1 :(得分:14)
在分析某些代码时,我一直都是 最近工作,我很惊讶 并惊愕地看到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)
答案 9 :(得分:0)
另一个选项可以是YSignalSlot。我用过它。我认为这很不错。
答案 10 :(得分:0)
这个看起来不错的替代实现怎么样:http://endl.ch/content/fastsig?