【问题标题】:Which C++ signals/slots library should I choose? [closed]我应该选择哪个 C++ 信号/插槽库? [关闭]
【发布时间】:2010-09-26 11:20:41
【问题描述】:

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

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

我读过comparison between libsigc++ and Boost.Signals。我还读到 Boost.Signals 性能不佳。但是,我知道还有其他库,但我仍然不确定应该选择哪个库。

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

【问题讨论】:

  • 是否有任何解决方案标头仅实现?您知道仅使用标准库函数/类型的实现吗?我们正在使用 boost::signals 但想摆脱这个相当大的依赖。
  • 链接已失效...
  • @ManuelSchneid3r 谢谢,幸运的是它仍然可以从archive.org获得

标签: c++ boost signals-slots


【解决方案1】:

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

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

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

【讨论】:

  • Google 代码链接对于您的解决方案已失效。
  • @RegularlyScheduledProgramming 谢谢,我更新了链接到 github,但现在有点过时了。我使用了更现代的东西,但它不是开源的,也不是通用的,它特定于我正在开发的游戏。
【解决方案2】:

Very, very fast event library 在 Gamedev.net 表单上

在分析一些代码时,我一直在 最近工作,我很惊讶 并沮丧地看到 boost::signals 浮动到顶部的函数。为了 你们这些不知情的人, boost::signals 非常有用 可以使用的信号/槽库 在 boost::bind 旁边 基于委托的事件处理,例如 可以在 C# 中看到。它坚固, 功能丰富,灵活。也是, 我学到了,难以置信, 慢得可怕。对于很多人来说 谁使用 boost::signals 这很好 因为他们很少调用事件。 我每帧调用几个事件 每个对象,具有可预测的结果。

所以我自己写了。略少 灵活而有特色。它是 针对每个人的倾向进行了优化 实际使用事件。和事件 调用是十五到八十次 比 boost::signals 更快。

查看链接

【讨论】:

【解决方案3】:

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

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

我说的是 libsigc++2。

【讨论】:

  • 补充。 libsigc++ 有一个额外的项目,它是线程安全的:libSigC++ Extras
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

    COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;
    

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

    【讨论】:

    • 我也更喜欢这个。为了使它与 Clang 和 libc++ 一起工作,我必须应用在 Sourceforge 论坛上找到的一些补丁并自己进行一些调整:github.com/catnapgames/SigSlot
    • 这个好像有内存泄漏。
    【解决方案6】:

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

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

    我对 boost 库没有任何经验,所以我无法为您提供帮助。

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

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

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

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

        祝你好运 问候 谢尔赫

        【讨论】:

          【解决方案9】:

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

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

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-10-31
                • 1970-01-01
                • 1970-01-01
                • 2014-04-17
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多