我想在不使用QT的项目中使用信号/插槽库.我有很基本的要求:
使用任意数量的参数连接两个函数.
信号可以连接到多个插槽.
手动断开信号/插槽连接.
不俗的性能 - 应用程序是基于帧的(即不是基于事件的),我想用在每帧中的连接.
我已经阅读了libsigc ++和Boost.Signals之间的比较.我还读到Boost.Signals的性能不佳.但是,我知道还有其他库,我仍然不确定应该选择哪个库.
有信号/插槽库的建议吗?
首先,尝试使用boost :: signal.在您尝试应用特定情况之前,不要认为它不够快
如果效率不高,FastDelegate可能会满足您的需求吗?(我没试过,但听说在某些情况下这是一个很好的解决方案,其中boost :: signal似乎不适合).
无论如何,如果在你的应用程序中每帧都使用信号,那么用一些更简单的东西替换信号系统可能是值得的,就像一个容纳对象/仿函数的容器,每个帧都会被调用.信号更多地允许立即"事件"管理,而不是使循环周期动态化(允许改变称为每个帧的函数).(我有自己的解决方案(更新:它现在非常陈旧和古老),我在游戏中大量使用,例如我对性能没有任何问题,所以也许类似的东西可以帮助).
Gamedev.net表单上非常非常快速的事件库
在分析我最近一直在研究的一些代码时,我很惊讶并且看到boost :: signals函数浮动到顶部时感到沮丧.对于那些你们谁不知道,提振::信号是一个奇妙的有用信号/插槽库,可以一起推动使用::绑定为基于委托的事件处理,如人们看到的C#.它功能强大,功能强大且灵活.据我所知,这也令人难以置信,非常缓慢.对于很多使用boost :: signals的人来说这很好,因为他们很少调用事件.我每个对象每帧调用几个事件,结果可预测.
所以我写了自己的.略微不那么灵活和功能强大.它针对每个人实际使用事件的方式进行了优化.事件调用比boost :: signals快15到80倍.
看到链接
你所列出的两个是我所知道的唯一两个价值.我所看到的一切都表明libsigc ++在性能方面表现最佳.正如您在比较中看到的那样,有些情况下boost的语法更漂亮,但只是一点点.
我个人使用了libsigc ++并对它很满意.Libsigc ++似乎被更多的项目所使用.快速查看我的包管理器列出了100多个依赖于libsigc ++ 2的项目.仅仅这一点就足以倾斜平衡,特别是考虑到性能优势和缺乏其他显着差异.
我说libsigc ++ 2.
最近继承了一个connect
为我们的项目目标产生过多开销的项目.分析显示在信号中使用了互斥,考虑到我们的信号使用,这是不需要的.根据文档成功替换为虚拟互斥锁.互斥体"速度极慢",所以一定要你需要它.这可能对其他人略读这篇文章很有用.
原版的
typedef boost::signals2::signal_type
新
typedef boost::signals2::signal_type