我应该select哪个C ++信号/插槽库?
我想在不使用QT的项目中使用信号/插槽库。 我有相当基本的要求:
- 用任意数量的参数连接两个函数。
- 信号可以连接到多个插槽。
- 手动断开信号/插槽连接。
- 体面的性能 – 应用程序是基于帧(即不基于事件),我想在每个帧中使用连接。
我已经阅读了libsigc ++和Boost.Signals之间的比较 。 我也读过Boost.Signals的糟糕performance。 但是,我知道还有其他的库,我还不确定应该select哪个库。
有信号/插槽库的build议吗?
首先,试试boost :: signal。 不要以为它会不够快,直到你在你的应用程序的特定情况下尝试
如果效率不够高,或许FastDelegate会满足您的需求? (我没有尝试,但听说这是一个很好的解决scheme,在某些情况下,boost :: signal似乎不适合)。
无论如何,如果在你的应用程序中使用每一帧的信号,可能需要用一个更简单的东西代替信号系统,就像一个装有将被称为每一帧的对象/函子的容器。 信号更多的是允许立即的“事件”pipe理,而不是使循环dynamic化(允许改变称为每个帧的function)。 (我有我自己的解决scheme (更新:现在是非常古老和古老),我在游戏中大量使用,例如,我没有问题的性能,所以也许类似可以帮助)。
Gamedev.net上非常非常快速的事件库
在分析一些我最近一直在使用的代码时,我惊讶地发现boost :: signals函数漂浮在顶端。 对于那些不知道的人来说,boost :: signals是一个非常有用的信号/插槽库,它可以和boost :: bind一起用于基于委托的事件处理,比如在C#中看到的。 它强大,function强大,灵活。 我也学到了,令人难以置信的是,速度非常缓慢。 对于很多使用boost :: signals的人来说,这很好,因为他们很less调用事件。 我每个对象每帧调用几个事件,结果可预见。
所以我写了我自己的。 稍微不灵活和有特色。 它针对每个人如何倾向于实际使用事件进行了优化。 事件调用比boost :: signals快十五到八十倍。
看链接
你列出的两个是我知道的唯一两个值得。 我所看到的所有东西都显示了libsigc ++在性能方面的突出performance。 正如你在比较中看到的那样,有一些情况下boost的语法有点漂亮,但是稍微有一些。
我个人使用过libsigc ++,并且很满意。 Libsigc ++似乎被大量更多的项目所使用。 快速查看我的软件包pipe理器列出了100多个依赖于libsigc ++ 2的项目。 在我看来,这足以使平衡倾斜,特别是考虑到性能优势以及缺乏其他显着差异。
我说libsigc ++ 2。
最近inheritance了一个项目,在这个项目中, connect
为我们的项目目标产生了太多的开销 分析显示信号中使用了一个互斥体,根据我们的信号使用情况,这是不需要的。 用成功的文档replace为虚拟互斥体。 互斥是“速度极慢”,所以确保你需要它。 这可能会有助于其他人浏览这篇文章。
原始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;
我会投票Sigslots ,我已经尝试了一些其他的select(升压,libsig ++,FastDelegates),似乎没有做任何我想要的:以匿名方式绑定函数与自动的对象破坏断开连接。
Sigslots对我们来说是非常棒的,因为它是完全可读的C ++,它非常快速,简单,而且不会妨碍工作。 一个小问题,如果你想从几个库中使用它,你可能需要添加:
COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;
以避免已经定义的对象相关的链接问题。
我之前使用过libsigc ++,而且非常简单。 我不认为这会影响性能,事实上我学会了在一些地方使用槽而不是函数指针。
有一点需要注意的是,从最近一次(2年前)开始,它被限制在通过连接传递的最多六个参数。
我没有任何经验与助推库,所以我不能帮你在那里。
我已经使用boost信号库,它非常缓慢。 在用升压信号构build物体时,升压信号堆栈消耗了99%的处理器时间。 在信号发出单一的simle插槽也有非常大的开销。 我尝试libsigc ++,它显着更快。 Libsigc ++似乎是非常快速和灵活的创build40000对象与9升压信号和9 libsigc ++信号:
我没有使用libsig ++,但是我已经阅读了它。 我以前的信号和插槽的经验来自Qt和Boost的一些。 如果你没有任何一个可用,那么你可以尝试我自己的embedded式代码(无dynamic内存分配)和“正常”c ++代码(连接时dynamic内存分配)存在的信号和插槽库(ksignals)。
你可以在www.kjellkod.cc/signalandslotsfind它
在页面上,您还可以find一个比较:KSignals Vs Boost信号。
速度虎钳ksignals是非常快速和非常轻巧的代码明智的。 应该是非常容易使用,理解和如果需要修改它。
祝好运Kjell H
另一个选项可以是YSignalSlot 。 我用它。 我觉得这很不错。
这个看起来不错的替代实现呢: http : //endl.ch/content/fastsig ?